Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Arrays (https://www.delphipraxis.net/11149-arrays.html)

Psycho 31. Okt 2003 21:20


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:
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.
Danke für jede Hilfe
Psycho

[edit=Daniel B]Delphi-Tags korrigiert. Mfg, Daniel B[/edit]

Chewie 31. Okt 2003 21:24

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.

Psycho 31. Okt 2003 23:49

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

Luckie 31. Okt 2003 23:51

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.

Psycho 31. Okt 2003 23:58

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?

Luckie 1. Nov 2003 00:00

Re: Arrays
 
Glück.

Chewie 1. Nov 2003 09:25

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.

Luckie 1. Nov 2003 09:41

Re: Arrays
 
Zitat:

Zitat von Chewie
Und wenn auch kein anderer Prozess an die zugehörige physische Speicherstelle keine Daten geschrieben hat

Ein Prozess kann nicht auf den Adressraum eines anderen Prozesses zugreifen (unter 32 Bit Windows). Und mit physischen Speicher hat das gar nichts zu tun. Im Grunde genommen kennt ein Prozess keinen physischen Speicher. Es sieht nur seine 2 GB Adressen die ihm zur Verfügung stehen. Die Abbildung der Adresse aus dem Adressraum eines Prozess auf physischen Speicher nimmt das Betriebssystem bei Bedarf vor.

Chewie 1. Nov 2003 09:46

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.

SirThornberry 1. Nov 2003 10:09

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 05:16 Uhr.
Seite 1 von 2  1 2      

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