AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

wieder mal die Zeiger

Ein Thema von kiar · begonnen am 26. Jan 2005 · letzter Beitrag vom 26. Jan 2005
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von kiar
kiar

Registriert seit: 2. Aug 2003
Ort: Aschersleben
1.362 Beiträge
 
Delphi 5 Professional
 
#1

wieder mal die Zeiger

  Alt 26. Jan 2005, 09:45
hallo,

habe folgenden Record:
Delphi-Quellcode:
type
   TSettings = record
     FZa1 : String;
     FZa2 : String;
     iFk : Integer;
     iCo : Integer;
   end;
type PSettings = ^TSettings;
und den Zeiger, auf diesen Record.

mit der folgenden Routine versuche ich den Record mit Daten aus einer Inidatei zu füllen
Delphi-Quellcode:
procedure LoadSettings;
var
  Ini: TIniFile;
  xP : PSettings;
begin
    GetMem(xP, sizeOf(TSettings));
    Ini:= TIniFile.Create(ExtractFilePath(Paramstr(0)) + 'maxes.ini');
    with Ini do
      Begin
        with xP^ do
          begin
             FZa1:= ini.ReadString('Zahlen', 'Zahl1', '10');
             FZa2:= ini.ReadString('Zahlen', 'Zahl2', '10');
             iFk := ini.ReadInteger('Funktionen', 'Funktion', 0);
          end;
      end;
   ini.free;
end;
Leider bringt mir der Aufruf , immer eine Zugriffsverletzung.

Die Frage ist nun, was ist falsch an dieser Geschichte?

Danke Raik

edit : Die Schutzverletzung kommt beim Zugriff auf FZa2.
verhältnisse die einem nicht passen,
muss man verändern oder verlassen
  Mit Zitat antworten Zitat
Benutzerbild von Sharky
Sharky

Registriert seit: 29. Mai 2002
Ort: Frankfurt
8.252 Beiträge
 
Delphi 2006 Professional
 
#2

Re: wieder mal die Zeiger

  Alt 26. Jan 2005, 10:05
Hai kiar,

scheint wohl am Typ String liegen. Wenn Du z.B. ShortString verwendest geht es. Frage mich aber nicht warum
Stephan B.
"Lasst den Gänsen ihre Füßchen"
  Mit Zitat antworten Zitat
Benutzerbild von Shaman
Shaman

Registriert seit: 2. Nov 2003
Ort: Schweiz
407 Beiträge
 
Turbo Delphi für Win32
 
#3

Re: wieder mal die Zeiger

  Alt 26. Jan 2005, 10:07
Hoi

Probier mal New anstatt GetMem.

Gruss
Shaman
Daniel Pauli
Looking for answers from the great beyond
  Mit Zitat antworten Zitat
st-matze

Registriert seit: 15. Mai 2004
6 Beiträge
 
#4

Re: wieder mal die Zeiger

  Alt 26. Jan 2005, 10:09
für dynamische strings werden nur 4byte oder so reserviert

versuchs mal so

Delphi-Quellcode:
 type
   TSettings = record
     FZa1 : String[100]; //kann natürlich auch ne andere zahl ausser 100 sein
     FZa2 : String[100];
     iFk : Integer;
     iCo : Integer;
   end;
  Mit Zitat antworten Zitat
Benutzerbild von kiar
kiar

Registriert seit: 2. Aug 2003
Ort: Aschersleben
1.362 Beiträge
 
Delphi 5 Professional
 
#5

Re: wieder mal die Zeiger

  Alt 26. Jan 2005, 10:21
hallo,

Habe ich schon gemacht und es klappt, leider ist der Zugriff von einer anderen Form auch nicht befriedigend.

wenn ich jetzt
Delphi-Quellcode:
var
  a:integer;
  xp:Psettings;
begin
     
    LoadSettings;
    Edit1.Text :=xp^.FZa1;
    Edit2.Text :=xp^.FZa2;
der Pointer stimmt, einmal in LoadSettings und in oben aufgeführter Procedure. Leider sind die Werte in FZa1 und Fza2 nicht nachvollziehbar und schwirren in den Weiten meines Rechners herum.


raik
verhältnisse die einem nicht passen,
muss man verändern oder verlassen
  Mit Zitat antworten Zitat
Benutzerbild von Motzi
Motzi

Registriert seit: 6. Aug 2002
Ort: Wien
598 Beiträge
 
Delphi XE2 Professional
 
#6

Re: wieder mal die Zeiger

  Alt 26. Jan 2005, 10:52
