Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   array-variablen können nicht gesetzt werden (https://www.delphipraxis.net/159980-array-variablen-koennen-nicht-gesetzt-werden.html)

paku 21. Apr 2011 07:52

Delphi-Version: 5

array-variablen können nicht gesetzt werden
 
Moin community,

ich habe folgendes Problem, dass mich schon seit Tagen verzweifeln lässt:

ich habe ein Array [1..34] vom typ integer als Variable einer Klasse (TBaum), dass ich nun mit Daten (Integer-Zahlen natürlich) füttern möchte!

Delphi-Quellcode:
type TBaum = class
    private
      FBlatt array [1..34] of integer;  
    public
      constructor create;
      end;

implementation

constructor TBaum.create;
var I: integer;
begin
  inherited create;
  for I:=1 to 34 do
    FBlatt[I] := I;   //Hier tritt die exception nur an Position 12 und 13 auf...
end;
Jetzt mein Problem:

wenn ich nun über eine for-schleife (von 1 bis 34) das array immer mit dem aktuellen wert des zählers in der for-schleife fülle, bekomme ich eine exception!
Einiges herumexperimentieren mit showmessages hat mich herausgefinden lassen, dass diese exception nur bei dem schreiben in dem 12. und 13. feld des arrays auftritt! Auslesen dagegen kann ich das array ohne probleme!

woran liegts? gibts da iwie einen Lösungsansatz? Ich habe das Programm auf mehreren Rechnern getestet, überall das gleiche! hats was mit dem Betriebsystem zu tun (Delphi 7 unter Vista 64/ Win 7 32)?

Apropos: diese exception tritt nicht auf, wenn ich unter Button1.click ein array beschreiben lasse! Also muss es iwie in der Verbindung mit der Klasse liegen... oder?

Danke schonmal für eure Antworten ;)

himitsu 21. Apr 2011 07:56

AW: array-variablen können nicht gesetzt werden
 
Wie erzeugst du dein TBaum-Objekt?

Satty67 21. Apr 2011 07:59

AW: array-variablen können nicht gesetzt werden
 
Da dein Code (wegen fehlenden Doppelpunkt) nicht kopiert sein kann auch folgende Frage:

Kann Dein Member FBlatt im orginalen Code auch so definiert sein?
Delphi-Quellcode:
   
private
  FBlatt : array of integer;
Also ohne Range-Angabe [1..34]

Bei einem nicht initialisierten dynamischen Array wäre das ein typisches Verhalten.

Deep-Sea 21. Apr 2011 08:03

AW: array-variablen können nicht gesetzt werden
 
BTW:
Fixe Bereichsangaben der Art
Delphi-Quellcode:
for I:=1 to 34 do
sind i.d.R. gefährlich.
Besser so:
Delphi-Quellcode:
for I:= Low(FBlatt) to High(FBlatt) do
:-D

paku 21. Apr 2011 08:30

AW: array-variablen können nicht gesetzt werden
 
@ himitsu:

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var Eiche: TBaum;
begin
  Eiche.create;
end;
ich glaube auch das hier irgendwo das Problem liegt, da mein array-beschreiben ja in einer Button.click funktioniert.... aber was scheint falsch an dem create?


@ Satty67:
Tatsächlich habe ich den Code nur teilweise kopiert, sehr spitzfindig ;) ändert aber nichts am Problem xD nein das array ist definitiv als statisch gesetzt (also von 1 bis 34), ich brauche in diesem Fall keine dynamischen arrays!


@Deep-Sea:
Ja du hast recht, ist besser ;) aber eigentlich bei (meinem) statischen array sollte doch beides einwandfrei gehen, oder?


apropos, wenn ich wahlweise den bereich des arrays veränder (also von 1 bis 100) tritt die exception an einer anderen Stelle auf, immer nur für 1-2 felder... selten dämlich! sollte ich versuchen komplett mit einem dynamischen array zu arbeiten?


EDITH sagt:
So ein blöder Mist, ich initialisiere die Instanz der Klasse natürlich falsch! Müsste heißen:
Delphi-Quellcode:
Eiche := TBaum.create
und es funktioniert einwandfrei!

Ich danke euch trotzdem allen für eure Mühe :)
(BTW: warum gibt mir der Compiler nicht sopfort ne fehlermeldung oder so?)

Gruß

Deep-Sea 21. Apr 2011 08:34

AW: array-variablen können nicht gesetzt werden
 
Zitat:

Zitat von paku (Beitrag 1096324)
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var Eiche: TBaum;
begin
  Eiche.create;
end;

Das ist falsch! Es muss
Delphi-Quellcode:
Eiche := TBaum.create;
heißen :wink:

Zitat:

Zitat von paku (Beitrag 1096324)
Ja du hast recht, ist besser ;) aber eigentlich bei (meinem) statischen array sollte doch beides einwandfrei gehen, oder?

Klar geht es auch so. Aber wenn du irgendwann mal die Anzahl deiner Blätter oben änderst, wirst du es vergessen unten auch zu ändern und schon suchst du stundenlang einen Fehler, der nicht hätte sein müssen.
Erst recht nervig wird es, wenn du so eine Schleife häufiger nutzt, dann muss du die Werte an dutzenden Stellen anpassen. Nervige Arbeit.

paku 21. Apr 2011 08:35

AW: array-variablen können nicht gesetzt werden
 
wow, du bist aber fix, habs auch gerade gemerkt^^
werd das mit der for-schleife so machen, die vorteile liegen auf der Hand ;)

Danke & Gruß

himitsu 21. Apr 2011 09:03

AW: array-variablen können nicht gesetzt werden
 
Zitat:

Zitat von paku (Beitrag 1096324)
(BTW: warum gibt mir der Compiler nicht sopfort ne fehlermeldung oder so?)

Weil dieses grundsätzlich kein falscher/fehlerhafter Code ist?

Man muß rückgabewerte nicht speichern (
Delphi-Quellcode:
x := ...
)
und man kann über
Delphi-Quellcode:
x := variable.Create;
ein neues Objekt vom internen Typ des Objektes in der Variable erstellen.
Nur wenn da kein kein Objekt in der Variable drin ist, dann knallt es natürlich.
Delphi-Quellcode:
var
  obj, obj2: TControl;
begin
  obj := TEdit.Create(Self);
  obj2 := obj.Create(Self);
  ShowMessage(obj2.ClassName);
In deinem Fall war wohl irgendein zufälliger Wert/Zeiger/Pointer in der Objektvariable drin, welcher so zeigte, daß anfangs noch "irgendwlecher" beschreibbarer Speicher vorlag und ab einer gewissen Stelle war dieser Speicher nicht mehr beschreibbar und es knallte.
Womöglich hätte es auch gut gehen können, z.B. wenn der Zeiger woandershin zeigte oder wenn dein Array kleiner wäre,
aber dann hätte es woanders knallen können, weil du ja auch einen wichtigen Speicherbereich hättest überschreiben können (eine Art von Buffer Overrun).


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:26 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