| Autor |
Beitrag |
Dude566
      
Beiträge: 1592
Erhaltene Danke: 79
W8, W7 (Chrome, FF, IE)
Delphi XE2 Pro, Eclipse Juno, VS2012
|
Verfasst: Do 15.01.09 15:21
Hi,
wir haben von unserem Lehrer die Aufgabe bekommen, ein Programm zu schreiben mit dem Zufallszahlen erzeugt werden und in eine Datei gespeichert werden.
Also es werden Zufallszahlen erzeugt und in ein statisches Array gespeichert, ich wollte erst ein dynamisches machen, doch der Lehrer meinte das dies schwieriger sei.
Das Speichern in eine Datei scheint auch zu funktionieren, nur die Ausgabe in eine ListBox stellt ein Problem dar. Das Programm stürzt ab.
Was mich auch stört ist das ich dann das komplette Array ausgebe, wie kann ich denn die Anzahl mit in die Datei speichern, ohne einen eigenen Record zu machen.
Denn ich verwende Integer, was ja für Zufallszahlen passend ist.
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:
| var Form1: TForm1; daten : array [1..100000000] of integer; menge_zahlen : integer; i : integer; data : file of integer;
procedure TForm1.FormCreate(Sender: TObject); begin randomize; AssignFile(data,'zufallszahlen.dat'); if FileExists('zufallszahlen.dat') then ReSet(data) else ReWrite(data); end;
procedure TForm1.Button1Click(Sender: TObject); begin menge_zahlen := StrToInt(Edit1.Text); for i := 1 to menge_zahlen do begin daten[i] := random(menge_zahlen)+1; end; assignfile (data, 'Data.dat'); rewrite (data); write (data, daten[i]); closefile (data); end;
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction); begin CloseFile(data); end;
procedure TForm1.Edit1Click(Sender: TObject); begin Edit1.Clear; end;
procedure TForm1.Edit1DblClick(Sender: TObject); begin Edit1.Text := IntToStr(100); end;
procedure TForm1.Button2Click(Sender: TObject); begin ListBox1.Clear; for i := 1 to 100000000 do ListBox1.Items.Add (IntToStr(daten[i])); end;
procedure TForm1.Button3Click(Sender: TObject); begin assignfile (data, 'Daten.dat'); reset (data); read (data, daten[i]); closefile (data); end; |
Bitte schreibt dazu, auf welches Problem ihr eine Lösung habt. 
_________________ Es gibt 10 Gruppen von Menschen: diejenigen, die das Binärsystem verstehen, und die anderen.
|
|
martin300
      
Beiträge: 186
Erhaltene Danke: 2
|
Verfasst: Do 15.01.09 15:37
Hallo,
warum sollen 100 Millionen Einträge in eine Listbox?
|
|
jasocul
      
Beiträge: 6395
Erhaltene Danke: 149
Windows 7 + Windows 10
Sydney Prof + CE
|
Verfasst: Do 15.01.09 15:42
Dude566 hat folgendes geschrieben : | | Das Speichern in eine Datei scheint auch zu funktionieren, nur die Ausgabe in eine ListBox stellt ein Problem dar. Das Programm stürzt ab. |
Bist du sicher?
Oder läuft das Programm einfach furchtbar lange? Bei 100 Mio Einträgen, kann das schon mal dauern, bis das Programm wieder reagiert.
|
|
Dude566 
      
Beiträge: 1592
Erhaltene Danke: 79
W8, W7 (Chrome, FF, IE)
Delphi XE2 Pro, Eclipse Juno, VS2012
|
Verfasst: Do 15.01.09 15:47
Ich habe die 100000000 verwendet da wahrscheinlich keiner mehr Zahlen haben will, außerdem werden nur 100 erzeugt in das Array, allerdings die vollen 100000000 in die ListBox ausgegeben.
Kann das wirklich so lange dauern?
Wie ginge es denn mit einem Dynamischen Array, und was ist mit dem Zählen der Datensätze um alles wieder nachher zu laden.
_________________ Es gibt 10 Gruppen von Menschen: diejenigen, die das Binärsystem verstehen, und die anderen.
|
|
jasocul
      
