Autor Beitrag
Bestzeller
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 48



BeitragVerfasst: Mo 08.06.09 21:48 
Hi nochmal,
Die Funktion funktioniert manchmal nicht, aber in unterschiedlichen Fällen.
Wird zum Beispiel 202 und 31 als String verglichen, sagt er mir , dass 202<31 ist
, währendessen beim Vergleich von 202 und 0 202 > 0 ist.
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
function TBaum.suchen(var w:pzeiger;row,counter:integer):Tresults;
Begin
If nName=w^.data then
 begin
  result.t:=counter;
  result.r:=row;
 end else
  If nName < w^.data then
   If w.links <> nil then result:=suchen(w.links,row,counter+1//202 < 31....
    else exit
  else
   If w.rechts <> nil then result:=suchen(w.rechts,row+1,counter+1)
    else exit;
end;
Gausi
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 8554
Erhaltene Danke: 480

Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
BeitragVerfasst: Mo 08.06.09 22:04 
Wenn 202 und 31 Strings sind, dann ist 202 kleiner 31 genauso richtig, wie "Autobahn" kleiner als "Zoo" ist, weil 2 vor 3 kommt, so wie A vor Z kommt ;-).

Wenn du mit Zahlen arbeitest, solltest du den Typ auch als Integer deklarieren, dann funktioniert das auch richtig.

_________________
We are, we were and will not be.
Bestzeller Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 48



BeitragVerfasst: Mo 08.06.09 22:08 
Hm..will aber beides Eingeben können, sowohl Namen als auch Zahlen. Aber Danke für den Hinweis.^^
//Edit: Hab es jetzt mit integer gemacht, aber irgentwas stimmt immernoch nicht an der Funktion.
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
function TBaum.suchen(var w:pzeiger;row,counter:integer):Tresults;
var zahl,bzahl:integer;
Begin
zahl:=strtoint(nName);Bzahl:=strtoint(w^.data);
If Zahl=Bzahl then
 begin
  If w^.z=indiz then
    begin
     result.t:=counter;
     result.r:=row;
    end else
     result:=suchen(w.links,row,counter+1);
 end else
  If Zahl < Bzahl then
   If w^.links <> nil then result:=suchen(w.links,row,counter+1)//an dieser Zeile geht er einfach raus
    else exit
  else
   If w.rechts <> nil then result:=suchen(w.rechts,row+1,counter+1)
    else exit;
end;
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19341
Erhaltene Danke: 1752

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Di 09.06.09 00:55 
Dann wird da w^.links nil sein, müsstest du mal schauen. :nixweiss:
Wenn du in der Zeile mit dem Debugger bist, musst du ja nur die Maus drüberhalten, dann siehst du den Wert. Bei alten Delphiversionen bis D7 musst du den Ausdruck markieren und Strg + F7 drücken.

Was soll das else exit? :gruebel:
Wie wäre es wie ich es in deinem letzten Thread geschrieben hatte ganz einfach mit begin..end?
oki
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 40

Win XP
Delphi 2007 Prof
BeitragVerfasst: Di 09.06.09 07:42 
Wenn du beides (strings und Zahlen) vergleichen willst, dann prüfe ob beide Werte in Integer oder Real konvertierbar sind. Ist dies möglich, so unterstellst du, dass Zahlen verglichen werden sollen und machst den Vergleich auf Real oder Integer. Ist das nicht möglich, so vergleichst du die Strings.

Gruß oki

_________________
42
Bestzeller Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 48



BeitragVerfasst: Di 09.06.09 18:23 
Danke euch, habs jetzt hinbekommen. Funktioniert immoment nur für Worte und gibt die Tiefe des gesuchten Elements, sowie
die Position in der Tiefe zurück. Falls Jemand damit noch was Anfangen kann:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
 
function TBaum.suchen(var w:pzeiger; row:string; counter:integer):Tresults;

Begin
 If nName=w^.data then
 begin
   If w^.z=indiz then
     begin
      result.t:=counter;
      result.r:=bintoint(row)+1;
     end else
     begin
      result:=suchen(w.links,row+'0',counter+1);
     end;
 end else // If nName
 begin
   If nName < w^.data then
     begin
     If w^.links <> nil then result:=suchen(w.links,row+'0',counter+1)
     end
   else
     begin
     If w.rechts <> nil then result:=suchen(w.rechts,row+'1',counter+1);
     end;
 end// If nName

end;