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.
Programmgrundstruktur
Groß-, Kleinschreibung
| Fortran95
|
C
|
| Fortran ist case-insensitiv |
C ist case-sensitiv
|
Kommentare
| Fortran95
|
C
|
! xyz
|
/* xyz */
|
Das Ende einer Anweisung
| 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.
|
Hauptprogramm
| Fortran95
|
C
|
program bsp
...
end program bsp
|
int main(int argc, char **argv) {
...
}
|
Unterprogramme
| 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.
|
Einfache Datentypen
| 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.)
Variablendeklaration
| Fortran95
|
C
|
| datentyp :: var1, var2, ... |
datentyp var1, var2, ...
|
Konstanten
| 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 |
-----
|
Benannte Konstanten
| Fortran95
|
C
|
| datentyp, parameter :: konstante = wert |
const datentyp konstante = wert oder #define konstante wert
|
Operatoren
Arithmetische Operatoren
| Fortran95
|
C
|
| + |
+
|
| - |
-
|
| * |
*
|
| / |
/
|
| ** |
----- (-> Bibliotheksfunktion)
|
| ---- (-> intrinsic functions) |
% (Modulo)
|
Vergleichsoperatoren
| Fortran95
|
C
|
| == |
==
|
| < |
<
|
| <= |
<=
|
| > |
>
|
| >= |
>=
|
| /= |
!=
|
Logische Operatoren
| Fortran95
|
C
|
| .AND. |
&&
|
| .OR. |
||
|
| .NOT. |
!
|
| .EQV. |
-----
|
| .NEQV. |
-----
|
Stringverknüpfung
| Fortran95
|
C
|
| // |
----- (-> Bibliotheksfunktion)
|
Bitoperatoren
| Fortran95
|
C
|
| ----- (-> intrinsic functions) |
<<, >>, &, |, ^, ~
|
Weitere Operatoren
| Fortran95
|
C
|
| ----- |
++, --, +=, -=, etc.
|
Zusammengesetzte Datentypen
| 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;
|
Felder
| 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)
|
Zeichenketten
| 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.
|
Blöcke, Verzweigungen, Schleifen
Block
Verzweigungen
| 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:
...
}
|
Schleifen
| 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 (...);
|
Sonstiges
| Fortran95
|
C
|
stop
|
#include <stdlib.h>
exit(status);
oder im Hauptprogramm
return;
|
exit
|
break;
|
cycle
|
continue;
|
Ein-, Ausgabe
| Fortran95
|
C
|
write(*, format) ...
|
#include <stdio.h>
printf(...);
|
read(*, format) ...
|
#include <stdio.h>
scanf(...);
|
Dateien
| 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);
|
Zeiger
| 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);
|