Autor Beitrag
Croissant612
Hält's aus hier
Beiträge: 10



BeitragVerfasst: Mo 26.04.10 11:10 
Hallo,

ich habe in einer Anwendung den blöden Effekt, dass sich nach mehreren Wochen Dauerlauf ohne reproduzierbares Verhalten eine Exception mit Bereichsüberprüfung einstellt.
An der Stelle wird ein dynamisches Array verwendet. Da sich der Fehler nur seeeehr langsam eingrenzen lässt, versuche ich vorab im
Ausschlussverfahren die Fehlerquellen abzuklappern.
Daher meine Frage: Kann ein dynamisches Array einen RangeCheckerror auslösen? Ich dachte, die Bereichsüberprüfung würde nur bei begrenzten Arrays funktionieren. Ich will eigentlich nur sichergehen, dass ich keine Fehlerquelle ausschließe, die ggf. doch eine ist :-)
Google hatte ich bemüht, aber widersprüchliche Ergebnisse bekommen. Ich möchte an der Stelle echt auf Nummer sicher gehen :-)

MfG

Ingo

---Moderiert von user profile iconNarses: Beiträge zusammengefasst---

Hi,

hat sich erledigt... simples Ausprobieren hätte die Frage erspart. Ich werde alt...

MfG

Ingo

---Moderiert von user profile iconNarses: Beiträge zusammengefasst---

Hoi,

okay. Wenn wir schon dabei sind: Mein dynamisches Array ist aus irgendeinem Grund "Verschwunden". Wenn ich length(meinArray)aufrufe, erscheint locker flockig eine "0". Das Array wird bei Programmstart mit "SetLength" angelegt und ansonsten eigentlich nicht mehr angerührt. Ich befürchte, es handelt sich um einen üblen Speicherwischer.

Davon abgesehen: Was passiert, wenn ich als ersten Workaround ein erneutes "SetLength" implementiere? Was tut Delphi da intern?

Ist es möglich, das dynamische Arrays zur Laufzeit verloren gehen? Würde mich arg wundern, aber es gibt im Moment nicht viel, was ich mir nicht vorstellen kann.

Ach ja: Delphi5 ist im Spiel. OS: Windows 2003 Server

Etwas verwirrte Grüße

Ingo
platzwart
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 1054
Erhaltene Danke: 78

Win 7, Ubuntu 9.10
Delphi 2007 Pro, C++, Qt
BeitragVerfasst: Mo 26.04.10 12:24 
Kannst du auch ein wenig Quellcode zeigen?

_________________
Wissenschaft schafft Wissenschaft, denn Wissenschaft ist Wissenschaft, die mit Wissen und Schaffen Wissen schafft. (myself)
Croissant612 Threadstarter
Hält's aus hier
Beiträge: 10



BeitragVerfasst: Mo 26.04.10 12:32 
Hi,

schwierig, da ziemlich verteilt. Das Array ist global angelegt und wird im Hochlauf mit einer konfigurierbaren Länge belegt.
Funktioniert auch. Das ganze läuft einige Wochen lang und irgendwann ist das Array "Weg".

Das Array dient als Rückgabespeicher für eine Kopplung mit der AGLink40 DLL von Deltalogic. Da kann ich nicht reinschauen. Ich versuche aktuell zu verifizieren, ob die DLL evt den übergebenen Bytebereich mehr als nur inhaltlich beeinflussen kann...

MfG

Ingo
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mo 26.04.10 13:21 
Bist du sicher, dass das SetLength ausgeführt wird? Bist du sicher, dass nicht noch von wo anders auf das Array zugegriffen wird? Stichwort globale Variablen und böse.

Von alleine ruft sich kein SetLength 0 auf.
Xentar
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2077
Erhaltene Danke: 2

Win XP
Delphi 5 Ent., Delphi 2007 Prof
BeitragVerfasst: Mo 26.04.10 13:26 
Gibts bei dynamischen Arrays nicht auch nen Header, wo drinsteht wie lang das Ding ist und sowas? Ähnlich wie bei nem String?
Wenn ja: Kann es sein, dass dieser Header überschrieben wird, und Delphi somit "glaubt", dass das Array leer wär?

_________________
PROGRAMMER: A device for converting coffee into software.
BenBE
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: Mo 26.04.10 13:58 
Ja, das kann durchaus passieren, wenn du aus irgendeinem Grund auf negative Indizes zugreifst oder eine Variable VOR dem Array im Speicher nach hinten überschrieben wird.

Benutzt Du Pointer? Wenn JA: Schon mal versucht, Canaries einzubauen?

Ansonsten halte ich's wie Luckie: Globale Variablen SIND böse! Weg damit, soweit es geht! Ggf. einfach mal jegliche Zugriffe auf das Array kapseln; auch wenn's dadurch etwas langsamer wird.

_________________
Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
Croissant612 Threadstarter
Hält's aus hier
Beiträge: 10



BeitragVerfasst: Mo 26.04.10 21:37 
Hi,

beabsichtigt wird kein setLength (0) aufgerufen, nein. Pointer benutzer ich an der Stelle bedingt. Ist halt ne "var" Übergabe.

Da es sich um einen asynchronen Auftruf handelt, wüsste ich jetzt auf Anhieb aber auch nicht, wie ich um die globale Variable herumkomme.

Canaries sagen mir so auf Anhieb nichts. Kann mir da mal jemand auf die Sprünge helfen?
BenBE: Was würdest Du zur Kapselung vorschlagen?

MfG

Ingo
BenBE
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: Mo 26.04.10 22:21 
Das Array zu nem Object mit Default-Property machen. Greift sich genauso zu, aber du kannst über Getter und Setter alles mögliche abfangen ...

_________________
Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
Croissant612 Threadstarter
Hält's aus hier
Beiträge: 10



BeitragVerfasst: Di 27.04.10 11:27 
Hi,

hast Du mal nen Codeschnipsel als Beispiel für mich? Ich stehe gerade auf dem Schlauch :-)

MfG

Ingo
BenBE
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: Di 27.04.10 11:30 
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
type 
    TArrayWrapper = class(TObject)
    private 
        FArray: Array of T;
    public
        property Items[Index: Integer]: T read GetItem set SetItem default;
    end;


Rest steht in der Hilfe.

_________________
Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
Croissant612 Threadstarter
Hält's aus hier
Beiträge: 10



BeitragVerfasst: Di 27.04.10 11:50 
Hola,

bedankt. Ich schaue mir das mal genauer an.

MfG

Ingo