![]() |
Problem mit for-do
Hi,
ich schreibe gerade eine Simulation des radioaktiven Zerfalls. Ich baue dazu ein 2d Netz von Atomen auf und benuzte dazu for-do.
Delphi-Quellcode:
Soweit sogut. Hat auch bisher alles geklappt. Heute hab ich dann ein Diagramm auf einer weiteren Form mit eingebaut.
...
for I := 0 to 29 do begin for k := 0 to 26 do begin atoms[i,k] := TAtom.create; atoms[i,k].x := I*35; atoms[i,k].y := K*35; atoms[i,k].changeatom(strtoint(edit1.text),strtoint(edit2.text)); with canvas do begin brush.Color := atoms[i,k].color; ellipse(atoms[i,k].x,atoms[i,k].y,atoms[i,k].x+35,atoms[i,k].y + 35); end; end; end; ... for i := 0 to 29 do begin for k := 0 to 26 do begin if atoms[i,k].Knownnuklid = true then begin if atoms[i,k].stable = false then begin atoms[i,k].randomdecay(0.2); if atoms[i,k].stable = true then stable := stable +1; end; end; end; ... for I := 0 to 29 do begin for k := 0 to 26 do begin with canvas do begin brush.Color := atoms[i,k].color; font.Color := atoms[i,k].Fcolor; pen.Color := RGB(255,255,255); ellipse(atoms[i,k].x,atoms[i,k].y,atoms[i,k].x+35,atoms[i,k].y + 35); Font.Size := 8; Textout(atoms[i,k].x+15,atoms[i,k].y+10,atoms[i,k].Kuerzel); Font.Size := 6; Textout(atoms[i,k].x+4,atoms[i,k].y+5,inttostr(atoms[i,k].Protonen+atoms[i,k].Neutronen)); Textout(atoms[i,k].x+4,atoms[i,k].y+16,inttostr(atoms[i,k].Protonen)); end; end; end; ...
Delphi-Quellcode:
Und seitdem hängt er sich manchmal(hab noch nicht herausgefunden wann) bei Zeile
Procedure TForm1.paintchart;
var i:Integer; begin with canvas do begin moveto(20,480); for I := 0 to np do begin lineto(ChartPoint[i].X+20,480-ChartPoint[i].y div 2); end; end; end; procedure TForm1.Timer1Timer(Sender: TObject); begin with canvas do begin Brush.Color := rgb(255,255,255); Rectangle(0, 0, 500, 500); MoveTo(20,480); LineTo(20,20); MoveTo(20,480); LineTo(480,480); textout(10,10,'Anzahl Teilchen'); textout(450,480,'Zeit in s'); paintchart; end; end; Procedure TForm1.addPoint; begin Chartpoint[np].X := n; Chartpoint[np].Y := stable; np := np +1; n := n+1; end;
Delphi-Quellcode:
auf. Wenn ich dann über i bzw k mit dem mauszeiger gehe Zeigt er für i 30 und für k 17 an.
if atoms[i,k].Knownnuklid = true then
Aber eigentlich sollte es doch nur bis 29 und 26 gehen.oder? Ich hab keine Ahnnung wie das zustande kommt, da es ja vorher ohne Probleme gegangen ist und ich nichts an der besagten Fehlerzeile geändert habe. Würde mich sehr freuen wenn jemand eine Lösung parat hat( :dp: ). MFG |
Re: Problem mit for-do
Müsste die Grenze für die Schleife über i nicht np-1 heissen?
|
Re: Problem mit for-do
Stimmt danke.
mal schaun obs jetzt geht. Edit: Jetzt schaut mein Diagramm zwar besser aus, das Problem ist aber noch da. |
Re: Problem mit for-do
mach daraus
Delphi-Quellcode:
bitte ein
if atoms[i,k].Knownnuklid = true then
Delphi-Quellcode:
und daraus
if atoms[i,k].Knownnuklid then
Delphi-Quellcode:
das hier
if atoms[i,k].stable = false then
Delphi-Quellcode:
if not atoms[i,k].stable then
|
Re: Problem mit for-do
ist zwar schöner, löst aber leider das Problem nicht.
Trotzdem danke. |
Re: Problem mit for-do
Na toll. Ich hab das Array von TPoint auf 100 begrenzt.
Sorry leute das hätt ich auch selber rausfinden können. close pls. |
Re: Problem mit for-do
Zitat:
|
Re: Problem mit for-do
Stimmt. Ich meinte natürlich das ich euch nicht damit belästigen hätte müssen ;).
|
Re: Problem mit for-do
Wenn du viel mit Matreizen arbeitest, hier noch ein kleiner "verschönerungstipp":
aus
Delphi-Quellcode:
kann man auch
for I := 0 to 29 do
begin for k := 0 to 26 do begin [befehle] end; end;
Delphi-Quellcode:
machen. Finde ich übersichtlicher
for I := 0 to 29 do
for k := 0 to 26 do begin [befehle] end; |
Re: Problem mit for-do
Ich find es grausig. Solange man nicht nur Einzeiler hat, finde ich es immer wieder verwirrend, wenn ich einen Einrückungsblock habe, zu dem kein "end;" existiert. Stell dir mal vor, [befehle] ist länger als ein Bildschirm voll, und wohlmöglich selbst alles noch in 3. bis 4. Ebene verschachtelt. Such dann mal den Fehler, wenn irgend ein Block zu oft/selten/garnicht ausgeführt wird. Kann man, ist aber unnötig erschwert.
Was ich für i.O. halte wäre etwas wie:
Delphi-Quellcode:
Letztlich eine philosophische Frage, aber Einrückungen ohne zugehörige Schließung hab mich schon zu oft meine Haarfarbe gekostet.
for I := 0 to 29 do
for k := 0 to 26 do Befehl(parameter1, parameter2); |
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:13 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