AGB  ·  Datenschutz  ·  Impressum  







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

Arrays

Ein Thema von Psycho · begonnen am 31. Okt 2003 · letzter Beitrag vom 2. Nov 2003
Antwort Antwort
Seite 1 von 2  1 2      
Psycho

Registriert seit: 7. Okt 2003
7 Beiträge
 
#1

Arrays

  Alt 31. Okt 2003, 21:20
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]
  Mit Zitat antworten Zitat
Chewie

Registriert seit: 10. Jun 2002
Ort: Deidesheim
2.886 Beiträge
 
Turbo Delphi für Win32
 
#2

Re: Arrays

  Alt 31. Okt 2003, 21:24
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.
Martin Leim
Egal wie dumm man selbst ist, es gibt immer andere, die noch dümmer sind
  Mit Zitat antworten Zitat
Psycho

Registriert seit: 7. Okt 2003
7 Beiträge
 
#3

Re: Arrays

  Alt 31. Okt 2003, 23:49
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
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#4

Re: Arrays

  Alt 31. Okt 2003, 23:51
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.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Psycho

Registriert seit: 7. Okt 2003
7 Beiträge
 
#5

Re: Arrays

  Alt 31. Okt 2003, 23:58
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?
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#6

Re: Arrays

  Alt 1. Nov 2003, 00:00
Glück.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Chewie

Registriert seit: 10. Jun 2002
Ort: Deidesheim
2.886 Beiträge
 
Turbo Delphi für Win32
 
#7

Re: Arrays

  Alt 1. Nov 2003, 09:25
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.
Martin Leim
Egal wie dumm man selbst ist, es gibt immer andere, die noch dümmer sind
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#8

Re: Arrays

  Alt 1. Nov 2003, 09:41
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.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Chewie

Registriert seit: 10. Jun 2002
Ort: Deidesheim
2.886 Beiträge
 
Turbo Delphi für Win32
 
#9

Re: Arrays

  Alt 1. Nov 2003, 09:46
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.
Martin Leim
Egal wie dumm man selbst ist, es gibt immer andere, die noch dümmer sind
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#10

Re: Arrays

  Alt 1. Nov 2003, 10:09
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
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 15:02 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