Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - falsche array weitergabe an prozeduren


Ironwulf - So 16.04.06 17:20
Titel: falsche array weitergabe an prozeduren
Hy,
erstmal der quelltext :)


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
Procedure Laden;
var bla: array[1..9of Boolean;
    i: Byte;
begin
  for i:= 1 to 9 Do bla[i]:= False;
  bla[5]:= True;
  for i:= 1 to 9 Do
  If bla[i] = True Then Form1.ListBox1.Items.Add('1'else Form1.ListBox1.Items.Add('0');
  mmh(bla);
end;

Procedure mmh(bla: array of Boolean);
var i: Byte;
begin
  for i:= 1 to 9 Do
  If bla[i] = True Then Form1.ListBox2.Items.Add('1'else Form1.ListBox2.Items.Add('0');
end;


so nun das problem in der Prozedur Laden setze ich den wert bla[5] auf True
dann geb ich den array an die prozedure mmh weiter aber dort wird der bla[4] auf True gesetz, woran kann das liegen? und wie änder ich das das dort auch bla[5] True ist?

das ganze mit den listboxen drum rum ist nur damit ich den fehler finde und ihr euch auch mal ein bild von machen könnt falls ich es etwas unglücklich formuliert habe
hoffe mir kann jemand helfen, danke
ich verwend d3 Pro falls es relevant ist


Ironwulf - So 16.04.06 18:38

mmh ich hab grad errinnerungen aus der schul vom vba unterricht ;D
da gabs doch son befehl das der array entweder bei 1 oder bei 0 los geht
das scheint ihr auch irgendwie der fall zu sein
da das erste "item" von dem array auf den 0. der prozedur weiter gibt usw, d.h. am ende fehölt mir ein eintrag und hab dafür halt noch nen [0]
gibts da in delphi auch nen behfehl der das von 0 auf 1 setzt? und kann ich das nur für die eine prozedur festlegen und nicht gleich fürs ganze programm?


fuser - Di 18.04.06 10:37

Hallo Ironwulf

1. Möglichkeit: mit lo und high den Anfang und das Ende des Arrays errechnen.


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
Procedure mmh(bla: array of Boolean);
var i: Byte;
begin
  for i:= low(bla) to high(bla) Do
  If bla[i] = True Then Form1.ListBox2.Items.Add('1'else Form1.ListBox2.Items.Add('0');
end;


2. Möglichkeit: Mit Records


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
type MyRec=Record
  bla: array[1..9of Boolean;
end;

Procedure mmh(M:MyRec);
var i: Byte;
begin
  for i:= 1 to 9 Do
  If M.bla[i] = True Then Form1.ListBox2.Items.Add('1'else Form1.ListBox2.Items.Add('0');
end;


Moderiert von user profile iconraziel: Delphi-Tags hinzugefügt


Ironwulf - Di 18.04.06 14:09

ok danke :)


Allesquarks - Di 18.04.06 18:16

Ich würde mal behaupten, dass ein array[1..5] im der kompilation als Nullbasiertes benutzt wird, da die nullbasierten array dynamisch besser angesprochen werden können, dass heißt ein aufruf myarray[5] wird übersetzt zu address(myarray)+4*sizeof(myarraycell) oder falls dynamisch mit i einfach i-1 genommen wird. Theoretisch ist es ja nur eine teloskopische Umbenennung der Zellen also trivial nur für manche Sachverhalte verständlicher. Jedenfalls liegt der Fehler meiner Meinung nach darin, dass bei der Übergabe, dass statisch deklarierte nunmal jetzt wie ein ynamisches behandelt werden muss. Lösung gleich immer nullbasiert. Oder bei dynamisierung auf Nullbasiertheit achten.