Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Pointer an Funktion uebergeben


blafu - Fr 06.01.06 20:30
Titel: Pointer an Funktion uebergeben
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:


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:


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 - Sa 07.01.06 01:48

Probier mal:

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 - Sa 07.01.06 13:13

Hallo,

danke fuer den Vorschlag aber das fuehrt immer noch zur selben Fehlermeldung.


Motzi - Sa 07.01.06 13:25
Titel: Re: Pointer an Funktion uebergeben
user profile iconblafu hat folgendes geschrieben:

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


blafu - 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 - Sa 07.01.06 20:04


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