| www.qtsoftware.de |
| FOR_C |
| Fortran nach C Quellcodeübersetzer
für PC |
FOR_C übersetzt Fortran 77
Quellprogramme automatisch in C Quellcode.
FOR_C berücksichtigt dabei auch einige der
gängigen Fortran 77 Erweiterungen, wie sie bspw. in VAX oder IBM VS Fortran
zu finden sind (z.B. DO WHILE ... ENDDO, DO ... ENDDO, IMPLICIT NONE,
INCLUDE, DO ENDDO, BYTE, COMPLEX*16, VAX STRUCTURE, UNION, MAP, RECORD
usw.). Der Übersetzungsprozeß kann mittels Optionen und einer Konfigurationsdatei
spezifischen Anforderungen angepaßt werden. Möglich sind bspw.:
- die Handhabung von INTEGER als short
int oder long int,
- lokale Variablen können statisch oder
automatisch angelegt werden,
- die Reihenfolge der Bytes in Konstanten
kann umgedreht werden (wichtig bei Wechsel zu anderen Rechnersystemen,
deren Prozessor Werte bspw. nicht in word = low byte/high byte order
ablegt),
- Berücksichtigung von Fortran-IV/66
Eigenheiten,
- Umsetzung der I/O-Teile,
- Code-Optimierung mit Löschen von unbenutzten
Variablen,
- Erzeugung von Funktions-Prototypen,
- Code-Stil-Steuerung,
- Umsetzung von Hollerith-Konstanten
u.v.a.m..
|
Beispiel
|
| Fortran
77 Programm |
|
PROGRAM
For_CTst
C Konstanten
DOUBLE PRECISION PI
DOUBLE COMPLEX kxI !
Def. von i
PARAMETER (PI = 3.141592653589793,
&
kxI = (0.0D0, 1.0D0) )
C COMMON Variablen
CHARACTER*1 line(-29:30), pattern*2
COMMON /Allg/ line, pattern
C lokale Variablen
DOUBLE COMPLEX kxZahl,kxWurzel
REAL rlZahl,rlWurzel,vglRC(2)
EQUIVALENCE (kxZahl,vglRC)
C
1000 FORMAT( /11X,F10.3,+ i*,F10.3,
&
= ,F12.3, * EXP( i*,F10.6,))
1100 FORMAT(Wurzel ,I2,: ,F10.3,+
i*,F10.3)
C
C Statement Functions
C einf. Berechnung d.n-ten Wurzel
C über Logarithmus (nur für rlZahl &
k > 0)
rlWurzel(rlZahl,k)=EXP( LOG(rlZahl)/k )
C Formel von Moivre
kxWurzel(kxZahl,k,n)
& =rlWurzel( REAL(ABS(kxZahl)),
n )
& *EXP(
kxI*( phi(kxZahl)+ 2*k*Pi )/Float(n) )
C
DO 5 i=-29,30,2
line(i)=pattern(1:1)
line(i+1)=pattern(2:2)
5 CONTINUE
C
10 PRINT*,Eingabe komplexe Zahl:
READ(5,*) kxZahl
PRINT*,Welche Wurzeln? n =
READ(5,*) n
IF (n.LE.0) STOP
C
WRITE (*,1000) vglRC(1),vglRC(2),
&
ABS(kxZahl), phi(kxZahl)
C
DO 100 k=0,n-1
WRITE (*,1100) k, kxWurzel(
kxZahl, k, n )
100 CONTINUE
PRINT*,(line(i),i=-29,30)
GOTO 10
C
END
DOUBLE PRECISION FUNCTION phi(kxZahl)
C Bestimmung des komplexen Winkelarguments
DOUBLE COMPLEX kxZahl
DOUBLE PRECISION PI
PARAMETER ( PI = 3.141592653589793 )
C
IF ( REAL(kxZahl) .NE. 0.D0 )THEN
phi=ATAN( DIMAG(kxZahl)/REAL(kxZahl)
)
IF ( REAL(kxZahl) .LT. 0D0 )
phi=phi+PI
ELSE
IF (DIMAG(kxZahl).GT. 0.D0)
THEN
phi=PI/2.D0
ELSE IF (DIMAG(kxZahl).EQ.0.D0)
THEN
phi=0
ELSE
phi=3.D0*PI/2.D0
END IF
END IF
C
RETURN
END
BLOCK DATA
CHARACTER*1 line(-29:30),pattern*2
COMMON /Allg/ line, pattern
DATA pattern/- /,line/60* /
END
|
| Von FOR_C generierter C-Quellcode |
*FOR_C
Options SET: do=r ftn=l io=c op=i s=av str=l */
#include <stdio.h
#include <math.h
#include <fcrt.h
#include <fcio.h
#include <complx.h
/* PARAMETER translations */
#define PI 3.141592653589793
#define KXI ftoc(0.0e0,1.0e0)
/* end of PARAMETER translations */
/* COMMON translations */
struct t_allg {
byte line[30-(-29)+1];
char pattern[3];
} allg;
/* end of COMMON translations */
main( int argc, char *argv[] )
{
long int i, i_, n, k, k_;
float rlzahl, *vglrc;
double phi();
complex *kxzahl, _dcx0;
double _e0[2];
/* EQUIVALENCE translations */
kxzahl = (complex*)_e0;
vglrc = (float*)_e0;
/* end of EQUIVALENCE translations */
f77_ini(argc,argv);
/* Konstanten */
/* Def. von i */
/* COMMON Variablen */
/* lokale Variablen */
/* Statement Functions
* einfache Berechnung der n-ten
* Wurzel über Logarithm.
*/
#define RLWURZEL(rlzahl,k)
/* nur für rlZahl & k > 0 */
(float)(exp( log( (rlzahl) )/(k)))
/* Formel von Moivre (n-te Wurzeln
aus einer
* komplexen Zahl) */
#define KXWURZEL(kxzahl,k,n) (complex) (cmul
( ftoc(RLWURZEL(
(float) ( cabs( (kxzahl) ) ), (n)) ,0.),
\
cexp( cdiv( cmul( KXI, ftoc( phi( \
ADR(_dcx0,(kxzahl))) + 2*(k)*PI,0.))\
ftoc((float)( (n) ),0.)) )))
for( i = -29; i <= 30; i += 2 )
{
i_ = i - 1;
allg.line[i-(-29)]=allg.pattern[0];
allg.line[i+1-(-29)]=allg.pattern[1];
}
L_10:
fprintf( stdout, Eingabe einer komplexen Zahl:
\n);
fscanld( UFP(5), %lz , kxzahl );
fprintf( stdout, Welche Wurzeln sind
zu bestimmen? n = \n );
fscanld( UFP(5), %ld , &n );
if( n <= 0 )
{
exit(0);
}
fprintf( stdout, \n %10.3f+
i*%10.3f = %12.3f * EXP( i*%10.6f)\n,
vglrc[0], vglrc[1], cabs( *kxzahl ),
phi( kxzahl ) );
for( k = 0; k <= (n - 1); k++ )
{
k_ = k - 1;
fprintf( stdout, Wurzel
%2ld:
%10.3f+ i*%10.3f\n, k,
ZPAIR(KXWURZEL( *kxzahl, k, n )) );
}
for( i = -29; i <= 30; i++ )
{
fprintf( stdout, %c,
allg.line[i-(-29)] );
}
fputc( \n, stdout );
goto L_10;
#undef KXWURZEL
#undef RLWURZEL
}
/* end of function */ |
FOR_C beinhaltet eine C-Runtime Library im
Quellcode, die gewisse in Fortran vorhandene Funktionen, die in C jedoch
fehlen, ersetzt. Dies erlaubt eine von der Rechner-Plattform unabhängige
Übersetzung. Es wird strukturierter, lesbarer C Code generiert (d.h. die
Bezeichnungen der Variablen und Funktionen werden bei der Konvertierung,
soweit möglich, beibehalten).
Dokumentation
Die Dokumentation ist umfangreich und sehr ausführlich (im
Ringbuch mit ca. 320 Seiten).
|
|
|