Autor Beitrag
Jakob Schöttl
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 929
Erhaltene Danke: 1


Delphi 7 Professional
BeitragVerfasst: So 23.04.06 13:12 
Hallo,
Ich hab mal so ne art enigma programmiert und will sie jetzt optimieren,
indem ich die Baupläne nicht mehr in INIDateien speichere, sonder bloß
noch die Werte (also ohne <Eigenschaft> = <Wert>).

Dazu muss ich in der Datei lauter Zufallszahlen von 0 bis 255 speichern
und jede zahl darf nur einmal vorkommen.

Das hab ich so gemacht, vom Prinzip her gut finde ich:

ausblenden 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:
procedure TForm1.Button1Click(Sender: TObject);

const filename = 'c:\dokumente und einstellungen\jakob\eigene dateien\pascal\delphi\chiffre06\Bauplaene\WBpA.bpl';

var arr: array of byte;
    n,byt,rand: byte;
    Geschriebene: integer;

begin
  With TFileStream.Create(filename,fmCreate) do try
    Randomize;
    SetLength(arr,256);
    for n := 0 to 255 do arr[n] := n;    //hier wird das array mit jeder Zahl von 0 bis 255 einmal belegt
    for n := 0 to 255 do begin      
      rand := Random(Length(arr));    //Zufallszahl < als Länge des arrays
      byt := arr[rand];        //der Wert der in der Datei stehen soll ist ein zufälliges element der datei
      arr[rand] := arr[Length(arr) - 1];  //das schon verwendete Byte durch das letzte Element ersetzt
      SetLength(arr,Length(arr) - 1);    //Array wird um 1 verkürzt

      Geschriebene := Write(byt,1);    //Geschriebene ist immer 1, wie es sein soll
      ListBox1.items.Add(intTostr(byt));  //Hier wird das byt angehängt
    end;
  finally
    Free;
  end;
end;


Mein Problem ist nun, dass in der Datei dann nur 128 Zeichen Stehen statt 256
und die Zeichen nicht die richtigen Werte haben.
In der ListBox1 steht es aber so wie ich es haben will und beim Debuggen hat
byt auch immer den richtigen wert.

ich bin mit meiner Weisheit am ende und nicht einmal mein Papa weiß woran das
liegt!

Ich wäre euch dankbar, wenn ihr den Quellcode kopieren könntet und vielleicht
mal bei euch testen könntet und vielleicht einen Fehler findet. Dazu müsst ihr
natürlich "filename" ändern.

Moderiert von user profile iconGausi: Delphi-Tags hinzugefügt
Marco D.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 2750

Windows Vista
Delphi 7, Delphi 2005 PE, PHP 4 + 5 (Notepad++), Java (Eclipse), XML, XML Schema, ABAP, ABAP OO
BeitragVerfasst: So 23.04.06 13:26 
Warum verwendest du nicht SaveToFile? :roll:
ausblenden Delphi-Quelltext
1:
Listbox1.SaveToFile('C:/blubb.txt');					

_________________
Pascal keeps your hand tied. C gives you enough rope to hang yourself. C++ gives you enough rope to shoot yourself in the foot
Jakob Schöttl Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 929
Erhaltene Danke: 1


Delphi 7 Professional
BeitragVerfasst: So 23.04.06 17:17 
Titel: re
ich nehm das savetofile nicht, weil ich das programm ja optimieren möchte. mit savetofile aber müsste ich beim öffnen wieder die function strToInt aufrufen.
Ich wollte die Werte eigentlich in einer typisierten Datei mit lauter bytewerten speichern.
Kroko
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1284

W98 W2k WXP
Turbo D
BeitragVerfasst: Mo 24.04.06 12:19 
Bei mir stehen in der Datei 256 Zeichen!

//EDIT:
ich habe mal die Procedure etwas überarbeitet:

ausblenden volle Höhe 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:
const
  coFilename = 'D:\WBpA.dat';

var
  Arr: array[Byte] of byte;
  A,B,H,N: Byte;
  I: Integer;

begin
  Randomize;
  With TFileStream.Create(cofilename,fmCreate) do
  try
    for I := 0 to 255 do Arr[I] := I;    //hier wird das array mit jeder Zahl von 0 bis 255 einmal belegt
    for I := 0 to 1023 do
    begin
      A := Random(256);
      B := Random(256);
      H := Arr[A];
      Arr[A] := Arr[B];
      Arr[B] := H;
    end;
    // zum Testen bzw zum Eintrag in die ListBox
    for I := 0 to 255 do begin
      Write(Arr[I],1);    //Geschriebene ist immer 1, wie es sein soll
      ListBox1.Items.Add(IntTostr(Arr[I]));  //Hier wird das byt angehängt
    end;
    // sonst 
    // Write (Arr[0],256);
  finally
    Free;
  end;
end;
Einloggen, um Attachments anzusehen!
_________________
Die F1-Taste steht nicht unter Naturschutz und darf somit regelmäßig und oft benutzt werden! oder Wer lesen kann, ist klar im Vorteil!
Jakob Schöttl Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 929
Erhaltene Danke: 1


Delphi 7 Professional
BeitragVerfasst: Mo 24.04.06 18:01 
Titel: re
Ich glaub dir, dass in deiner datei 256 Zeichen stehen.
Ich hab gestern noch herausgefunden, dass der Windows-Editor die Datei irgendwie falsch anzeigt.
Wie gesagt der Editor zeigt folgendes and: Es stehen 128 Zeichen und auch nicht die, die eigentlich drin stehen müssten.

Aber ich hab alle Bytes mit TFileStream.Read in eine ListBox eingelesen und in der Listbox stehen aus einem unerfindlichen grund **die richtigen Werte** genauso, wie ich es wollte.

Ich weiß nicht, warum der editor so was komisches anzeigt? Aber egal, hauptsache es geht mit Delphi!

Danke