Beiträge: 6395
Erhaltene Danke: 149
Windows 7 + Windows 10
Sydney Prof + CE
|
Verfasst: Do 15.01.09 15:50
typisierte Dateien
Passt nicht ganz zu deiner Aufgabe, aber das Prinzip ist immer das selbe.
|
|
Nersgatt
      
Beiträge: 1581
Erhaltene Danke: 279
Delphi 10 Seattle Prof.
|
Verfasst: Do 15.01.09 15:54
_________________ Gruß, Jens
Zuerst ignorieren sie dich, dann lachen sie über dich, dann bekämpfen sie dich und dann gewinnst du. (Mahatma Gandhi)
|
|
Marc.
      
Beiträge: 1876
Erhaltene Danke: 129
Win 8.1, Xubuntu 15.10
|
Verfasst: Do 15.01.09 15:59
Dude566 hat folgendes geschrieben : | Ich habe die 100000000 verwendet da wahrscheinlich keiner mehr Zahlen haben will, außerdem werden nur 100 erzeugt in das Array, allerdings die vollen 100000000 in die ListBox ausgegeben.
Kann das wirklich so lange dauern? |
Ja, weil jedes mal die Listbox neu gezeichnet wird. Besser die Daten zunächst in einer Stringlist zusammenfassen und anschließend der Listbox übergeben.
Noch etwas:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7:
| procedure TForm1.Button3Click(Sender: TObject); begin assignfile (data, 'Daten.dat'); reset (data); read (data, daten[i]); closefile (data); end; |
Das i könnte bei dem Aufruf irgendeinen Wert haben.
Klickst du zunächst auf den Button1, steht in i "menge_zahlen", nach einem Klick auf Button2 jedoch "10000000".
Bist du nicht auch der Meinung, dass dieser Stil mit den globalen Variablen nichts taugt? 
|
|
Dude566 
      
Beiträge: 1592
Erhaltene Danke: 79
W8, W7 (Chrome, FF, IE)
Delphi XE2 Pro, Eclipse Juno, VS2012
|
Verfasst: Do 15.01.09 16:03
@ Nersgatt : Wie ein Dynamisches Array aufgebaut ist weis ich, jedoch meinte unser Lehrer das es hier in dieser Anwendung zu umständlich wäre.
Also wie gehts? 
_________________ Es gibt 10 Gruppen von Menschen: diejenigen, die das Binärsystem verstehen, und die anderen.
|
|
Yogu
      
