Variable ändert urplötzlich ihren Wert...[sinnloser Fehler]
spacer
Autor Nachricht
IMM0rtalis
Hält's aus hier
Beiträge: 6



BeitragVerfasst: Mi 27.05.09 17:44 
ausblenden Delphi-Quelltext markieren
1:
2:
3:
          { ### Maße jedes Feldes (Quadrat) ### }
Spielaufbau.Feldbreite := 50;
Spielaufbau.Feldluecke := 3;

ausblenden volle Höhe Delphi-Quelltext markieren
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
113:
114:
115:
116:
117:
118:
119:
120:
121:
122:
123:
124:
125:
126:
127:
128:
129:
130:
131:
132:
133:
134:
135:
136:
137:
138:
139:
140:
141:
142:
143:
144:
145:
146:
147:
148:
149:
150:
151:
152:
153:
154:
155:
156:
157:
158:
159:
160:
161:
162:
163:
164:
165:
166:
167:
168:
169:
170:
171:
172:
173:
174:
175:
176:
177:
178:
179:
180:
181:
182:
183:
184:
185:
186:
187:
188:
189:
190:
191:
192:
193:
194:
195:
196:
197:
198:
199:
200:
201:
202:
203:
204:
205:
procedure TSpielaufbau.LoadSpielfeld;
var
i : Integer;
feld4, feld3_1, feld3_2 : Integer; { ### Variablen für die Spielfeldform ### }
ausrichtung : Byte;
Felderanzahl_Seite1, Felderanzahl_Seite2, Felderanzahl_Seite3 : Integer;
FelderanzahlGes : Integer;
Seite : Char;
Begin

{ #################### }
{ ### Definitionen ### }
{ #################### }


{ ### Felderfestlegung ### }
Felderanzahl_Seite1 := 3;
Felderanzahl_Seite2 := 3;
Felderanzahl_Seite3 := 5;

FelderanzahlGes := 4*(Felderanzahl_Seite1+Felderanzahl_Seite2+Felderanzahl_Seite3);

{ ### Zähler resetten ### }
feld4 := 0;
feld3_1 := 0;
feld3_2 := 0;

{ ### Startseite ### }
Seite := 'A';
{A -> Felderanzahl_Seite1}
{B -> Felderanzahl_Seite2}
{C -> Felderanzahl_Seite3}

{ ### Startrichtung ### }
ausrichtung := 0;
{1 -> horizontal nach rechts}
{2 -> vertikal nach oben}
{3 -> horizontal nach rechts}
{4 -> vertikal nach unten}
{5 -> horizontal nach rechts}
{6 -> vertikal nach unten}
{7 -> horizontal nach links}
{8 -> vertikal nach unten}
{9 -> horizontal nach links}
{10 -> vertikal nach oben}
{11 -> horizontal nach links}
{12 -> vertikal nach oben}

for i:=0 to (FelderanzahlGes-1) do
Begin
RuntimeForm.Show;
{ ######################## }
{ ### Felder erstellen ### }
{ ######################## }

Spielfeld[i].Feld := TShape.Create(MainForm);
Spielfeld[i].Feld.Parent := MainForm;
Spielfeld[i].Feld.Shape := stRoundRect;
Spielfeld[i].Feld.Brush.Color := clWhite;
Spielfeld[i].Feld.Width := Feldbreite;
Spielfeld[i].Feld.Height := Feldbreite;


{ ######################## }
{ ### Posititionierung ### }
{ ######################## }

{ ############################# }
{ ### 1. Position festlegen ### }
{ ############################# }
//ShowMessage('feld3_1:'+IntToStr(feld3_1));
if (Seite = 'A') then
Begin
if(feld3_1 >= Felderanzahl_Seite1) then feld3_1 := 0;
inc(feld3_1);
{ ### Abbiegen ### }
if ((ausrichtung <= 12) AND (feld3_1 = 1)) then inc(ausrichtung);
if(feld3_1 = Felderanzahl_Seite1) then Seite := 'B';
//ShowMessage(IntToStr(i)+'->'+IntToStr(ausrichtung));
End

else if (Seite = 'B') then
Begin
if(feld3_2 >= Felderanzahl_Seite2) then feld3_2 := 0;
inc(feld3_2);
{ ### Abbiegen ### }
if ((ausrichtung <= 12) AND (feld3_2 = 1)) then inc(ausrichtung);
if(feld3_2 = Felderanzahl_Seite2) then Seite := 'C';
//ShowMessage(IntToStr(i)+'->'+IntToStr(ausrichtung));
End


else if (Seite = 'C') then
Begin
if(feld4 >= Felderanzahl_Seite3) then feld4 := 0;
inc(feld4);
{ ### Abbiegen ### }
if ((ausrichtung <= 12) AND (feld4 = 1)) then inc(ausrichtung);
if(feld4 = Felderanzahl_Seite3) then Seite := 'A';
//ShowMessage(IntToStr(i)+'->'+IntToStr(ausrichtung));
End
else ShowMessage('Fehler bei der Positionierung der Felder(Schleife).');



if (ausrichtung > 12) then ausrichtung := 1; { ### sicherheitshalber 'ausrichtung' zurücksetzen ### }

{ ########################### }
{ ### 2. genau ausrichten ### }
{ ########################### }


{ ### Ausrichten ### }
case ausrichtung of
1: { ### -> horizontal nach rechts ### }
Begin
Spielfeld[i].Feld.Top := AbstandOben+(Felderanzahl_Seite2*(Feldluecke+Feldbreite));
Spielfeld[i].Feld.Left := AbstandLinks+((feld3_1-1)*(Feldluecke+Feldbreite));
End;
2: { ### -> vertikal nach oben ### }
Begin
Spielfeld[i].Feld.Top := AbstandOben+(Felderanzahl_Seite2*(Feldluecke+Feldbreite))-
((feld3_2-1)*(Feldluecke+Feldbreite));
Spielfeld[i].Feld.Left := AbstandLinks+(Felderanzahl_Seite1*(Feldluecke+Feldbreite));
End;
3: { ### -> horizontal nach rechts ### }
Begin
Spielfeld[i].Feld.Top := AbstandOben;
Spielfeld[i].Feld.Left := AbstandLinks+(Felderanzahl_Seite1*(Feldluecke+Feldbreite))+
((feld4-1)*(Feldluecke+Feldbreite));
End;
4: { ### -> vertikal nach unten ### }
Begin
Spielfeld[i].Feld.Top := AbstandOben+((feld3_1-1)*(Feldluecke+Feldbreite));
Spielfeld[i].Feld.Left := AbstandLinks+((Felderanzahl_Seite1+Felderanzahl_Seite3)*(Feldluecke+Feldbreite));
End;
5: { ### -> horizontal nach rechts ### }
Begin
Spielfeld[i].Feld.Top := AbstandOben+(Felderanzahl_Seite1*(Feldluecke+Feldbreite));
Spielfeld[i].Feld.Left := AbstandLinks+((Felderanzahl_Seite1+Felderanzahl_Seite3)*(Feldluecke+Feldbreite))+
((feld3_2-1)*(Feldluecke+Feldbreite));
End;
6: { ### -> vertikal nach unten ### }
Begin
Spielfeld[i].Feld.Top := AbstandOben+(Felderanzahl_Seite1*(Feldluecke+Feldbreite))+((feld4-1)*(Feldluecke+Feldbreite));
Spielfeld[i].Feld.Left := AbstandLinks+((Felderanzahl_Seite1+Felderanzahl_Seite2+Felderanzahl_Seite3)*(Feldluecke+Feldbreite));
End;
7: { ### -> horizontal nach links ### }
Begin
Spielfeld[i].Feld.Top := AbstandOben+((Felderanzahl_Seite1+Felderanzahl_Seite3)*(Feldluecke+Feldbreite));
Spielfeld[i].Feld.Left := AbstandLinks+((Felderanzahl_Seite1+Felderanzahl_Seite2+
Felderanzahl_Seite3)*(Feldluecke+Feldbreite))-
((feld3_1-1)*(Feldluecke+Feldbreite));
End;
8: { ### -> vertikal nach unten ### }
Begin
Spielfeld[i].Feld.Top := AbstandOben+((Felderanzahl_Seite1+Felderanzahl_Seite3)*(Feldluecke+Feldbreite))+
((feld3_2-1)*(Feldluecke+Feldbreite));
Spielfeld[i].Feld.Left := AbstandLinks+((Felderanzahl_Seite2+Felderanzahl_Seite3)*(Feldluecke+Feldbreite));
End;
9: { ### -> horizontal nach links ### }
Begin
Spielfeld[i].Feld.Top := AbstandOben+((Felderanzahl_Seite1+Felderanzahl_Seite2+
Felderanzahl_Seite3)*(Feldluecke+Feldbreite));
Spielfeld[i].Feld.Left := AbstandLinks+((Felderanzahl_Seite2+Felderanzahl_Seite3)*(Feldluecke+Feldbreite))-
((feld4-1)*(Feldluecke+Feldbreite));
End;
10: { ### -> vertikal nach oben ### }
Begin
Spielfeld[i].Feld.Top := AbstandOben+((Felderanzahl_Seite1+Felderanzahl_Seite2+Felderanzahl_Seite3)*(Feldluecke+Feldbreite))-
((feld3_1-1)*(Feldluecke+Feldbreite));
Spielfeld[i].Feld.Left := AbstandLinks+Felderanzahl_Seite2*(Feldluecke+Feldbreite);
End;
11: { ### -> horizontal nach links ### }
Begin
Spielfeld[i].Feld.Top := AbstandOben+((Felderanzahl_Seite2+Felderanzahl_Seite3)*(Feldluecke+Feldbreite));
Spielfeld[i].Feld.Left := AbstandLinks+Felderanzahl_Seite2*(Feldluecke+Feldbreite)-((feld3_2-1)*(Feldluecke+Feldbreite));
End;
12: { ### -> vertikal nach oben ### }
Begin
-------> ShowMessage(IntToStr(Feldbreite)); <--------
Spielfeld[i].Feld.Top := AbstandOben+((Felderanzahl_Seite2+Felderanzahl_Seite3)*(Feldluecke+Feldbreite))-
((feld4-1)*(Feldluecke+Feldbreite));
Spielfeld[i].Feld.Left := AbstandLinks;
End
else
ShowMessage('Fehler beim Ausrichten der Spielfelder.');
end;

RuntimeForm.Tabelle.Cells[0,i+1] := IntToStr(i);
RuntimeForm.Tabelle.Cells[1,i+1] := IntToStr(ausrichtung);
RuntimeForm.Tabelle.Cells[2,i+1] := IntToStr(feld3_1);
RuntimeForm.Tabelle.Cells[3,i+1] := IntToStr(feld3_2);
RuntimeForm.Tabelle.Cells[4,i+1] := IntToStr(feld4);
RuntimeForm.Tabelle.Cells[5,i+1] := Seite;
RuntimeForm.Tabelle.Cells[6,i+1] := IntToStr(Spielfeld[i].Feld.Top);
RuntimeForm.Tabelle.Cells[7,i+1] := IntToStr(Spielfeld[i].Feld.Left);

Spielfeld[i].Feld.Enabled := false;
Spielfeld[i].Feld.Show;


End;

End;


Kann mir vielleicht irgendwer verraten, wieso in der CASE-Anweisung, wenn ausrichtung 12 ist, sich die Feldbreite auf einmal verändert?????

ShowMessage(IntToStr(Feldbreite));
bringt folgende Ausgaben:
50
50
9891712
9891712
9891712


wie kommt das Programm darauf?!? Ich sehe da keinen Fehler... seht ihr einen?

irgendwie ist das total strange^^

mfg
 
Antworten mit Zitat Beitrag melden
Private Nachricht sendenPosting in privater Nachricht zitieren
Werbung ausblenden? Dann registriere Dich kostenlos. Weitere Gründe für eine Registrierung.


Werbung ausblenden? Dann registriere Dich kostenlos. Weitere Gründe für eine Registrierung.
Yogu
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starhalf offtopic star
Beiträge: 2544
Erhaltene Danke: 137

Windows 7 Home Premium
Visual C# 2010 Express
BeitragVerfasst: Mi 27.05.09 17:59 
Hallo,

wo hast du denn die anderen ShowMessages eingefügt? Bis wohin bleiben die 50 denn erhalten, und wo ändert es sich? Zeig mal die Deklaration von Feldbreite bzw. Spielaufbau. Und tritt der Fehler nur bei ausrichtung = 12 auf?

Anhand deines Quellcodes kann ich auch keinen Fehler feststellen, schließlich weist du Feldbreite nirgends einen Wert zu. Oder wird eine Prozedur oder Funktion aufgerufen, die den Wert verändert?
 
Antworten mit Zitat Beitrag melden
Private Nachricht sendenPosting in privater Nachricht zitieren
IMM0rtalis Threadstarter
Hält's aus hier
Beiträge: 6



BeitragVerfasst: Mi 27.05.09 18:42 
ausblenden Delphi-Quelltext markieren
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
  TSpielaufbau = class(TObject)
test : TShape;
private
{ Private-Deklarationen }
public
{ Public-Deklarationen }
Spielfeld : Array[0..39] of TFelderRecord;
Figur : Array[0..11] of TSpielFigur;
AbstandOben, AbstandLinks : Integer;
Feldbreite : Integer;
Feldluecke : Integer;
FelderanzahlGes : Integer;
procedure CreateFelder;
end;

ausblenden volle Höhe Delphi-Quelltext markieren
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
procedure TMainForm.FormCreate(Sender: TObject);
Begin
{ ################################## }
{ ### DARF NICHT ENTFERNT WERDEN ### }
{ ################################## }
{ ###} Spielaufbau := TSpielaufbau.Create;
{ ################################## }
{ ################################## }

{ ##################### }
{ ### Einstellungen ### }
{ ##################### }

{ ################### }
{ ### Spielaufbau ### }
{ ################### }

{ ### Positionierung des Spielfeldes ### }
Spielaufbau.AbstandOben := 15;
Spielaufbau.AbstandLinks := 145;
{ ### Maße jedes Feldes (Quadrat) ### }
Spielaufbau.Feldbreite := 50;
Spielaufbau.Feldluecke := 3;

{ ### Spielaufbau ### }
Spielaufbau.CreateFelder;

{ ### Starteigenschaften ### }
MainForm.Color := $d9f0ed;


End;


Der Fehler tritt nur auf, wenn ich Felderanzahl_Seite3 auf 5 statt 4 setze... und erst zum schluss, wenn die ausrichtung 12 wird.. wenn ich die .exe aufrufe, stehen statt den komischern zahlen mit ner 9 vorne Zahlen mit ner 1 vorne^^ aber auch so komisch^^
Die bleiben alle ausrichtungen lang erhalten... sogar noch im ersten Teil von der 12. .... dann auf einmal diese komische Zahl^^

und woanders wird Feldbreite definitiv kein anderer Wert zugewiesen^^

das ist ja das komische^^


mfg
 
Antworten mit Zitat Beitrag melden
Private Nachricht sendenPosting in privater Nachricht zitieren
SvenAbeln
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 328
Erhaltene Danke: 2



BeitragVerfasst: Mi 27.05.09 20:23 
Du schreibst ausserhalb von deinem Array.

ausblenden Delphi-Quelltext markieren
1:
2:
3:
4:
5:
6:
7:
8:
9:
Spielfeld : Array[0..39] of TFelderRecord;

FelderanzahlGes := 4*(Felderanzahl_Seite1+Felderanzahl_Seite2+Felderanzahl_Seite3);
4 * (3 + 3 + 5 ) = 44

[...]
for i:=0 to (FelderanzahlGes-1) do // 0 - 43
Begin
Spielfeld[i].Feld := TShape.Create(MainForm); // nur für 0-39 gültig
 
Antworten mit Zitat Beitrag melden
Private Nachricht sendenPosting in privater Nachricht zitieren
IMM0rtalis Threadstarter
Hält's aus hier
Beiträge: 6



BeitragVerfasst: Mi 27.05.09 21:03 
Vielen vielen Dank^^

Damit habe ich überhaupt nicht gerechnet^^

danköö^^

habs jetzt in ein dynamisches Array umgewandelt^^

mfg
 
Antworten mit Zitat Beitrag melden
Private Nachricht sendenPosting in privater Nachricht zitieren
delphi10
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starhalf offtopic starofftopic starofftopic star
Beiträge: 447
Erhaltene Danke: 2

W2K, XP, Vista64, Win7 64
RAD-Studio 2010
BeitragVerfasst: Do 28.05.09 23:08 
[klugscheisser]
Deswegen sollte man mindestens einmal einen Lauf mit "Compiler/Laufzeitfehler/Bereichsüberprüfung" durchführen.
[/Klugscheisser]
cu delphi10

duckundwech

_________________
Salus populi suprema lex esto
 
Antworten mit Zitat Beitrag melden
Private Nachricht sendenPosting in privater Nachricht zitieren
home home