Autor Beitrag
blafu
Hält's aus hier
Beiträge: 7



BeitragVerfasst: Fr 06.01.06 20:30 
Hallo,

ich moechte einen Pointer, der auf den Anfang eines binaeren Suchbaumes zeigt, an eine Funktion uebergeben bzw. die Funktion soll der Baum rekursiv aufbauen. Nur leider beschwert sich Delphi immer wieder mit der Meldung:

ausblenden Quelltext
1:
2:
3:
[Error] main.pas(53): Incompatible types: 'procedure, untyped pointer or untyped parameter' and 'KnotenPointer'
[Error] main.pas(55): Incompatible types: 'procedure, untyped pointer or untyped parameter' and 'KnotenPointer'
[Fatal Error] BBaum.dpr(5): Could not compile used unit 'main.pas'


Zeile 53 sollte hier Zeile 18 entsprechen.
Und hier der Quellcode:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
TYPE KnotenPointer = ^Knoten;

     Knoten = Record
                Daten : Integer;
                Links, Rechts : KnotenPointer
              End;

VAR Wurzel : KnotenPointer;
    Zahl   : Integer;
procedure WertHinzufuegen(Zeiger : KnotenPointer);
begin
  if (Zeiger = NILthen begin
    New(Zeiger);
    Zeiger^.Daten := Zahl;
    Zeiger^.Links := NIL;
    Zeiger^.Rechts := NIL;
  end else if Zeiger^.Daten >= Zahl then
    Zeiger^.Links := WertHinzufuegen(Zeiger^.Links)
  else if Zeiger^.Daten <= Zahl then
    Zeiger^.Rechts := WertHinzufuegen(Zeiger^.Rechts)
end;


Moderiert von user profile iconChristian S.: Code- durch Delphi-Tags ersetzt
Allesquarks
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 510

Win XP Prof
Delphi 7 E
BeitragVerfasst: Sa 07.01.06 01:48 
Probier mal:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
TYPE KnotenPointer = ^Knoten; 

     Knoten = Record 
                Daten : Integer; 
                Links, Rechts : KnotenPointer 
              End; 

VAR Wurzel : KnotenPointer; 
    Zahl   : Integer; 
procedure WertHinzufuegen(Zeiger : KnotenPointer); 
begin 
  if (Zeiger = NIL) then begin 
    New(Zeiger); 
    Zeiger^.Daten := Zahl; 
    Zeiger^.Links := NIL; 
    Zeiger^.Rechts := NIL; 
  end else if Zeiger^.Daten >= Zahl then 
    Zeiger^.Links := WertHinzufuegen((Zeiger^).Links) 
  else if Zeiger^.Daten <= Zahl then 
    Zeiger^.Rechts := WertHinzufuegen((Zeiger^).Rechts) 
end;
blafu Threadstarter
Hält's aus hier
Beiträge: 7



BeitragVerfasst: Sa 07.01.06 13:13 
Hallo,

danke fuer den Vorschlag aber das fuehrt immer noch zur selben Fehlermeldung.
Motzi
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2931

XP Prof, Vista Business
D6, D2k5-D2k7 je Prof
BeitragVerfasst: Sa 07.01.06 13:25 
user profile iconblafu hat folgendes geschrieben:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
procedure WertHinzufuegen(Zeiger : KnotenPointer);
begin
  {...}
  end else if Zeiger^.Daten >= Zahl then
    Zeiger^.Links := WertHinzufuegen(Zeiger^.Links)
  else if Zeiger^.Daten <= Zahl then
    Zeiger^.Rechts := WertHinzufuegen(Zeiger^.Rechts)
end;

Ich weiß nicht was genau du vorhast, aber WertHinzufügen ist eine Prozedur, gibt also keinen Wert zurück. Du versuchst hier aber den (nicht vorhandenen) Rückgabewert von Werthinzufügen einem KnotenPointer zuzuweisen was logischerweise nicht geht..!

Gruß, Motzi

_________________
gringo pussy cats - eef i see you i will pull your tail out by eets roots!
blafu Threadstarter
Hält's aus hier
Beiträge: 7



BeitragVerfasst: Sa 07.01.06 14:10 
Autsch! Das ist mir jetzt fast peinlich, dass mir das selber nicht aufgefallen ist, entschuldigung.
Was ich machen moechte? Ich moechte einen binaeren Suchbaum mit dieser Funktion erzeugen.
blafu Threadstarter
Hält's aus hier
Beiträge: 7



BeitragVerfasst: Sa 07.01.06 20:04 
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
// Die Funktion traversiert den Baum und guckt, wo der gerade
// eingebene Wert angehangen werden muss.
function WertHinzufuegen(Zeiger : KnotenPointer) : KnotenPointer;
begin
  if (Zeiger = NILthen begin
    New(Zeiger);
    Zeiger^.Daten := Zahl;
    Zeiger^.Links := NIL;
    Zeiger^.Rechts := NIL;
  end else if Zeiger^.Daten >= Zahl then  // Kommt der Wert nach links?
    Zeiger^.Links := WertHinzufuegen(Zeiger^.Links) // solange traversieren bis
                                                    // ein passender Knoten
                                                    // gefunden wurde
  else if Zeiger^.Daten < Zahl then
    Zeiger^.Rechts := WertHinzufuegen(Zeiger^.Rechts);
  WertHinzufuegen := Zeiger;
end;


So funktioniert es jetzt, danke.

Moderiert von user profile iconraziel: Code- durch Delphi-Tags ersetzt