Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi wieder mal die Zeiger (https://www.delphipraxis.net/38924-wieder-mal-die-zeiger.html)

Hansa 26. Jan 2005 12:54

Re: wieder mal die Zeiger
 
Zitat:

Zitat von kiar
hallo,

mit diesem Quelltext:
Delphi-Quellcode:
procedure LoadSettings;
var
  Ini: TIniFile;
  xP : PSettings;
begin
    new(xP);
    Ini:= TIniFile.Create(ExtractFilePath(Paramstr(0)) + 'maxes.ini');
    with Ini, xP^ do
      Begin
             FZa1:= ReadString('Zahlen', 'Zahl1', '10');
             FZa2:= ReadString('Zahlen', 'Zahl2', '10');
             iFk := ReadInteger('Funktionen', 'Funktion', 0);
      end;
   ini.free;
end;
trten erstmal kein Zugriffsverletzungen auf, leider ist der Zugriff auf die procedure von einen anderen form immer noch nicht definiert :pale:

Das ist doch ziemlich klar. 8) xP ist nur lokal definiert und deshalb ist es außerhalb der Prozedur eben nicht definiert --> nur Hyroglyphen.

@Kiar : Man darf natürlich das xP, wenn es schon mit new nur lokal erzeugt wird auch nicht als Wert-Parameter sondern als Var-Parameter übergeben. Da hat einer sich nicht so richtig an das Prinzip der Datenkapselung gehalten. :mrgreen:

Motzi 26. Jan 2005 13:01

Re: wieder mal die Zeiger
 
Hmpf.. warum wird mein Beitrag wiedermal komplett ignoriert? :?
Ich hab doch hier bereits geschrieben woran das liegt und was man dagegen tut!

Kedariodakon 26. Jan 2005 13:04

Re: wieder mal die Zeiger
 
Zitat:

Zitat von Motzi
Hmpf.. warum wird mein Beitrag wiedermal komplett ignoriert? :?
Ich hab doch hier bereits geschrieben woran das liegt und was man dagegen tut!

Ka ich würd für sowas trotzdem lieber ein Object nehmen.. :zwinker:

Bye

Hansa 26. Jan 2005 13:06

Re: wieder mal die Zeiger
 
Aber er hat doch new verwendet. Das ist nicht der Fehler. Leider eben nur für eine lokale Variable. Woher soll denn eine andere Form wissen, was in dem lokalen Xp drinsteht ?

kiar 26. Jan 2005 17:22

Re: wieder mal die Zeiger
 
hallo,

@Kedariodakon - nette Variante werde ich mir mal näher anschauen, also mache dich auf Fragen gefasst :mrgreen:

@Manuel - habe ich doch nicht, habe doch es mit new() gemacht :gruebel:

Das richtige, in meinem Fall ist der Tip von Hansa gewesen , aber halt, er hatte einen anderen Kenntnisstand :mrgreen:

ich habe die aufrufende Procedure geändert, das konntet Ihr nicht wissen.
Delphi-Quellcode:
var
  xP: Psettings;
begin
   LoadSettings;      // alte Variante
   Loadsettings(xP);  // neue Variante
aufgrund der neueren Variante hatte Hansa den Vorschlag gemacht, die LoadSettings mir Var Parameter zu deklarieren. also so:
Delphi-Quellcode:
Loadsettigs(var xP: Psettings);
dies hat erstmal zum Erfolg geführt.

danke an alle Raik

Hansa 26. Jan 2005 19:59

Re: wieder mal die Zeiger
 
Um es noch einmal ganz klar zu sagen: die Gültigkeitsbereiche sind schon wichtig. Und das hat mit Pointer usw. absolut nichts zu tun. Solche Fehler können im Prinzip überall auftreten. Wird eine Variable lokal, also so wie hier innerhalb einer Prozedur deklariert, dann gilt sie nur da. Wird die Prozedur aufgerufen, so bekommt das aufrufende Programm davon nichts mit. Das new innerhalb der Prozedur war also hier auch für die Katz.

Auch der jetzt verwendete VAR-Parameter ist nicht ganz ohne. Dann wird nämlich immer etwas an die aufrufende Stelle zurückgeliefert. Das geht hier ja jetzt anscheinend. Aber wehe, wenn innerhalb der Prozedur der VAR-Parameter keinen Wert zugewiesen bekommt. Dann ist der Effekkt der selbe und auch dann wird nur ein Zufallswert an das Programm zurückgeliefert. Deshalb sollten Var-Parameter immer zuerst initialisiert werden. Auch wenn man sich ganz sicher ist, daß sie auf jeden Fall irgendwo einen Wert erhalten.


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:20 Uhr.
Seite 2 von 2     12   

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