Registriert seit: 9. Mai 2013
21 Beiträge
Delphi XE5 Professional
|
Einlesen einer FORTRAN Binärdatei mit Delphi
16. Jul 2014, 13:35
Hallo,
für eine Studienarbeit soll ein altes Fortran77 Programm nach Pascal übersetzt werden (Entwicklungsumgebung ist RadStudio XE5).
Momentan hänge ich beim Einlesen von Datensätzen aus Binärdateien.
Zu Testzweck habe ich in Fortran eine Subroutine angelegt, die vier Integerwerte (NPUNKT,NPVAR,NZELLE,NSTR und KPER) in eine Binärdatei schreibt.
Es handelt sich um 32-Bit Integerzahlen, welche bei Fortran als Integer*4 definiert werden. Somit sollte der Fortran Integer*4 dem "normalen" Integer aus Pascal entsprechen!?!
Im nachfolgenden Code-Block ist der zugehörige Fortran-Code abgebildet.
Hinweis: NNET ist das Dateihandle. Das Öffnen und Schließen der Datei ist nicht Bestandteil der Subroutine OUTNET. Es geschieht an einer anderen Stelle im Programm.
Code:
SUBROUTINE OUTNET
C**********************************************************************
C
C
C
C IMPLICIT
C
IMPLICIT DOUBLE PRECISION (A-H,O-Z)
C
COMMON /STEUER/ IERR,LIN,KPER,NPRINT,MPRINT,MAXP,MAXT,IRECH,IB2,
, NSPG,NROT1,NROT2,NSTROM
COMMON /TEXTE/ TITEL
COMMON /NETZP/ NPMAX,NPUNKT,NPVAR,NZMAX,NZELLE,NSMAX,NSTR,MMAX
COMMON /NETZD/ X(10000),Y(10000),A(10000),NUE(20000),SD(20000),
, GAM(20000),
, D(20000),GK(3,20000),NACHBZ(60000),ENDZ(10000),
, NPER(10000),MGEB(20000),
, ECKP(3,20000),RANDZ(3,20000),RANDS(3,20000),
, AP(30000),EP(30000),GL(30000),GR(30000),
, RAND(30000),ZL(30000),ZR(30000)
COMMON /KONTUR/ GECKP(3,4000),IGECKP
COMMON /IODEF / VERSIO,NTEST,IKART,NLIST,ND1,INET,NNET,NPLOT,
, NUEPL
C
DOUBLE PRECISION NUE,GAM
COMPLEX*16 A,SD
CHARACTER*80 TITEL
REAL*8 VERSIO
INTEGER*4 NACHBZ,ENDZ,NPER,MGEB,ECKP,RANDZ,RANDS
INTEGER*4 AP,EP,GL,GR,RAND,ZL,ZR
C
WRITE (NNET) NPUNKT,NPVAR,NZELLE,NSTR,KPER
C
RETURN
END
Nun habe ich mit Delphi eine Prozedure geschrieben, die die erzeugte Fortran Binärdatei einlesen soll. Dabei entsteht allerdings nur Datensalat.
Zuvor habe ich schon mit der Klasse TFileStream gearbeitet und konnte erfolgreich Binärdateien anlegen und einlesen.
Ich vermute daher, dass Fortran die Binärdatei anders strukturiert? Im Internet konnte ich keine Informationen dazu finden.
MFG Tenobaal
Delphi-Quellcode:
procedure TNetgen.ReadNet(Directory,Filename: String);
var
Stream:TFileStream;
Begin
Stream:=TFileStream.Create(Directory+Filename+' .NET',fmOpenRead);
try
try
//NPUNKT,NPVAR,NZELLE,NSTR,KPER sind vom Datentyp Integer
Stream. Read(NPUNKT,SizeOf(NPUNKT));
Stream. Read(NPVAR,SizeOf(NPVAR));
Stream. Read(NZELLE,SizeOf(NZELLE));
Stream. Read(NSTR,SizeOf(NSTR));
Stream. Read(KPER,SizeOf(KPER));
except
on E: Exception do
begin
ErrorMessagesINOUT.Add(' Fehler beim anlegen der Netzdatei ('+Filename+' .NET)');
ErrorMessagesINOUT.Add(E.ClassName+' Fehler aufgetreten mit Nachricht : '+E. Message);
end;
end;
finally
Stream.Free;
end;
End;
Geändert von Tenobaal (16. Jul 2014 um 13:46 Uhr)
|