AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi Brett vorm Kopf: Wo ist der Wert meines Pointers?
Thema durchsuchen
Ansicht
Themen-Optionen

Brett vorm Kopf: Wo ist der Wert meines Pointers?

Ein Thema von Mithrandir · begonnen am 18. Jun 2009 · letzter Beitrag vom 19. Jun 2009
Antwort Antwort
Benutzerbild von Mithrandir
Mithrandir
(CodeLib-Manager)

Registriert seit: 27. Nov 2008
Ort: Delmenhorst
2.379 Beiträge
 
#1

Brett vorm Kopf: Wo ist der Wert meines Pointers?

  Alt 18. Jun 2009, 23:39
"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 "Bei Google suchenICAO-Code => Datensatz-ID". Dazu nutze ich die csDictionary.pas von alzaimar. Zum Testen habe ich den festen Wert "33" vorgegeben:

Delphi-Quellcode:
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;
Nun möchte ich mir über den ICAO-Code Infos über einen Flughafen ausgeben lassen. Das soll so funktionieren:

Delphi-Quellcode:
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;
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).

Sieht jemand meinen Fehler? Ich bin eigentlich der Meinung, dass ich alles nach Delphi-Hilfe gemacht habe...
米斯蘭迪爾
"In einer Zeit universellen Betruges wird das Aussprechen der Wahrheit zu einem revolutionären Akt." -- 1984, George Orwell
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.166 Beiträge
 
Delphi 12 Athens
 
#2

Re: Brett vorm Kopf: Wo ist der Wert meines Pointers?

  Alt 18. Jun 2009, 23:53
Delphi-Quellcode:
var
  s: Integer;
begin
  s := 33;

    pi := @s;
der bleibt in deiner Funktion zurück

@ zeigt ja auf die Variable in der Funktion

versuch es mal ohne das @


und dann natürlich (ohne dem Gegenteil von @ ... also ohne ^)
Index := Integer(pIndex);
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Benutzerbild von Mithrandir
Mithrandir
(CodeLib-Manager)

Registriert seit: 27. Nov 2008
Ort: Delmenhorst
2.379 Beiträge
 
#3

Re: Brett vorm Kopf: Wo ist der Wert meines Pointers?

  Alt 18. Jun 2009, 23:58
fAirportIndizes.Add(tmp, PInteger(s)); und
Index := Integer(pIndex); So tuts. Und ich sitz da ne halbe Stunde drüber. Argh.... Jetzt weiß ich wenigstens um die Tücken des @-Parameter Operators. Danke.
米斯蘭迪爾
"In einer Zeit universellen Betruges wird das Aussprechen der Wahrheit zu einem revolutionären Akt." -- 1984, George Orwell
  Mit Zitat antworten Zitat
PMM

Registriert seit: 17. Feb 2005
101 Beiträge
 
#4

Re: Brett vorm Kopf: Wo ist der Wert meines Pointers?

  Alt 19. Jun 2009, 08:35
Nur so zur Sicherheit. Mit:
Code:
fAirportIndizes.Add(tmp, PInteger(s));
übergibst du, statt einem Zeiger auf s, den akt Wert von s (also den Integer-Wert) und sagst dem Compiler, dass dies schon OK.
Mit:
Code:
Index := Integer(pIndex);
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.

In deinem ursprünglichen Ansatz
Code:
pi := @s;
fAirportIndizes.Add(tmp, pi);
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.
PMM
  Mit Zitat antworten Zitat
Antwort Antwort


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 19:27 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