![]() |
Brett vorm Kopf: Wo ist der Wert meines Pointers?
"00:40 Uhr... Weißt du, wo dein Pointer ist?"
Ich bekomme meinen Pointer nicht mehr aus der Liste. Diese Funktion soll einen Index erstellen, bestehend aus " ![]()
Delphi-Quellcode:
Nun möchte ich mir über den ICAO-Code Infos über einen Flughafen ausgeben lassen. Das soll so funktionieren:
procedure TWeatherDatabase.CreateAirportIndex;
var i,s: Integer; pi: Pointer; tmp: String[4]; fAirport: TAirport; begin Reset(fAirprtsFile); s := 33; for i := 0 to FileSize(fAirprtsFile) - 1 do begin Read(fAirprtsFile, fAirport); tmp := fAirport.ICAO; pi := @s; fAirportIndizes.Add(tmp, pi); end; end;
Delphi-Quellcode:
Aber, egal was ich mache (die beiden Funktionen oben sind jetzt mal eine kurze Momentaufnahme, hab schon zig Variationen durch), ich bekomme nicht den Wert 33 raus. Entweder habe ich ein Brett vorm Kopf (Eiche massiv), oder ich mache unbewusst was falsch (was im Nachhinein betrachtet irgendwie dasselbe ist).
function TWeatherDatabase.GetAirportInfo(ICAO: String): TAirport;
var Airport : TAirport; pIndex: Pointer; Index: Integer; begin if fAirportIndizes.Find(ICAO, pIndex) then begin Index := Integer(pIndex^); Seek(fAirprtsFile, Index); Read(fAirprtsFile, Airport); Result := Airport; end; end; Sieht jemand meinen Fehler? Ich bin eigentlich der Meinung, dass ich alles nach Delphi-Hilfe gemacht habe... |
Re: Brett vorm Kopf: Wo ist der Wert meines Pointers?
Delphi-Quellcode:
der bleibt in deiner Funktion zurück :zwinker:
var
s: Integer; begin s := 33; pi := @s; @ zeigt ja auf die Variable in der Funktion versuch es mal ohne das @ und dann natürlich (ohne dem Gegenteil von @ ... also ohne ^) :angel2: Index := Integer(pIndex); |
Re: Brett vorm Kopf: Wo ist der Wert meines Pointers?
Delphi-Quellcode:
und
fAirportIndizes.Add(tmp, PInteger(s));
Delphi-Quellcode:
So tuts. Und ich sitz da ne halbe Stunde drüber. Argh.... :wall: Jetzt weiß ich wenigstens um die Tücken des @-Parameter Operators. Danke. ;)
Index := Integer(pIndex);
|
Re: Brett vorm Kopf: Wo ist der Wert meines Pointers?
Nur so zur Sicherheit. Mit:
Code:
übergibst du, statt einem Zeiger auf s, den akt Wert von s (also den Integer-Wert) und sagst dem Compiler, dass dies schon OK.
fAirportIndizes.Add(tmp, PInteger(s));
Mit:
Code:
sagst du dem Compiler, das der Wert der Variablen pIndex gar kein Zeiger ist, sondern ein Integer-Wert. Das funktioniert, weil ein Integer auch nur 32 Bit belegt, also in den Speicherplatz für einen Pointer reinpasst.
Index := Integer(pIndex);
In deinem ursprünglichen Ansatz
Code:
gab es dann noch das Problem, dass die Variable s, da innerhalb der Procedure deklariert, auf dem Stack liegt. Der Zeiger pi referenzierte also eine Addr. im Stack, die nach dem verlassen der Procedur auf jeden Fall ungültig war.
pi := @s;
fAirportIndizes.Add(tmp, pi); PMM |
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:54 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz