Delphi-PRAXiS
Seite 2 von 5     12 34     Letzte »    

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi Binärdatei Record auslesen\zuweisen (https://www.delphipraxis.net/196036-binaerdatei-record-auslesen%5Czuweisen.html)

Zacherl 17. Apr 2018 13:09

AW: Binärdatei Record auslesen\zuweisen
 
Sieht hier aber so aus, als ob das standard Alignment (von 4?) korrekt wäre. Die Pfade der hinteren Einträge des Arrays stimmen ja bis aufs letzte Byte exakt. Sicher, dass
Delphi-Quellcode:
volume
an der Stelle 50 sein muss?

himitsu 17. Apr 2018 13:17

AW: Binärdatei Record auslesen\zuweisen
 
Zitat:

Zitat von Zacherl (Beitrag 1399532)
Sieht hier aber so aus, als ob das standard Alignment (von 4?) korrekt wäre.

Njain.

Es war mal vor Jahren 4 und in etwas aktuelleren Delphis ist es 8 (für Windows ... in anderen OS vielleicht anders)

http://docwiki.embarcadero.com/RADSt...chten_(Delphi)

PS:
http://docwiki.embarcadero.com/RADSt...chten_(Delphi)
http://docwiki.embarcadero.com/RADSt...Types_(Delphi)


ALIGN gibt aber nur die "maximale" Ausrichtung an.
Kleiner Typen werden an ihrer Größe ausgerichtet.
> WORD alle 2 Byte (außer &Align ist unter 2)
> Interger alle 4 Byte, also nach einem WORD bliebe eine Lücke von 2

EWeiss 17. Apr 2018 13:19

AW: Binärdatei Record auslesen\zuweisen
 
Zitat:

PS: das "gute" alte file of TMyRecord funktioniert immernoch.
Wie meinst du das?

Zitat:

Sieht hier aber so aus, als ob das standard Alignment (von 4?) korrekt wäre. Die Pfade der hinteren Einträge des Arrays stimmen ja bis aufs letzte Byte exakt. Sicher, dass volume an der Stelle 50 sein muss?
Ich habe die Regler in Fly auf 50% gesetzt von daher müsste es stimmen.

Habe alles versucht.
Delphi-Quellcode:
  {$Align On}
  {$ALIGN 8}
  TSTChannel = record
    ID         : Integer;
    streamName : Array [0..250] of AnsiChar;
    freq       : single;
    volume     : single;
    pan        : single;
    mute       : byte;
    solo       : byte;
    duration   : Integer;
    percent    : Integer;
    grouplevel : single;
    led        : byte;
    rMeterValue : single;
    reserved   : Array [0..25] of AnsiChar;
  end;

  {$Align Off}
Delphi-Quellcode:
Array [0..250] of AnsiChar;


Auf
Delphi-Quellcode:
Array [0..MAX_PATH] of AnsiChar;


dann kracht es.

gruss

himitsu 17. Apr 2018 13:27

AW: Binärdatei Record auslesen\zuweisen
 
Zitat:

Zitat von EWeiss (Beitrag 1399535)
Wie meinst du das?

http://docwiki.embarcadero.com/RADSt...d_Input-Output
Delphi-Quellcode:
var F: file of TSTChannel;


Zitat:

Delphi-Quellcode:
  {$Align On}
  {$ALIGN 8}

Eines reicht. Es ist Alles das Gleiche.
Delphi-Quellcode:
{$A+} = {$ALIGN ON} = {$ALIGN 8} wobei 8 der DEFAULT ist
{$A-} = {$ALIGN OFF} = {$ALIGN 1}
Delphi-Quellcode:
  {$ALIGN 8}  // ab hier 8
  TSTChannel = record
     ..
  end;
  {$ALIGN ON} // ab hier wieder DEFAULT

EWeiss 17. Apr 2018 13:33

AW: Binärdatei Record auslesen\zuweisen
 
Zitat:

var F: file of TSTChannel;
Ach so meinst du da.. Danke ;)
Aber ich benötige ein Array.

gruss

himitsu 17. Apr 2018 13:34

AW: Binärdatei Record auslesen\zuweisen
 
Das ist ein Array bzw. eine Liste. :zwinker:

FileSize = Anzahl der Records, also in der API für diese "Typed Files"
FilePos = Index des Record

FileSize und FilePos werden intern auf RecSize umgerechnet. Delphi-Referenz durchsuchenSystem.Rewrite, wobei bei TypedFiles standardmäßig das dem SizeOf(DeinRecord) entspricht.


Delphi-Quellcode:
file of AnsiChar
=
Delphi-Quellcode:
Text
= eine Textdatei

EWeiss 17. Apr 2018 13:48

AW: Binärdatei Record auslesen\zuweisen
 
Du meinst wenn ich dich richtig verstehe anstelle von CreateFile..
Nur das löst mein Problem nicht.

Letztendlich ein Ersatz für die WinApi32.

gruss

himitsu 17. Apr 2018 13:57

AW: Binärdatei Record auslesen\zuweisen
 
Drum hatte ich es eigentlich auch nur nebenbei erwähnt.

Aber ansonsten wurde auch schon alles Wichtige genannt.
* die Speicherausrichtung
* die Art der Typen (z.B. AnsiChar und WideChar, aber nicht Char)

Arrays werden wie ihr enthaltener Typ ausgerichtet, außer bei "packed array",
und bei Records wie ihr größter Typ, außer bei "packed record".

EWeiss 17. Apr 2018 14:08

AW: Binärdatei Record auslesen\zuweisen
 
Zitat:

Zitat von himitsu (Beitrag 1399544)
Drum hatte ich es eigentlich auch nur nebenbei erwähnt.

Aber ansonsten wurde auch schon alles Wichtige genannt.
* die Speicherausrichtung
* die Art der Typen (z.B. AnsiChar und WideChar, aber nicht Char)

Arrays werden wie ihr enthaltener Typ ausgerichtet, außer bei "packed array",
und bei Records wie ihr größter Typ, außer bei "packed record".

Danke für die Infos.
Das ist wieder ein fall wo ich mir nur selber helfen kann..

Also nochmal Danke an alle die versucht haben für mich mitzudenken. :)

gruss

Jasocul 17. Apr 2018 14:29

AW: Binärdatei Record auslesen\zuweisen
 
So, noch mal kurz vor Feierabend ins Forum geschaut.

Dein Record hat 312 Byte. Die Blöcke in der Datei sind 320 Byte groß.

Wenn ich das richtig in Erinnerung habe, sind Records standardmäßig nicht gepackt. In Turbo-Pascal war das noch anders. :)

Entweder ist dein Record falsch definiert oder die Speicher-Ausrichtung passt nicht. Ich habe das nicht exakt nachgerechnet, aber ich meine, dass die Ausrichtung zu einer Verschiebung um 10 Byte führen sollte. Das passt dann immer noch nicht zu den 320 Byte.

Lies das doch mal in Blockgrößen (Record of Array [0..319] definieren) zu 320 Byte ein und teste Stückweise, wie es in den geplanten Record passt.
Klassisches Beispiel für einen varianten Record.


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:01 Uhr.
Seite 2 von 5     12 34     Letzte »    

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz