AGB  ·  Datenschutz  ·  Impressum  







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

array-variablen können nicht gesetzt werden

Ein Thema von paku · begonnen am 21. Apr 2011 · letzter Beitrag vom 21. Apr 2011
Antwort Antwort
paku

Registriert seit: 21. Apr 2011
3 Beiträge
 
#1

array-variablen können nicht gesetzt werden

  Alt 21. Apr 2011, 08:52
Delphi-Version: 5
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
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: array-variablen können nicht gesetzt werden

  Alt 21. Apr 2011, 08:56
Wie erzeugst du dein TBaum-Objekt?
$2B or not $2B
  Mit Zitat antworten Zitat
Satty67

Registriert seit: 24. Feb 2007
Ort: Baden
1.566 Beiträge
 
Delphi 2007 Professional
 
#3

AW: array-variablen können nicht gesetzt werden

  Alt 21. Apr 2011, 08:59
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.

Geändert von Satty67 (21. Apr 2011 um 09:02 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Deep-Sea
Deep-Sea

Registriert seit: 17. Jan 2007
907 Beiträge
 
Delphi XE2 Professional
 
#4

AW: array-variablen können nicht gesetzt werden

  Alt 21. Apr 2011, 09:03
BTW:
Fixe Bereichsangaben der Art for I:=1 to 34 do sind i.d.R. gefährlich.
Besser so: for I:= Low(FBlatt) to High(FBlatt) do
Chris
Die Erfahrung ist ein strenger Schulmeister: Sie prüft uns, bevor sie uns lehrt.
  Mit Zitat antworten Zitat
paku

Registriert seit: 21. Apr 2011
3 Beiträge
 
#5

AW: array-variablen können nicht gesetzt werden

  Alt 21. Apr 2011, 09:30
@ 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:
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ß

Geändert von paku (21. Apr 2011 um 09:34 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Deep-Sea
Deep-Sea

Registriert seit: 17. Jan 2007
907 Beiträge
 
Delphi XE2 Professional
 
#6

AW: array-variablen können nicht gesetzt werden

  Alt 21. Apr 2011, 09:34
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var Eiche: TBaum;
begin
  Eiche.create;
end;
Das ist falsch! Es muss Eiche := TBaum.create; heißen

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.
Chris
Die Erfahrung ist ein strenger Schulmeister: Sie prüft uns, bevor sie uns lehrt.
  Mit Zitat antworten Zitat
paku

Registriert seit: 21. Apr 2011
3 Beiträge
 
#7

AW: array-variablen können nicht gesetzt werden

  Alt 21. Apr 2011, 09:35
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ß
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: array-variablen können nicht gesetzt werden

  Alt 21. Apr 2011, 10:03
(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 (x := ... )
und man kann über 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).
$2B or not $2B
  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 09:46 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