AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Rückgabewert der Funktion undefiniert

Ein Thema von trebor90 · begonnen am 6. Jun 2009 · letzter Beitrag vom 16. Jun 2009
Antwort Antwort
Seite 1 von 3  1 23      
trebor90

Registriert seit: 28. Mai 2009
43 Beiträge
 
#1

Rückgabewert der Funktion undefiniert

  Alt 6. Jun 2009, 14:18
Hallo Delphianer(innen)!

Ich weiß, ich habe schon öfter im Forum Themen zu folgender bekannter Fehlermeldung gehört: "Rückgabewert der Funktion FormX.Funktion könnte undefiniert sein".
Aber ich komme echt nicht weiter - ich zerbreche mir über den paar Zeilen Code schon Wochen den Kopf:

Delphi-Quellcode:
//Dateien des gleichen Pfads schon vorhanden?
function TForm1.schonda(s:string):boolean;
var i,a:integer;
begin
a:=listbox1.items.count;
for i:=1 to a do
  if (s=listbox1.items[i-1]) then
    begin
      result:=true;
      break;
    end
  else result:=false;
end;
Schonda soll prüfen, ob ein Element s:string (hier: eine Datei) in einer Listbox schon vorhanden ist.
Ich ziehe Dateien per Drag'n'Drop hinein und es wäre ja sichtbar dumm, wenn zweimal der gleiche Dateiname in der Listbox vorhanden ist.
Schonda prüft also bevor eine Datei der Listbox hinzugefügt wird ...


Hoffe, ihr könnt mir helfen - RObert
"Es amüsiert mich immer wieder, wenn Menschen all ihr Unglück dem Schicksal, dem Zufall oder dem Verhängnis zuschreiben, während sie ihre Erfolge oder ihr Glück mit ihrer eigenen Klugheit, ihrem Scharfsinn oder ihrer Einsicht begründen."
  Mit Zitat antworten Zitat
quendolineDD

Registriert seit: 19. Apr 2007
Ort: Dresden
781 Beiträge
 
Turbo Delphi für Win32
 
#2

Re: Rückgabewert der Funktion undefiniert

  Alt 6. Jun 2009, 14:21
Wenn die Schleife nicht durchlaufen wird, wird kein Result gesetzt. Denk mal darüber nach, was passiert, wenn 0 Elemente in der Listbox sind.
Außerdem gab es doch bei Listbox die Funktion .IndexOf[].

Edit:
Dann würde ich lieber eine while- oder repeat-Schleife nehmen, anstatt mit einem break zu arbeiten. Und das false kannst du ja schon ganz am Anfang setzen und nur noch bei einem Fund den Rückgabewert auf true ändern.
Lars S.
Wer nicht mit der Zeit geht, geht mit der Zeit.
  Mit Zitat antworten Zitat
Benutzerbild von mirage228
mirage228

Registriert seit: 23. Mär 2003
Ort: Münster
3.750 Beiträge
 
Delphi 2010 Professional
 
#3

Re: Rückgabewert der Funktion undefiniert

  Alt 6. Jun 2009, 14:26
Zitat von quendolineDD:
Edit:
Dann würde ich lieber eine while- oder repeat-Schleife nehmen, anstatt mit einem break zu arbeiten. Und das false kannst du ja schon ganz am Anfang setzen und nur noch bei einem Fund den Rückgabewert auf true ändern.
Bei einer for-Schleife wird auf Items.Count aber nur einmal zugegriffen und nicht bei jeder Iteration (falls das Wichtig sein sollte...).
David F.

May the source be with you, stranger.
PHP Inspection Unit (Delphi-Unit zum Analysieren von PHP Code)
  Mit Zitat antworten Zitat
quendolineDD

Registriert seit: 19. Apr 2007
Ort: Dresden
781 Beiträge
 
Turbo Delphi für Win32
 
#4

Re: Rückgabewert der Funktion undefiniert

  Alt 6. Jun 2009, 14:29
Heißt doch nicht, das hier jedes mal auf .Count zugegriffen werden muss.
Lars S.
Wer nicht mit der Zeit geht, geht mit der Zeit.
  Mit Zitat antworten Zitat
Benutzerbild von mirage228
mirage228

Registriert seit: 23. Mär 2003
Ort: Münster
3.750 Beiträge
 
Delphi 2010 Professional
 
#5

Re: Rückgabewert der Funktion undefiniert

  Alt 6. Jun 2009, 14:33
Zitat von quendolineDD:
Heißt doch nicht, das hier jedes mal auf .Count zugegriffen werden muss.
Hm, dasn Argument
Wobei man sich für sehr große Dateilisten eh nen besseren Such-Algo (ggf. auch nicht mit TStringList) überlegen könnte
David F.

May the source be with you, stranger.
PHP Inspection Unit (Delphi-Unit zum Analysieren von PHP Code)
  Mit Zitat antworten Zitat
nat

Registriert seit: 10. Nov 2005
216 Beiträge
 
RAD-Studio 2009 Pro
 
#6

Re: Rückgabewert der Funktion undefiniert

  Alt 6. Jun 2009, 14:54
wenn man es sich ganz einfach (und übersichtlich) machen will, könnte man die dateien
auch in ner eigenen StringList "mitspeichern" und dann halt überMyStringList.Duplicates := dupIgnore; duplikate ignorieren. bei sehr großen dateilisten ist das aber vll nicht unbedingt die optimalste variante
(wegen dem ständigen hin und her kopieren ums in der listbox anzuzeigen) bei ner handvoll einträgen aber sicher
recht kompfortabel und ausreichend!
  Mit Zitat antworten Zitat