Das Problem ist wie bereits angesprochen der String bzw. das interne String-Handling. GetMem initialisiert den reservierten Speicher nicht, d.h. es können irgendwelche zufälligen Daten drinnenstehen und die String-Felder enthalten daher willkürliche Adressen. Weißt du einem dieser Strings nun einen neuen Inhalt zu, so versucht das interne String-Handling den Referenzzähler des "alten" Strings zu dekrementieren, da aber der String ja nicht wirklich auf einen String zeigt sondern eben nur eine willkürliche Adresse enthält endet das in einer Zugriffsverletzung.

Lösungen:
1) New verwenden (Compiler-Magic nimmt alle nötigen Initialisierungen vor)
2) AllocMem verwenden (ruft GetMem auf und initialisiert den Speicher anschließend mit FillChar)
3) selber den Speicher mit ZeroMemory oder FillChar initialisieren
4) die procedure Initialize verwenden...
Manuel Pöter
  Mit Zitat antworten Zitat
Benutzerbild von kiar
kiar

Registriert seit: 2. Aug 2003
Ort: Aschersleben
1.362 Beiträge
 
Delphi 5 Professional
 
#7

Re: wieder mal die Zeiger

  Alt 26. Jan 2005, 11:16
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


erstmal Danke an Alle
verhältnisse die einem nicht passen,
muss man verändern oder verlassen
  Mit Zitat antworten Zitat
Benutzerbild von Sharky
Sharky

Registriert seit: 29. Mai 2002
Ort: Frankfurt
8.252 Beiträge
 
Delphi 2006 Professional
 
#8

Re: wieder mal die Zeiger

  Alt 26. Jan 2005, 11:27
Zitat von kiar:
... leider ist der Zugriff auf die procedure von einen anderen form immer noch nicht definiert ...
Hast Du die Funktionsdeklaration auch im Interface Teil deiner Unit eingetragen?
Stephan B.
"Lasst den Gänsen ihre Füßchen"
  Mit Zitat antworten Zitat
Benutzerbild von kiar
kiar

Registriert seit: 2. Aug 2003
Ort: Aschersleben
1.362 Beiträge
 
Delphi 5 Professional
 
#9

Re: wieder mal die Zeiger

  Alt 26. Jan 2005, 11:41
hallo Sharky,

ich sehe ja den Zeiger, die Adresse ist in beiden Fällen die gleiche.

zb: wird in FZa1 = '10' geschrieben.

der Aufruf aus der anderen Form, zeigt mir aber, nur Datenmüll an?

raik
verhältnisse die einem nicht passen,
muss man verändern oder verlassen
  Mit Zitat antworten Zitat
Benutzerbild von Kedariodakon
Kedariodakon

Registriert seit: 10. Sep 2004
Ort: Mönchengladbach
833 Beiträge
 
Delphi 7 Enterprise
 
#10

Re: wieder mal die Zeiger

  Alt 26. Jan 2005, 11:54
Warum nimmst du überhaupt ein Record?
für was gibts Objecte?

Beispiel:

Delphi-Quellcode:
Unit Unit1;


Interface


Uses   SysUtils, IniFiles;


Type
   TSettings_Base = Class
   Private
      { Private-Deklarationen }
      FiCo: Integer;
    FiFk: Integer;
    FFZa1: String;
      FFZa2: String;
   Public
      { Public-Deklarationen }
      Function   Load:   Boolean;   Virtual;   Abstract;
      Property   FZa1:   String   Read FFZa1;
      Property   FZa2:   String   Read FFZa2;
      Property   iFk:   Integer   Read FiFk;
      Property   iCo:   Integer   Read FiCo;
   End;

   TSettings_Ini   = Class( TSettings_Base )
   Public
      { Public-Deklarationen }
      Function   LoadSettings:   Boolean;
   End;


Implementation



Function TSettings_Ini.LoadSettings:   Boolean;
Var   InI:   TIniFile;
Begin
   Result   := False;
   InI         := Nil;
   Try
      Try
         Ini         := TIniFile.Create( ExtractFilePath( Paramstr( 0 ) ) + 'maxes.ini' );
         FFZa1      := InI.ReadString(   'Zahlen',         'Zahl1',         '10'   );
         FFZa2      := InI.ReadString(   'Zahlen',         'Zahl2',         '10'   );
         FiFk      := InI.ReadInteger(   'Funktionen',   'Funktion1',   0         );
         FiCo      := InI.ReadInteger(   'Funktionen',   'Funktion2',   0         );
         Result   := True;
      Finally
         If Assigned( InI ) Then FreeAndNil( InI );
      End;
   Except
      On Error: Exception Do Begin
         Error.Message   := 'LoadSettings - Error:'#13#10 + Error.Message;
         Raise;
      End;
   End;
End;



End.
So in der Art würd ich das machen...


Es lebe die Objectorientiertheit

Bye
Christian
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 00:10 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