Problem xp - win7

Für Fragen rund um die Ide und zum Debugger
Mathias
Beiträge: 6165
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Problem xp - win7

Beitrag von Mathias »

Das sind 160MB, und das könnte zuviel sein?

Dies ist auch auf einem aktuellen 32Bit Rechner kein Problem.

Was wohl das Problem in meinem Record ist eine Byte Array. 5000 mal 32000 Bytes.

Brauchst du da zwingend eine statische Array ?
Ansonsten nimmt man dafür eine dynamische Array. Da du diese in einem Record hast, schreibt man dann die Daten mit einem FileStream.

Danke für den Tipp mit dem f.

Das müsste dann so aussehen:

Code: Alles auswählen

type
  TDat = array[0..120] of byte;
var
  Dat: TDat;
  fDat: file of TDat;
begin
  AssignFile(fDat, 'test.dat');
  Rewrite(fDat);
  Write(fDat, Dat);
  CloseFile(fDat);
end;
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Marc
Lazarusforum e. V.
Beiträge: 208
Registriert: Fr 11. Nov 2016, 14:09
OS, Lazarus, FPC: Linux Mint 20 (WinXP VBox)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Problem xp - win7

Beitrag von Marc »

Dynamische Array kenne ich noch überhaupt nicht.

Meine Array bildet eine einfache Fläche mit Bildpunkten.
Ich brauche also eine x und eine y Komponente. Und einfachen Zugriff auf alle Punkte.
Nachteil ist natürlich das ich immer den maximalen Platz brauche.
Komme ich mit weniger aus ist der Rest einfach unbenutzt.
Mit den heutigen Harddisks ja kein Problem mehr.
Aber klar professionell programmiert ist anders.

Dein Beispiel kapiere ich nicht ganz.
Das ist doch eine eindimensionale Array mit 121 Byte?
Good code comes from experience, experience comes from bad code.

Mathias
Beiträge: 6165
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Problem xp - win7

Beitrag von Mathias »

Das ist doch eine eindimensionale Array mit 121 Byte?

Dies war auch nur als Beispiel für das "f" .

Dynamische Array kenne ich noch überhaupt nicht.

Dies ist eine Array, bei welcher man zur Laufzeit die Grösse bestimmen kann.

Ich brauche also eine x und eine y Komponente. Und einfachen Zugriff auf alle Punkte.
Nachteil ist natürlich das ich immer den maximalen Platz brauche.
Komme ich mit weniger aus ist der Rest einfach unbenutzt.

Die Deklaration sieht dann so aus:

Code: Alles auswählen

type
  TPixel = array of array of byte;
var
  Pixel: TPixel;
begin
  SetLength(Pixel, 320, 200);
  // grösser
  SetLength(Pixel, 640, 400);
  // kleiner
  SetLength(Pixel, 160, 100);
  // Speicher frei geben
  SetLength(Pixel, 0, 0);   

Wen du willst kann ich dir noch zeigen, wie man so etwas auf die Platte schreibt.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Marc
Lazarusforum e. V.
Beiträge: 208
Registriert: Fr 11. Nov 2016, 14:09
OS, Lazarus, FPC: Linux Mint 20 (WinXP VBox)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Problem xp - win7

Beitrag von Marc »

Jetzt hab ich das kapiert. :-)

Das mit der dynamischen Array sieht sehr interessant aus.
Habe ja schon davon gehört. Aber schon gar nicht getraut danach zu suchen.
So wie Du das schreibst sieht das übersichtlich aus. Muss ich ausprobieren.

Ja bein einlesen von der Harddisk muss ich dann schon wissen wie gross es ist sonst gibt Aerger. :-)

Aber es ist ja sowieso ein teil eines grösseren Records.
Da muss ich die information der Grösse einfach vorher schon eingelesen haben.
Nehme ich an. Muss das gleich mal probieren.

Wenn Du soviel Zeit hast? Ich bin ich für jede Hilfe dankbar.

Habe es sehr eilig etwas Funktionales zusammenzustellen.
Erst wenn das Programm so halbwegs macht was meine Kunden brauchen, kann ich es verkaufen, und erst dann kann ich mir eigentlich die Entwicklung leisten.
So das klassische Henne - Ei Problem.
Good code comes from experience, experience comes from bad code.

Mathias
Beiträge: 6165
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Problem xp - win7

Beitrag von Mathias »

Da muss ich die information der Grösse einfach vorher schon eingelesen haben.

Genau so etwa läuft dies.

Zuerst schreibt man die Länge, anschliessend die Daten.

Beim Lesen kommt auch zuerst die Längenangabe, und somit wie man wie gross der Datenblock ist.
Die Länge der Array kann man mit Length(???) auslesen.

Aber da du sowieso ein Record hast, dann würde ich dort die Länge und Breite speichern. Dies macht es ein wenig einfacher.

Eine kleine Einschränkung hat das Ganze, du muss die Elemente deines Recordes einzeln speicher, als ganzer Block geht es nicht mehr, aber dies sollte das kleinste Problem sein.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Antworten