Entwickler-Ecke
Sonstiges (Delphi) - array scheint von Delphi automatisch gelöscht zu werden
bluebutton38 - Di 27.04.10 09:58
Titel: array scheint von Delphi automatisch gelöscht zu werden
Ein freundliches "Hallo!" an euch Programmierer,
ich soll für meinen Informatik-Lehrer eine Binäruhr schreiben und bin auch so gut wie fertig, jedoch habe ich das Problem, dass meine Shapes (die sollen die einsen bzw. nullen durch eine rote bzw. weiße Farbe ausdrücken) mir lediglich die erste Zahl, also 1, korrekt anzeigen, aber danach werden alle Shapes geleert und es fängt wieder von vorne an (normalerweise sollten ja dann 10, 11, 100,... folgen). Ich weis einfach nicht, warum das ganze nicht funktioniert.
Hier mal der Quelltext für euch:
Delphi-Quelltext
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:
| unit Binaeruhr;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls, BinaeruhrHeader, StdCtrls;
type TForm1 = class(TForm) Timer1: TTimer; Label1: TLabel; Label2: TLabel; Label3: TLabel; procedure Timer1Timer(Sender: TObject); procedure FormCreate(Sender: TObject); private public end; procedure ShapesErzeugen; procedure Zahlenlesen(a:array of integer; Shapes:array of TShape);
var Form1: TForm1; minZaehler, stuZaehler:integer; sek, min, stu:array [0..10] of integer; sekShapes, minShapes, stuShapes:array of TShape;
implementation
{$R *.dfm}
procedure TForm1.Timer1Timer(Sender: TObject); var clear, Zaehler : integer; begin ZaehlerStellen; for Zaehler:=0 to 9 do sek[Zaehler]:=Dualzaehlen(sek);
inc(minZaehler); Zahlenlesen(sek, sekShapes); if minZaehler=60 then begin ZaehlerStellen; for Zaehler:=0 to 9 do min[Zaehler]:=Dualzaehlen(min); inc(stuZaehler); for clear:=0 to 9 do sek[clear]:=0; Zahlenlesen(min, minShapes); minZaehler:=0; end; if stuZaehler=60 then begin ZaehlerStellen; for Zaehler:=0 to 9 do stu[Zaehler]:=Dualzaehlen(stu); for clear:=0 to 9 do min[clear]:=0; Zahlenlesen(stu, stuShapes); StuZaehler:=0; end; end;
procedure TForm1.FormCreate(Sender: TObject); var clear : integer; begin minZaehler:=0; stuZaehler:=0; ShapesErzeugen; for clear:= 0 to 9 do begin sek[clear]:=0; min[clear]:=0; stu[clear]:=0; end; end;
procedure ShapesErzeugen; var i, oben, links:integer;begin SetLength(sekShapes, 6); SetLength(minShapes, 6); SetLength(stuShapes, 5); oben:=32; links:=24; for i:=0 to 5 do begin sekShapes[i]:= TShape.Create(nil); sekShapes[i].Parent:=Form1; sekShapes[i].Shape:=stCircle; sekShapes[i].Top:=oben; sekShapes[i].Left:=links; oben:=oben+16; sekShapes[i].Width:=9; end; oben:=32; links:=88; for i:=0 to 5 do begin minShapes[i]:= TShape.Create(nil); minShapes[i].Parent:=Form1; minShapes[i].Shape:=stCircle; minShapes[i].Top:=oben; minShapes[i].Left:=links; oben:=oben+16; minShapes[i].Width:=9; end; oben:=32; links:=166; for i:=0 to 4 do begin stuShapes[i]:= TShape.Create(nil); stuShapes[i].Parent:=Form1; stuShapes[i].Shape:=stCircle; stuShapes[i].Top:=oben; stuShapes[i].Left:=links; oben:=oben+16; stuShapes[i].Width:=9; end; end;
procedure Zahlenlesen(a:array of integer; Shapes:array of TShape); var lauf, Zahl:integer; begin zahl:=length(Shapes); for lauf:= 0 to zahl-1 do begin if a[lauf] = 1 then Shapes[lauf].Brush.Color:=clred; if a[lauf] = 0 then Shapes[lauf].Brush.Color:=clwhite; end; end;
end.
unit BinaeruhrHeader;
interface
function Dualzaehlen (a:array of integer): integer; procedure ZaehlerStellen;
var Nr, Zaehlerb:integer;
implementation
procedure ZaehlerStellen; begin Zaehlerb:=0; end;
function Dualzaehlen (a:array of integer):integer; var lauf:integer; begin if Zaehlerb=0 then begin lauf:=-1; repeat inc(lauf); if a[lauf]=0 then a[lauf]:=1 else a[lauf]:=0; until a[lauf]=1; end; result:=a[Zaehlerb]; inc(Zaehlerb); end; end. |
Vielen Dank für jegliche Antworten und Lösungsvorschläge schon einmal im voraus
euer bluebutton
Moderiert von
Klabautermann: Quote- durch Delphi-Tags ersetzt.
Xion - Di 27.04.10 11:14
:welcome:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
| procedure Zahlenlesen(a:array of integer; var Shapes:array of TShape); var lauf, Zahl:integer; begin zahl:=length(Shapes); for lauf:= 0 to zahl-1 do begin if a[lauf] = 1 then Shapes[lauf].Brush.Color:=clred; if a[lauf] = 0 then Shapes[lauf].Brush.Color:=clwhite; end; end; |
Da muss ein "var" hin. Sonst werden nur innerhalb der procedure die Shapes verändert...und nach Beendigung der procedure wieder verworfen. Der var-parameter sagt, dass die Veränderungen auch nach außen (also in deine globalen Arrays) übernommen werden soll. Ich denke zumindest, dass es daran liegt.
Delete - Di 27.04.10 11:16
Stellt sich natürlich wieder die Frage, warum global? Warum ist die Prozedur keine Methode der Form, wo sie doch offensichtlich auf deren Elemente zugreift. Hätte man gleich ein richtiges Konzept verfolgt, wäre das Problem wahrscheinlich gar nicht aufgetreten.
Xion - Di 27.04.10 11:21
Luckie hat folgendes geschrieben : |
Hätte man gleich ein richtiges Konzept verfolgt, wäre das Problem wahrscheinlich gar nicht aufgetreten. |
bluebutton38 hat folgendes geschrieben : |
ich soll für meinen Informatik-Lehrer eine Binäruhr [...] |
Du warst von Anfang an perfekt, richtig? :mrgreen:
Luckie hat folgendes geschrieben : |
Stellt sich natürlich wieder die Frage, warum global? Warum ist die Prozedur keine Methode der Form, wo sie doch offensichtlich auf deren Elemente zugreift. |
Das Problem wäre das selbe, da für 3 arrays nur eine procedure verwendet wird (weßhalb die Elemente auch als parameter übergeben würden).
Ehrlich gesagt find ich den Programmierstil relativ gut. Ich habe sofort kapiert, wie das Programm funktioniert.
Delete - Di 27.04.10 11:46
Xion hat folgendes geschrieben : |
Du warst von Anfang an perfekt, richtig? :mrgreen: |
Das habe ich nicht behauptet.
Luckie hat folgendes geschrieben : |
Stellt sich natürlich wieder die Frage, warum global? Warum ist die Prozedur keine Methode der Form, wo sie doch offensichtlich auf deren Elemente zugreift. |
Das Problem wäre das selbe, da für 3 arrays nur eine procedure verwendet wird (weßhalb die Elemente auch als parameter übergeben würden).
Ehrlich gesagt find ich den Programmierstil relativ gut. Ich habe sofort kapiert, wie das Programm funktioniert.[/quote]
Aber wenn ich da die ganzen globalen Variablen sehe, dann weiß ich, dass da was nicht stimmt mit dem Konzept.
SvenAbeln - Di 27.04.10 11:54
Sorry
Xion, aber das array shapes wird doch gar nicht verändert, also brauch dort auch kein
var hin.
Aber hier muss eins hin:
Delphi-Quelltext
1:
| function Dualzaehlen(var a: array of integer): integer; |
Im Timer wird diese Funktion 10 mal aufgerufen, aber nur beim erstem mal wird die Zahl erhöht. Bei den 9 anderen aufrufen wird halt wieder mit dem alten Wert (0,0,0,0...) gearbeitet.
So wird das Array wirklich geändert und man braucht dir Prozedur auch nur noch einmal aufrufen:
Delphi-Quelltext
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:
| procedure Dualzaehlen(var a: array of integer); var lauf: integer; begin lauf := -1; repeat inc(lauf); if a[lauf] = 0 then a[lauf] := 1 else a[lauf] := 0; until a[lauf] = 1; end;
procedure TForm13.Timer1Timer(Sender: TObject); var clear, Zaehler: integer; begin ZaehlerStellen; Dualzaehlen(sek);
inc(minZaehler); Zahlenlesen(sek, sekShapes); if minZaehler = 60 then begin ZaehlerStellen; Dualzaehlen(min); inc(stuZaehler); for clear := 0 to 9 do sek[clear] := 0; Zahlenlesen(min, minShapes); minZaehler := 0; end; if stuZaehler = 60 then begin ZaehlerStellen; Dualzaehlen(stu); for clear := 0 to 9 do min[clear] := 0; Zahlenlesen(stu, stuShapes); stuZaehler := 0; end; end; |
bluebutton38 - Di 27.04.10 13:23
Zunächst mal ein herzliches Danke dafür, dass ihr mein Problem gelöst habt und ich bin heilfroh, dass ich jetzt nur noch eine genaue Zeiteinstellung vornehmen muss, also, dass das Programm die momentane Zeit des PCs abliest und diese dann direkt auf die Zeitarrays gibt.
Dann noch ein kleines Wort zu meinem Programmierstil: Ich versuche mir anzugewöhnen selbst gemachte functions und procedures in Header-Dateien zu schreiben, da dadurch meiner Meinung nach der Quellcode übersichtlicher wird, aber bei den zweien, die noch in der MainUnit sitzen, hat Delphi noch ein wenig rumgemeckert, aber das Problem habe ich erst mal hinter das gestellt, das ihr mir gerade beantwortet habt :wink:
Außerdem bin ich eher der Typ, der nicht sofort aufräumt, sondern gegen Ende oder, wenn ich ma kurz ne Denkpause brauch^^, also habe ich manche Variablen noch global vereinbart, obwohl ich sie auch lokal vereinbaren könnte (Ich habe manche global, weil unser Lehrer Initialisierungen mag :roll: , aber ich glaub das mach ich auch ma weg), sowie einige Variablen, die durch andere ersetzt werden könnten.
Delete - Di 27.04.10 13:28
Was verstehst du unter Header-Dateien bei Delphi?
Aber eigentlich sollte man das ganze in eine Klasse verpacken, dann braucht es auch keine globalen Variablen, denn das wären dann private Felder der Klasse.
Und bitte nimm diesen Kommentar:inc(minZaehler); da weg. Das tut in den Augen weh. Inc prüft nichts und stellt auch nichts fest, sondern inkrementiert eine Ganzzahl. Und das muss man nicht kommentieren, das sehe am Code.
Dude566 - Di 27.04.10 13:42
Ich muss
Luckie beipflichten, als ich mit dem Programmieren angefangen habe verwendete ich auch oft globale Variablen, die Folge davon waren ärgerliche Fehlersuchen.;)
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!