![]() |
Arrays
Hi!
Wie kommt es, dass ein array, der für 5 Werte deklariert ist, dennoch 7 oder mehr Werte speichert und auch wieder ausgibt?
Delphi-Quellcode:
Danke für jede Hilfe
var
Ziehung:array[1..5] of integer; x,y:integer; begin randomize; for x:=1 to 7 do begin ziehung[x]:=random(6)+1; writeln(Ziehung[x]); end; readln; end. Psycho [edit=Daniel B]Delphi-Tags korrigiert. Mfg, Daniel B[/edit] |
Re: Arrays
Wahrscheinlich ist die Bereichsüberprüfung deaktiviert. Das erhöht die Laufgeschwindigkeit, erhöht aber auch die Fehleranfälligkeit, da, wie du schon festgestellt hast, Arrays beliebig indiziert werden können und damit allozierter, aber nicht zum Array zugehöriger Speicher überschrieben werden kann!
Mit den Comilerschaltern $RANGECHECKS ON bzw. $RANGECHECKS OFF kannst du dieses Verhalten selbst beeinflussen. |
Re: Arrays
Zunächst einmal vielen Dank, es funktioniert.
Trotzdem die Frage: Es wird doch ein entsprecvhender Speicherplatz reserviert. Wenn nun der Bereich überschritten wird, wo liegt der Speicherplatz für die zusätzlichen Werte und wie wird er verwaltet, er ist ja wieder abrufbar? Es ist zwar ganz gut, wenn man dies Problem beseitigen kann, es erklärt mir aber nicht, was da Delphi mit den Speichern macht. Gruß Psycho |
Re: Arrays
Im schlimmesten Fall überschreibst du dir Speicher, der im Speicher nach dem Array liegt. Und wenn da Dten liegen, die dein Programm später braucht, kommt es zu einer AccessViolation.
|
Re: Arrays
Das kann ich grundsätzlich ja verstehen, aber beim Aufruf ( writeln (ziehung[7] ) steigt das Programm nicht aus, es findet genau den "richtigen " Wert. Ist das Glück, weil der Bereich zwischen dem Speichern und Auslesen nicht verwendet wurde, oder wird er von Delphi geschützt?
|
Re: Arrays
Glück.
|
Re: Arrays
Wenn du zwischen dem Zuweisen an einen Array-Index, der außerhalb des Indexbereichs liegt und dem Abrufen keinen Speicher in deinem Programm allozierst und auch vorher an dieser Stelle kein allozierter Speicher war, dann gibts auch keine Access-Violation. Und wenn auch kein anderer Prozess an die zugehörige physische Speicherstelle keine Daten geschrieben hat, steht noch das drin, was vorher drin war.
Mit anderen Worten: Je länger die zeitliche Differenz zwichen Schreiben und Lesen ist und je mehr Prozesse laufen, desto höher die Wahrscheinlichkeit, dass da nicht mehr das steht, was du hingeschrieben hast. |
Re: Arrays
Zitat:
|
Re: Arrays
Richtig Luckie, aber:
Angenommen, Prozess 1 hat ein Array[1..5] und wird im Index 7 adressiert. Diese Speicherstelle ist von Prozess 1 nicht belegt und liegt im virtuellen Speicher eine Elementgröße hinter dem Array. Im physischen Speicher liegt es irgendwo. Nun kommt Prozess 2 und alloziert irgendwo in seinem virtuellen Speicherraum Speicher. Dieser virtuelle Speicher wird nun auf den phyischen abgebildet, und das kann zufällig genau die Speicherstelle sein, an der oben genanntes Element gespeichert wird. Das ist so ähnlich wie wenn du Variablen nicht initialisierst: Obwohl dein Programm das erste Mal läuft und noch nirgends Speicher freigegeben wurde, ist eine Variable nicht mit 0 intiialisiert, sondern mit dem, was vorher im physischen Speicher an der entsprechenden Adresse stand. |
Re: Arrays
if Falle das der Speicher des ArrayIndex[7] nicht mehr zum process gehört kommt es beim schreibn zu einer AccessViolation. Es kann nur der Speicher der zum Process gehört ohne accessviolation gelesen und geschrieben werden. Sonst könnte man ja einfach mal so windows bissl durcheinander bringen indem man im speicherbereich vom Betriebssystem was ändert und sich somit irgendwelche zugriffsrechte holt
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:56 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz