AGB  ·  Datenschutz  ·  Impressum  







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

Problem mit einem Zeiger...

Ein Thema von xZise · begonnen am 25. Jan 2007 · letzter Beitrag vom 26. Jan 2007
Antwort Antwort
Benutzerbild von xZise
xZise

Registriert seit: 3. Mär 2006
Ort: Waldbronn
4.303 Beiträge
 
Delphi 2009 Professional
 
#1

Problem mit einem Zeiger...

  Alt 25. Jan 2007, 22:09
Ich bin neu in die Zeiger eingestiegen und habe folgendes Konstrukt:

Das Formular:
Delphi-Quellcode:
type
  TfrmVariables = class(TForm)
    cbList: TComboBox;
    eName: TEdit;
    eValue: TEdit;
    {...}
    procedure cbListChange(Sender: TObject);
  private
     parser : ^TExCQParser;
  public
    {...}
    procedure setVariables(Data : TExCQParser);
  end;

procedure TfrmVariables.cbListChange(Sender: TObject);
begin
  eName.Text := parser^.Variables.Items[cbList.ItemIndex].Name; // <<<
  eValue.Text := FloatToStr(parser^.Variables.Items[cbList.ItemIndex].Variable.Values[0]);
end;

procedure TfrmVariables.setVariables(Data: TExCQParser);
var
   i : Integer;
begin
  parser := @Data;
   cbList.Clear;

   for i := 0 to parser^.Variables.Length - 1 do
  begin
    cbList.Items.Add(parser^.Variables.Items[i].Name);
  end;
end;
Jetzt tritt in cbListChange (Z. 17) der Fehler auf:
Zitat:
---------------------------
XXXX
---------------------------
Zugriffsverletzung bei Adresse 004626AA in Modul 'XXXX.exe'. Lesen von Adresse 00000030.
---------------------------
OK
---------------------------
Aufruf:
Delphi-Quellcode:
procedure TForm1.Button21Click(Sender: TObject);
begin
  frmVariables.Show;
  frmVariables.setVariables(Parser);
end;
Davor ist die Form nicht sichtbar, und die Funktion "setVariables" führt er ordnungsgemäß aus.

Wenn es nicht am Code liegt, werde ich mich wohl an den Programmierer des Parsers wenden müssen
Fabian
Eigentlich hat MS Windows ab Vista den Hang zur Selbstzerstörung abgewöhnt – mkinzler
  Mit Zitat antworten Zitat
Der_Unwissende

Registriert seit: 13. Dez 2003
Ort: Berlin
1.756 Beiträge
 
#2

Re: Problem mit einem Zeiger...

  Alt 25. Jan 2007, 22:27
Zitat von xZise:
Wenn es nicht am Code liegt, werde ich mich wohl an den Programmierer des Parsers wenden müssen
HI,
von welchem Typ ist denn dieser Parser. Schon klar, dass es sich um TExCqParser handelt, aber ist das eine Klasse oder ein Record? (gehe mal stark von ersterem aus). Wenn es eine Klasse ist, so wirst Du schon mal keinen Zeiger brauchen, da in der Variable Parser eh nur eine Referenz (ein impliziter Zeiger) übergeben wird.

Dein Fehler kann gleich durch verschiedene Dinge entstehen, aber am wahrscheinlichsten liegt es am falschen Index. Du greifst auf die Eigenschaft parser.Variables.Items zu, die dürften sich zwischen 0 und parser.Variables.Length - 1 liegen. Das prüfst Du aber nie. Für den Fall, dass noch kein Eintrag ausgewählt ist, dürfte der Index hier -1 sein und es könnte zu dem Fehler kommen. Dann prüfst Du auch nicht, ob ein Parser zugewiesen wurde (assigned(parser^)).

Ich gehe einfach mal davon aus, dass es sich bei dieser Prozedur um die Ereignisbehandlung eine Komponente handelt? Und genau hier dürfte eben dieses Ereignis schon beim Anzeigen aufgerufen werden (und der ItemIndex muss zu dem Zeitpunkt nicht gültig, der Parser nicht gesetzt sein). Also einfach vorher prüfen und nur wenn Du hier die Korrektheit sicherstellst den Inhalt ausführen.

Gruß Der Unwissende
  Mit Zitat antworten Zitat
Hawkeye219

Registriert seit: 18. Feb 2006
Ort: Stolberg
2.227 Beiträge
 
Delphi 2010 Professional
 
#3

Re: Problem mit einem Zeiger...

  Alt 25. Jan 2007, 22:44
Hallo Fabian,

der Fehler scheint ja heute sehr beliebt zu sein: klick
Bei dir steckt er in der Methode setVariables.

Gruß Hawkeye
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#4

Re: Problem mit einem Zeiger...

  Alt 26. Jan 2007, 07:03
Guten Morgen,

es könnte auch so sein: Das OnChange() der ComboBox wird beim Programmstart automatisch aufgerufen. Darin wird auf die Zeigervariable parser zugegriffen, bevor diese durch den Benutzer (Button21) initialisiert wird.

