Entwickler-Ecke

Algorithmen, Optimierung und Assembler - array of Byte verändern+TFileStream.WriteBuffer


JayEff - Mi 18.05.05 16:27
Titel: array of Byte verändern+TFileStream.WriteBuffer
Tach Leute,
im Endeffekt wollte ich eine Procedure schreiben, die mir eine Datei verschlüsselt. Das Schreiben von einer Datei in die Nächste klappt, solange ich die markierte Stelle weglasse. Wenn ich sie dazu mache, dann schreibt er den Inhalt der Datei in fs2, unverändert, und beim Beenden des Programms gibts ne ungültige Zeigeroperation. THEORETISCH würde ja aus a b werden und so weiter, aber das klappt nicht.

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
Var
    fs, fs2: TFileStream;
    Puffer: Array Of Byte;
    i, size: integer;
Label
    ende;
begin
{...}
        SetLength(Puffer, size+1);
        For i := 0 To size-1 Do
        Begin
            Application.ProcessMessages;
            If stop Then
                Goto ende;
            ProgressBar1.StepIt;
            ProgressBar2.StepIt;
            fs.ReadBuffer(Puffer, 1);
            Puffer[i]:=Puffer[i]+1//hier!
            fs2.WriteBuffer(Puffer, 1);
        End;

Woran könnte es liegen? Ich kenn mich mit Array of Byte und TFileStream nich so dolle aus... Danke schonmal!
[edit: Titel geändert.. :oops:]


Heiko - Mi 18.05.05 17:04

Versuch mal es mal mit:


Delphi-Quelltext
1:
SetLength(Puffer, size+2);                    


Es müsste daran liegen, dass du auf ein nicht existierendes Elemet zugreifst. Gib mal deine genaue Fehlermeldung durch, wenn es das Problem nicht beseitigt.


JayEff - Mi 18.05.05 17:06

hm.. einich ja nich, da ich nur auf elemente von 0 bis size-1 zu greife, das array geht aber von 0 bis size. Anbei die Fehlermeldung, auf wunsch. Die kommt immer beim schließen.


Heiko - Mi 18.05.05 17:12

Ich habe gerade deinen Quelltext noch einmal überdacht. Am Setlength liegt es doch nicht. Mir ist dafür etwas anderes aufgefallen.

user profile iconJayEff hat folgendes geschrieben:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
Var
    fs, fs2: TFileStream;
    Puffer: Array Of Byte;
    i, size: integer;
Label
    ende;
begin
{...}
        SetLength(Puffer, size+1);
        For i := 0 To size-1 Do
        Begin
            Application.ProcessMessages;
            If stop Then
                Goto ende;
            ProgressBar1.StepIt;
            ProgressBar2.StepIt;
            fs.ReadBuffer(Puffer[i]1);
            Puffer[i]:=Puffer[i]+1//hier!
            fs2.WriteBuffer(Puffer[i]1);
        End;


Probier es mal damit. Die Variante ist aber nicht wirklich effektiv. Du solltest lieber immer k*512 Bytes auslesen(k € N). Und ich weiß auch nicht, warum du das in ein Array einspeicherst, wenn du nur 1 Byte ausliest und den dann sofort woanders wieder hinschreibst.


JayEff - Mi 18.05.05 17:24

LOL???? ok, daran lags oO jetzt klappts... komisch, dass es vorher klappte... oO


Heiko - Mi 18.05.05 17:28

Das Thema hier [http://www.delphi-forum.de/viewtopic.php?t=28905&postdays=0&postorder=asc&start=0] dürfte dich auch interessieren, damit du deine Performance erheblich bergrößern kannst.