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);
|