Delphi-Quellcode:
procedure TfrmVariables.cbListChange(Sender: TObject);
begin
  if Assigned(Parser) then
  begin
    eName.Text := Parser.Variables.Items[cbList.ItemIndex].Name;
    eValue.Text := FloatToStr(Parser.Variables.Items[cbList.ItemIndex].Variable.Values[0]);
  end else {...};
end;
Freundliche Grüße
  Mit Zitat antworten Zitat
Muehle

Registriert seit: 24. Nov 2006
Ort: 92331 Parsberg
24 Beiträge
 
Delphi 2005 Architect
 
#5

Re: Problem mit einem Zeiger...

  Alt 26. Jan 2007, 08:49
Ich glaube dein Problem kommt eher daher, das
du zu deiner Combo keinen Wert ausgewählt hast
-> cbList.ItemIndex=-1
und du bekommst eine Fehlermeldung.

Falls du Probleme mit Zeigern hast sinniere mal über diesen Code :

procedure test(testObj:TProjektLeistung; PtrObj:Pointer);

procedure TIrgendEinForm.test(testObj:TObject;PtrObj:Pointer ) ;

var p1,p2:^TObject;

begin
p1:=PtrObj;
p2:=Pointer(testObj);
assert(p1=p2);
end;

Aufruf erfolgt so :

o1:TObject;

test(o1,Pointer(o1));
G.M.
  Mit Zitat antworten Zitat
Benutzerbild von xZise
xZise

Registriert seit: 3. Mär 2006
Ort: Waldbronn
4.303 Beiträge
 
Delphi 2009 Professional
 
#6

Re: Problem mit einem Zeiger...

  Alt 26. Jan 2007, 11:20
Hi Unwissende, marabu und Muehle..
Ich denke das sollte sich auf alle beziehen:

Zitat von Der_Unwissende:
Zitat von xZise:
Wenn es nicht am Code liegt, werde ich mich wohl an den Programmierer des Parsers wenden müssen
HI,
von welchem Typ ist denn dieser Parser. Schon klar, dass es sich um TExCqParser handelt, aber ist das eine Klasse oder ein Record? (gehe mal stark von ersterem aus). Wenn es eine Klasse ist, so wirst Du schon mal keinen Zeiger brauchen, da in der Variable Parser eh nur eine Referenz (ein impliziter Zeiger) übergeben wird.
Ich war mir nicht sicher Und ein Zeiger auf einen Zeiger sollte doch funzen ^^ (und in setVars funzt es ja auch) Ich werds ändern

Zitat von Der_Unwissende:
Dein Fehler kann gleich durch verschiedene Dinge entstehen, aber am wahrscheinlichsten liegt es am falschen Index. Du greifst auf die Eigenschaft parser.Variables.Items zu, die dürften sich zwischen 0 und parser.Variables.Length - 1 liegen. Das prüfst Du aber nie. Für den Fall, dass noch kein Eintrag ausgewählt ist, dürfte der Index hier -1 sein und es könnte zu dem Fehler kommen. Dann prüfst Du auch nicht, ob ein Parser zugewiesen wurde (assigned(parser^)).
1. Der Typ der Liste ist, dass man dort nichts eintippen kann... d.h. es sind nur die Einträge möglich die in "setVars" gesetzt wurden. Und dazwischen habe ich eigentlich keine Funktion aufgerufen.
2. Ich werde mir dass absichern (<length> etc.)

Zitat von Der_Unwissende:
Ich gehe einfach mal davon aus, dass es sich bei dieser Prozedur um die Ereignisbehandlung eine Komponente handelt? Und genau hier dürfte eben dieses Ereignis schon beim Anzeigen aufgerufen werden (und der ItemIndex muss zu dem Zeitpunkt nicht gültig, der Parser nicht gesetzt sein). Also einfach vorher prüfen und nur wenn Du hier die Korrektheit sicherstellst den Inhalt ausführen.
Also es ist der Code der Listbox (cbList), aber ich habe oben ja geschrieben, dass ich es absichern werde ^^

PS: Kanns ggf. daran liegen, dass diese Form, nicht die aufrufende Form kennt?

MfG
xZise

[edit]sry Hawkeye ^^ Ganz übersehen
Zitat von Hawkeye219:
Hallo Fabian,

der Fehler scheint ja heute sehr beliebt zu sein: klick
Bei dir steckt er in der Methode setVariables.

Gruß Hawkeye
Also wie löst man das, dann?
Zitat von Hawkeye219:
Hallo,

der Fehler dürfte hier stecken:

Delphi-Quellcode:
procedure TObjList.Add(AItem: TObject);
begin
  if FLength = FCapacity then
    Grow;
  FItems^[FLength] := PObject(@AItem);
  Inc(FLength);
end;
Du speicherst die Adresse einer lokalen Variablen (nämlich des Parameters) in der Liste. Diese Adresse ist nach dem Verlassen der Routine ungültig.

Gruß Hawkeye
[/edit]

[edit]Boar bin ich doof ^^ Ich muss doch nur die Instanzvariable speichern [/edit]
Fabian
Eigentlich hat MS Windows ab Vista den Hang zur Selbstzerstörung abgewöhnt – mkinzler
  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 02:59 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