Nachfolgend werden einige grundlegende Sprachelemente von Fortran95 und C tabellarisch gegenübergestellt. Die Gegenüberstellung erfolgt nur schematisch, da hier nur ein Überblick über die Gemeinsamkeiten und Unterschiede der beiden Programmiersprachen aufgezeigt werden soll.
Tabellenlegende:
----- : nicht vorhanden
... : nicht näher bestimmt, aber irgendwas Sinnvolles und Zulässiges
kursiv Geschriebenes steht für beliebige (aber natürlich nur sinnvolle und zulässige) Variablennamen, Zahlen, etc.
Fortran95
C
Fortran ist case-insensitiv
C ist case-sensitiv
Fortran95
C
! xyz
/* xyz */
Fortran95
C
Jede Anweisung steht grundsätzlich in einer eigenen Zeile.
Die Zeilenlänge ist begrenzt.
Mehrere Anweisungen dürfen auch in einer Zeile stehen, wenn sie durch Semikolon ; voreinander getrennt sind.
Eine Zeilenfortsetzung muss durch ein Kaufmanns-Und & am Ende der fortzusetzenden Zeile angezeigt werden.
Die Anzahl der erlaubten Fortsetzungzeilen ist begrenzt.
Einzelne Anweisungungen sind immer durch Semikolon ; zu trennen.
Eine Anweisung kann sich über mehrere Zeilen erstrecken.
Fortran95
C
program bsp
...
end program bsp
int main(int argc, char **argv) {
...
}
Fortran95
C
call sub1(...)
...
subroutine sub1(...)
...
end subroutine sub1
void sub1(...);
...
sub1(...);
...
void sub1(...) {
...
}
var = fun1(...)
...
function fun1(...)
datentyp :: fun1
...
fun1 = ...
end function fun1
datentyp fun1(...);
...
var = fun1(...);
...
datentyp fun1(...) {
...
return ...;
}
Prinzipiell werden Parameter per "call by reference" übergeben.
Die Datenübertragungsrichtung lässt sich mittels intent -Angabe steuern.
Prinzipiell werden Parameter per "call by value" übergeben.
"call by reference" wird mittels Übergabe von Zeigern realisiert.
Fortran95
C
Bytes
-----
unsigned-Datentypen
...
integer
int
4
integer(kind=1)
signed char
1
integer(kind=2)
short int
2
integer(kind=4)
int
4
integer(kind=8)
long int
8
real
float
4
double precision
double
8
real(kind=4)
float
4
real(kind=8)
double
8
complex
----- (ab ISO C99 -> complex.h -Bibliothek)
8
logical
----- (-> int-Zahlen, ab ISO C99 -> stdbool.h -Bibliothek)
4
character
unsigned char
1
character(len=...)
unsigned char[...]
...
(Zu beachten ist, dass die Byteanzahl der Datentypen teilweise maschinenabhängig ist. Die kind -Angaben sind zudem auch compilerabhängig.)
Fortran95
C
datentyp :: var1, var2, ...
datentyp var1, var2, ...
Fortran95
C
'Hallo' oder "Hallo"
"Hallo"
'A', "A"
Character: 'A', Zeichenkette: "A"
Arithmetische Konstanten höherer Genauigkeit sind zwingend mit einer speziellen Datentypendung zu versehen
-----
Fortran95
C
datentyp , parameter :: konstante = wert
const datentyp konstante = wert oder #define konstante wert
Fortran95
C
+
+
-
-
*
*
/
/
**
----- (-> Bibliotheksfunktion)
---- (-> intrinsic functions)
% (Modulo)
Fortran95
C
==
==
<
<
<=
<=
>
>
>=
>=
/=
!=
Fortran95
C
.AND.
&&
.OR.
||
.NOT.
!
.EQV.
-----
.NEQV.
-----
Fortran95
C
//
----- (-> Bibliotheksfunktion)
Fortran95
C
----- (-> intrinsic functions)
<<, >>, &, |, ^, ~
Fortran95
C
-----
++, --, +=, -=, etc.
Fortran95
C
type :: name
sequence
integer :: a
...
end type name
...
type(name ) :: var
var%a = wert
struct name {
int a;
...
};
...
struct name var;
var.a = wert ;
Fortran95
C
datentyp , dimension(zahl ) :: var
datentyp var[zahl ]
datentyp , dimension(zahl1 , zahl2 , ...) :: var;
datentyp var[zahl1 ][zahl2 ]...;
Ein Feldindex startet standardmäßig bei 1. Dieser Indexstartwert kann aber vom Programmierer verschoben werden.
Ein mehrdimensionales Feld wird spaltenweise gespeichert.
Fortran95 kennt standardmäßig viele Möglichkeiten mit Feldern (Vektoren und Matrizen) zu hantieren (z.B. Feldkonstruktor, reshape , where , Zugriff auf eine Teilmenge eines Feldes, etc.).
Ein Feldindex startet immer bei 0.
Ein mehrdimensionales Feld wird zeilenweise gespeichert.
var(zahl ) = wert
var[zahl ] = wert ;
var(zahl1 , zahl2 ) = wert
var[zahl1 ][zahl2 ] = wert ;
var = wert
----- (-> mittels Schleifendurchlauf über das ganze Feld)
var(zahl1 :zahl2 ) = wert
----- (-> mittels Schleifendurchlauf über die Feldteilmenge)
Fortran95
C
character(len=zahl ) :: var
char var [zahl ]
-----
Zeichenketten werden (intern) mit einem \0-Zeichen terminiert. Dies muss bei der Variablendeklaration hinsichtlich der Feldlänge berücksichtigt werden.
Fortran95
C
if (bedingung ) anweisung
if (bedingung ) anweisung ;
if (bedingung ) then
...
end if
if (bedingung ) {
...
}
if (bedingung ) then
...
else
...
end if
if (bedingung ) {
...
}
else {
...
}
-----
... ? ... : ...
select case (...)
case (...)
...
case (...)
...
...
case default
...
end select
switch (...)
{
case ...:
...
break;
case ...:
...
break;
...
default:
...
}
Fortran95
C
do schleifenvar = anfangswert , endwert , schrittweite
...
end do
for (anfangsbedingung ; endbedingung ; durchgangsanweisung )
{
...
}
do while (...)
...
end do
while (...)
{
...
}
do
...
if (...) exit
end do
do {
...
} while (...);
Fortran95
C
stop
#include <stdlib.h>
exit(status );
oder im Hauptprogramm
return;
exit
break;
cycle
continue;
Fortran95
C
write(*, format ) ...
#include <stdio.h>
printf(...);
read(*, format ) ...
#include <stdio.h>
scanf(...);
Fortran95
C
open (unit=nr, ...)
write (nr , format ) ...
read (nr , format ) ...
...
close(unit=nr )
#include <stdio.h>
...
FILE *f = fopen(...);
fprintf (f, ...);
fscanf(f, ...);
...
fclose(f);
Fortran95
C
datentyp , pointer :: var
datentyp *var;
...
datentyp , pointer :: var1 => null();
datentyp , target :: var2 = wert ;
...
var1 => var2
write(*,*) var1
...
datentyp *var1 = 0;
datentyp var2 = wert ;
...
var1 = &var2;
printf("%d", *var1);