ich habe Daten, die in einen alten C-Programm in der folgende Struktur vorgehalten und als solche direkt binär gespeichert wurden:
Code: Alles auswählen
struct rl_date
{
char vers[6]; /* Versionsstring zur Erkennung (max. 5 Zeichen!!)*/
char name[128]; /* Name der Maschine */
/* allg. Maschienendaten */
double gewicht; /* Gesamtgewicht (fahrfertig) in kg */
double sx; /* Koordinaten des Schwerpunktes (m) */
double sy;
double radst; /* Radstand (m) */
double flaeche; /* Frontfl<E4>che (m^2) */
double cw; /* cw-Wert */
double umfang; /* Umfang des Antriebsrades (m) */
double mu; /* Haftkoef. Rad-Stra<DF>e */
/* Getriebe- und Antriebsdaten */
double i_prim; /* Prim<E4>r<FC>bersetzung */
int z_ritz; /* # Z<E4>hne Ritzel */
int z_blatt; /* # Z<E4>hne Kettenblatt */
int gaenge; /* # G<E4>nge */
double i_getr[MAXGANG];/* die Getriebe-<DC>bersetzungen */
double i_ges[MAXGANG]; /* die Gesamt-<DC>bersetzungen */
double n_kuppl; /* Einkupplungsdrehzahl (U/min) */
double n_schalt; /* Schaltdrehzahl (U/min)*/
/* Kennlinien-Daten */
int pnt; /* # St<FC>tzpunkte */
double n[MAXPNT]; /* Array mit den Drehzahlen */
double n_max; /* Maximal-Drehzahl */
double p[MAXPNT]; /* Array mit der Leistung dazu */
double p_max; /* maximale Leistung */
double n_p_max; /* Drehzahl von P_max */
double m[MAXPNT]; /* Array mit dem Drehmoment */
double m_max; /* maximales Drehmoment */
double n_m_max; /* Drehzahl von M_max */
/* Umwelt-Daten */
double steigung; /* Hangsteigung (%) */
double wind; /* Windgeschwindigkeit (km/s) */
double fahrer; /* Gewicht des Fahrers (kg) */
double zuladung; /* Zuladung (kg) */
};
Diese versuche ich jetzt in einem FreePascal-Programm wieder einzulesen und habe dazu folgende Struktur definiert:
Code: Alles auswählen
type
TRoadLoadData = record
Vers : array[0..5] of char;
//Name : string[127];
Name : array[0..127] of char;
//dummy1, dummy2 : char;
Gewicht : double; { Gewicht der Maschine in kg }
sx, sy : double; { Koordinaten des Schwerpunkts [m]}
Radstand : double; { Radstand [m] }
Flaeche : double; { Windwiderstandsflaeche [m²] }
cw : double; { Luftwiderstandsbeiwert (cw-Wert) [-] }
Umfang : double; { Radumfang Antriebsrad [m] }
mu : double; { Haftreibungskoeffizient Rad-Strasse [-] }
{ Getriebe- und Antriebsdaten }
i_prim : double;
z_ritzel : int32; { Anzahl der Zaehne auf dem Ritzel [-] }
z_blatt : int32; { Anzahl der Zaehne auf dem Kettenblatt [-] }
n_gaenge : int32; { Anzahl Gaenge [-] } { <----------- bis hierhin werden die Daten richtig eingelesen}
z_ritzel : integer; { Anzahl der Zaehne auf dem Ritzel [-] }
z_blatt : integer; { Anzahl der Zaehne auf dem Kettenblatt [-] }
n_gaenge : integer; { Anzahl Gaenge [-] }
i_getriebe : array[1..MAXGANG] of double;
i_ges : array[1..MAXGANG] of double;
n_kuppl : double; { Einkuppeldrehzahl [U/min] }
n_schalt : double; { Schaltdrehzahl [U/min] }
{ Kennliniendaten }
pnt : integer;
n : array[1..MAXPNT] of double; { Array der Drehzahlen d. Stuetzpunkte }
n_max : double; { Maximaldrehzahl }
p : array[1..MAXPNT] of double; { Array mit der Leistung dazu }
p_max : double; { maximale Leistung }
n_p_max : double; { Drehzahl von P_max }
m : array[1..MAXPNT] of double; { Array Drehmoment-Kennlinie }
m_max : double; { maximales Drehmoment }
n_m_max : double; { Drehzahl von M_max }
{ Umwelt-Daten }
Steigung : double; { Hangsteigung [%] }
Wind : double; { Windgeschwindigkeit [km/h] }
Gew_Fahrer : double; { Gewicht des Fahrers [kg] }
Gew_Zuladung : double; { Zuladung [kg] }
end;
Eingelesen wird das ganze mit
Code: Alles auswählen
memBuffer := TMemoryStream.Create;
memBuffer.LoadFromFile (filename);
nbytes := memBuffer.Read(RoadLoadData,1 * SizeOf(RoadLoadData));
memBuffer.Free;
Bis zu der Markierten Stelle werden die Daten auch richtig eingelesen. Danach werden die Daten/Bytes wohl nicht mehr richtig zugeordnet. Ich habe mir mit die Binärdaten auch im Hex-Editor angesehen. Dort liegen die Bytes schön in der richtigen Reihenfolge und ich kann die Positionen des einzelnen Parameter richtig zuordnen.
Warum kommt die FreePascal-Routine aus dem Tritt?
Ciao,
Photor
PS: heutzutage würde man das wohl besser als ASCII oder im INI-File-Format speichern.