| Autor |
Beitrag |
Croissant612
Hält's aus hier
Beiträge: 10
|
Verfasst: 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 Narses: Beiträge zusammengefasst---
Hi,
hat sich erledigt... simples Ausprobieren hätte die Frage erspart. Ich werde alt...
MfG
Ingo
--- Moderiert von Narses: 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
      
Beiträge: 1054
Erhaltene Danke: 78
Win 7, Ubuntu 9.10
Delphi 2007 Pro, C++, Qt
|
Verfasst: 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 
Hält's aus hier
Beiträge: 10
|
Verfasst: 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
|
Verfasst: 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
      
Beiträge: 2077
Erhaltene Danke: 2
Win XP
Delphi 5 Ent., Delphi 2007 Prof
|
Verfasst: 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
      
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: 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 
Hält's aus hier
Beiträge: 10
|
Verfasst: 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
      
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: 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 
Hält's aus hier
Beiträge: 10
|
Verfasst: 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
      
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: Di 27.04.10 11:30
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 
Hält's aus hier
Beiträge: 10
|
Verfasst: Di 27.04.10 11:50
Hola,
bedankt. Ich schaue mir das mal genauer an.
MfG
Ingo
|
|
|