Beiträge: 2598
Erhaltene Danke: 156
Ubuntu 13.04, Win 7
C# (VS 2013)
|
Verfasst: Do 15.01.09 16:18
Dude566 hat folgendes geschrieben : | | @ Nersgatt : Wie ein Dynamisches Array aufgebaut ist weis ich, jedoch meinte unser Lehrer das es hier in dieser Anwendung zu umständlich wäre. |
Ich habe keine Ahnung, was er damit meinte. Tatsache ist, dass dein Array über 381 MB Arbeitsspeicher belegt.
Dude566 hat folgendes geschrieben : | Also wie gehts?  |
Eigentlich ganz einfach:
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:
| var Form1: TForm1; daten : array of integer; i : integer; data : file of integer;
procedure TForm1.Button1Click(Sender: TObject); begin SetLength(daten, StrToInt(Edit1.Text); for i := Low(daten) to High(daten) do begin daten[i] := random(Length(daten))+1; end; assignfile (data, 'Data.dat'); rewrite (data); write (data, daten[i]); closefile (data); end;
procedure TForm1.Button2Click(Sender: TObject); begin ListBox1.Items.BeginUpdate; try ListBox1.Clear; for i := Low(daten) to High(daten) do ListBox1.Items.Add (IntToStr(daten[i])); finally ListBox1.Items.EndUpdate; end; end;
|
Low und High solltest du für dynamische Arrays verwenden, um sichergehen zu können, dass du auch beim richtigen Index anfängst. Das BeginUpdate - EndUpdate sorgt dafür, dass die ListBox während dem Einlesen nicht neu gezeichnet wird. Und siehe da - die Werte sollten nahezu sofort erscheinen
Grüße,
Yogu
|
|
Dude566 
      
Beiträge: 1592
Erhaltene Danke: 79
W8, W7 (Chrome, FF, IE)
Delphi XE2 Pro, Eclipse Juno, VS2012
|
Verfasst: Do 15.01.09 18:50
Hey Danke!!! So hatte ich vorher auch fast bis ich es dann mit einem statischen gemacht hatte.
So Problem erstmal gelöst...
Mal sehen was zu diesem Thema vielleicht noch anfällt.
Edit: Mir ist gerade ein Bug aufgefallen, und zwar will er bei einem neuen Start des Programms 1. nicht die Daten laden, und 2. beim Klick auf den Ladebutton auch nicht.
Es kommt folgende Fehlermeldung: "E/A-Fehler 998".
Diese Meldung habe ich noch nie gesehen.
_________________ Es gibt 10 Gruppen von Menschen: diejenigen, die das Binärsystem verstehen, und die anderen.
|
|
Yogu
      
Beiträge: 2598
Erhaltene Danke: 156
Ubuntu 13.04, Win 7
C# (VS 2013)
|
Verfasst: Do 15.01.09 19:59
Dude566 hat folgendes geschrieben : | | "E/A-Fehler 998" |
Nur für den, der sich dafür interessiert: Die Meldung lautet "Unzulässiger Zugriff auf einen Speicherbereich". Ich habe allerdings keine Ahnung, was es damit auf sich hat. Tut mir leid
Edit: In welcher Zeile wird denn der Fehler ausgelöst?
|
|
Marc.
      
Beiträge: 1876
Erhaltene Danke: 129
Win 8.1, Xubuntu 15.10
|
Verfasst: Do 15.01.09 20:14
|
|
Nersgatt
      
Beiträge: 1581
Erhaltene Danke: 279
Delphi 10 Seattle Prof.
|
Verfasst: Fr 16.01.09 07:14
Dude566 hat folgendes geschrieben : | | @ Nersgatt : Wie ein Dynamisches Array aufgebaut ist weis ich, jedoch meinte unser Lehrer das es hier in dieser Anwendung zu umständlich wäre. |
Mich würde mal wirklich eine Musterlösung von Deinem Lehrer interessieren. Wird es sowas geben? Wenn ja, dann poste es mal hier. Wenn nein, dann bitte ihn um eine Musterlösung.
Der Rest ist ja schon geklärt.
_________________ Gruß, Jens
Zuerst ignorieren sie dich, dann lachen sie über dich, dann bekämpfen sie dich und dann gewinnst du. (Mahatma Gandhi)
|
|
Dude566 
      
Beiträge: 1592
Erhaltene Danke: 79
W8, W7 (Chrome, FF, IE)
Delphi XE2 Pro, Eclipse Juno, VS2012
|
Verfasst: So 25.01.09 16:55
So ich habe da jetzt nochmal eine Frage:
In einem Projekt sagt er mir: "Record, Objekt oder Klassentyp erforderlich"
"'END' erwartet, aber Dateiende gefunden"
Doch wo fehlt ein END, und was ist mit Problem 1?
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:
| TDaten = record name : string[64]; vorname : string[64]; alter : integer; wohnort : string[64]; end;
var Form1: TForm1; datei : file of TDaten; daten : array [1..100] of TDaten; counter : integer; pointer : integer;
procedure TForm1.Button5Click(Sender: TObject); var i,j : integer; hilf : TDaten; begin if CheckBox1.Checked then begin ListBox1.Clear; ListBox2.Clear; ListBox3.Clear; ListBox4.Clear; for j := 1 to counter do begin for i := 1 to counter-1 do begin if daten[i].name > daten[i+1].name then begin hilf := daten[i]; daten[i] := daten[i+1]; daten[i+1] := hilf; end; end; end; for i := 1 to counter do begin ListBox1.Items.Add(daten[i].name); ListBox2.Items.Add(daten[i].vorname); ListBox3.Items.Add(IntToStr(daten[i].alter)); ListBox4.Items.Add(daten[i].wohnort); end; if CheckBox2.Checked then begin ListBox1.Clear; ListBox2.Clear; ListBox3.Clear; ListBox4.Clear; for j := 1 to counter do begin for i := 1 to counter-1 do begin if daten[i].vorname > daten[i+1].vorname then begin hilf := daten[i]; daten[i] := daten[i+1]; daten[i+1] := hilf; end; end; end; for i := 1 to counter do begin ListBox1.Items.Add(daten[i].name); ListBox2.Items.Add(daten[i].vorname); ListBox3.Items.Add(IntToStr(daten[i].alter)); ListBox4.Items.Add(daten[i].wohnort); end; if CheckBox3.Checked then begin ListBox1.Clear; ListBox2.Clear; ListBox3.Clear; ListBox4.Clear; for j := 1 to counter do begin for i := 1 to counter-1 do begin if daten[i].alter > daten[i+1].alter then begin hilf := daten[i]; daten[i] := daten[i+1]; daten[i+1] := hilf; end; end; end; for i := 1 to counter do begin ListBox1.Items.Add(daten[i].name); ListBox2.Items.Add(daten[i].vorname); ListBox3.Items.Add(IntToStr(daten[i].alter)); ListBox4.Items.Add(daten[i].wohnort); end; if CheckBox4.Checked then begin ListBox1.Clear; ListBox2.Clear; ListBox3.Clear; ListBox4.Clear; for j := 1 to counter do begin for i := 1 to counter-1 do begin if daten[i].wohnort > daten[i+1].wohnort then begin hilf := daten[i]; daten[i] := daten[i+1]; daten[i+1] := hilf; end; end; end; for i := 1 to counter do begin ListBox1.Items.Add(daten[i].name); ListBox2.Items.Add(daten[i].vorname); ListBox3.Items.Add(IntToStr(daten[i].alter)); ListBox4.Items.Add(daten[i].wohnort); end; end;
end. |
_________________ Es gibt 10 Gruppen von Menschen: diejenigen, die das Binärsystem verstehen, und die anderen.
|
|
Yogu
      
Beiträge: 2598
Erhaltene Danke: 156
Ubuntu 13.04, Win 7
C# (VS 2013)
|
Verfasst: So 25.01.09 16:58
Dude566 hat folgendes geschrieben : | In einem Projekt sagt er mir: "Record, Objekt oder Klassentyp erforderlich"
"'END' erwartet, aber Dateiende gefunden" |
In welcher Zeile werden diese Fehler ausgelöst?
|
|
Boldar
      
Beiträge: 1555
Erhaltene Danke: 70
Win7 Enterprise 64bit, Win XP SP2
Turbo Delphi
|
Verfasst: So 25.01.09 16:58
naja, du musst schon verraten, in welcher Zeile der Fehler auftritt...
|
|
Dude566 
      
Beiträge: 1592
Erhaltene Danke: 79
W8, W7 (Chrome, FF, IE)
Delphi XE2 Pro, Eclipse Juno, VS2012
|
Verfasst: So 25.01.09 17:01
Nach dem letzten END, in meinem kompletten Code also Zeile 247 und 249.
In Zeile 247 steht das End, und in 249 logischer Weise nichts.
_________________ Es gibt 10 Gruppen von Menschen: diejenigen, die das Binärsystem verstehen, und die anderen.
|
|
Marc.
      
Beiträge: 1876
Erhaltene Danke: 129
Win 8.1, Xubuntu 15.10
|
Verfasst: So 25.01.09 17:02
|
|
jaenicke
      
Beiträge: 19346
Erhaltene Danke: 1754
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: So 25.01.09 17:04
Dude566 hat folgendes geschrieben : | | Doch wo fehlt ein END |
Rück richtig ein und schreib die begins nicht versteckt hinten in die Zeile, dann siehst du das auch selbst...
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:
| TDaten = record name: string[64]; vorname: string[64]; alter: integer; wohnort: string[64]; end;
var Form1: TForm1; datei : file of TDaten; daten : array [1..100] of TDaten; counter : integer; pointer : integer;
procedure TForm1.Button5Click(Sender: TObject); var i,j : integer; hilf : TDaten; begin if CheckBox1.Checked then begin ListBox1.Clear; ListBox2.Clear; ListBox3.Clear; ListBox4.Clear; for j := 1 to counter do begin for i := 1 to counter-1 do begin if daten[i].name > daten[i+1].name then begin hilf := daten[i]; daten[i] := daten[i+1]; daten[i+1] := hilf; end; end; end; for i := 1 to counter do begin ListBox1.Items.Add(daten[i].name); ListBox2.Items.Add(daten[i].vorname); ListBox3.Items.Add(IntToStr(daten[i].alter)); ListBox4.Items.Add(daten[i].wohnort); end; if CheckBox2.Checked then begin ListBox1.Clear; ListBox2.Clear; ListBox3.Clear; ListBox4.Clear; for j := 1 to counter do begin for i := 1 to counter-1 do begin if daten[i].vorname > daten[i+1].vorname then begin hilf := daten[i]; daten[i] := daten[i+1]; daten[i+1] := hilf; end; end; end; for i := 1 to counter do begin ListBox1.Items.Add(daten[i].name); ListBox2.Items.Add(daten[i].vorname); ListBox3.Items.Add(IntToStr(daten[i].alter)); ListBox4.Items.Add(daten[i].wohnort); end; if CheckBox3.Checked then begin ListBox1.Clear; ListBox2.Clear; ListBox3.Clear; ListBox4.Clear; for j := 1 to counter do begin for i := 1 to counter-1 do begin if daten[i].alter > daten[i+1].alter then begin hilf := daten[i]; daten[i] := daten[i+1]; daten[i+1] := hilf; end; end; end; for i := 1 to counter do begin ListBox1.Items.Add(daten[i].name); ListBox2.Items.Add(daten[i].vorname); ListBox3.Items.Add(IntToStr(daten[i].alter)); ListBox4.Items.Add(daten[i].wohnort); end; if CheckBox4.Checked then begin ListBox1.Clear; ListBox2.Clear; ListBox3.Clear; ListBox4.Clear; for j := 1 to counter do begin for i := 1 to counter-1 do begin if daten[i].wohnort > daten[i+1].wohnort then begin hilf := daten[i]; daten[i] := daten[i+1]; daten[i+1] := hilf; end; end; end; for i := 1 to counter do begin ListBox1.Items.Add(daten[i].name); ListBox2.Items.Add(daten[i].vorname); ListBox3.Items.Add(IntToStr(daten[i].alter)); ListBox4.Items.Add(daten[i].wohnort); end; end;
end. |
Zuletzt bearbeitet von jaenicke am So 25.01.09 17:04, insgesamt 1-mal bearbeitet
|
|
Dude566 
      
Beiträge: 1592
Erhaltene Danke: 79
W8, W7 (Chrome, FF, IE)
Delphi XE2 Pro, Eclipse Juno, VS2012
|
Verfasst: So 25.01.09 17:04
Ok jetzt fehlt aber scheinbar immer noch eins, denn jetzt tritt der selbe Fehler in Zeile 248 und 250 auf.
Ich habe schon zulange jetzt auf den Text geschaut, ich finde es einfach nicht.
_________________ Es gibt 10 Gruppen von Menschen: diejenigen, die das Binärsystem verstehen, und die anderen.
|
|
|