trebor90

Registriert seit: 28. Mai 2009
43 Beiträge
 
#7

Re: Rückgabewert der Funktion undefiniert

  Alt 6. Jun 2009, 15:50
Hi!

@quendolineDD:
<< 1.) Wenn die Schleife nicht durchlaufen wird, wird kein Result gesetzt.
2.) Denk mal darüber nach, was passiert, wenn 0 Elemente in der Listbox sind. Smile
3.) Außerdem gab es doch bei Listbox die Funktion .IndexOf[].

Edit:
4.) Dann würde ich lieber eine while- oder repeat-Schleife nehmen, anstatt mit einem break zu arbeiten.
5.) Und das false kannst du ja schon ganz am Anfang setzen und nur noch bei einem Fund den Rückgabewert auf true ändern.
>>

Tut mir Leid, dass ich deinen Beitrag so zerpflücken und abändern muss, aber ich habe ansonsten keine Chance, darauf geregelt zu antworten ...:
1.) Warum sollte die Schleife nicht durchlaufen werden? Sie wir immer durchlaufen. (Die Funktion wird nicht nur einmal bei Drag'n'Drop ausgeführt, sondern für jede einzelne Datei).

Delphi-Quellcode:
//Fügt Datei aus Listbox4 hinzu, wenn Schonda=false also Datei noch nicht da; prüft jede einzelne Datei mit jedem einzelnen Element
for r:=1 to (listbox1.items.count) do
  if schonda(listbox4.items[r-1])=false then
    listbox1.items.add(listbox4.items[r-1]);
2.) Was ist daran so schlimm, wenn 0 Elemente vorhanden sind? Dann durchläuft er die Schleife nicht. Und das ist ja nicht schlimm. Sind ja eh keine Elemente da ...
3.) Ob ich nun (s=listbox1.items[i-1]) oder (listbox1.items.indexof[...]=listbox1.items[i-1]) ist doch egal ...
4.) Ist doch egal ob ich breake oder ob ich mit einer geregelten Bedingung eine andere Wiederholungsstruktur verlasse ...
5.) Das false brauche ich nicht zu setzen, da boolesche Variablen etc. nicht initialisert werden müssen; sie haben als Startwert immer false ...

Mir geht es auch weniger darum, möglichst wenig Rechenaufwand oder so einzubringen oder Die Funktion mitb anderen Befehlen schöner aussehen zu lassen ... Ich sehe das "Loch" in meiner Funktion nicht. Wenn mein Result=undefiniert sein kann, dann muss es also einen Programmierpfad geben, indem Result nicht klar definiert wird, sich also der Startwert nicht ändert. Und das verstehe ich nicht. Durch mein If-Else sage ich doch genau, entweder so oder so. Ich sage doch in einer bestimmten Bedingung nicht nichts ... Versteht ihr mich?!


Gruß - RObert
"Es amüsiert mich immer wieder, wenn Menschen all ihr Unglück dem Schicksal, dem Zufall oder dem Verhängnis zuschreiben, während sie ihre Erfolge oder ihr Glück mit ihrer eigenen Klugheit, ihrem Scharfsinn oder ihrer Einsicht begründen."
  Mit Zitat antworten Zitat
Benutzerbild von jfheins
jfheins

Registriert seit: 10. Jun 2004
Ort: Garching (TUM)
4.579 Beiträge
 
#8

Re: Rückgabewert der Funktion undefiniert

  Alt 6. Jun 2009, 15:55
Wenn die obere Grenze der Schleife kleiner ist als die untere Grenze wird die Schleife nicht durchlaufen. Falls also keine Elemente in der Listbox sind (was theoretisch ja passieren könnte) wird die Schleife nicht durchlaufen und damit das if-Statement ebensowenig.

Also eher so:
Delphi-Quellcode:
function TForm1.schonda(s:string):boolean;
var i,a:integer;
begin
result:=false;
a:=listbox1.items.count;
for i:=1 to a do
  if (s=listbox1.items[i-1]) then
    begin
      result:=true;
      break;
    end
end;
  Mit Zitat antworten Zitat
Satty67

Registriert seit: 24. Feb 2007
Ort: Baden
1.566 Beiträge
 
Delphi 2007 Professional
 
#9

Re: Rückgabewert der Funktion undefiniert

  Alt 6. Jun 2009, 16:05
Wenn die Liste leer ist, dann ist a = 0. Bei a = 0 wird die Schleife nicht durchlaufen und somit auch Result nie ein Wert von Deinem Code zugewiesen. In dem Fall gibt Result den Wert zurück, mit dem Delphi die Variable initialisiert hat.

Das hier ein Wert zurückgegeben wird, den Delphi entschieden hat und nicht Dein Code, davor wirst Du gewarnt.

Wie gesagt, Delphi weis nicht, ob die Liste nie leer sein kann. Delphi weis auch nicht, ob es OK ist, das Result = False bei leerer Liste.

PS: Ist es überhaupt garantiert, das Boolean immer mit False initialisiert werden?
  Mit Zitat antworten Zitat
nat

Registriert seit: 10. Nov 2005
216 Beiträge
 
RAD-Studio 2009 Pro
 
#10

Re: Rückgabewert der Funktion undefiniert

  Alt 6. Jun 2009, 16:12
zu 3) ich glaub quendolineDD meinte, dass du dir die ganze funktion durch einen aufruf von indexof sparen könntest
vorhanden := Listbox1.Items.IndexOf(Filename) >= 0;
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:55 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz