397 lines
12 KiB
Plaintext
397 lines
12 KiB
Plaintext
|
|
|
|
|
|
|
|
|
|
|
|
@ @ @ @ @
|
|
@ @ @@ @@ @ @
|
|
@ @ @ @ @ @ @ @
|
|
@ @ @ @ @ @
|
|
@@@@@@@ @ @ @ @
|
|
@ @ @ @ @ @
|
|
@ @ @ @ @ @
|
|
|
|
|
|
|
|
|
|
|
|
@ @ @ @ @@@@@
|
|
@ @ @@ @ @ @
|
|
@ @ @ @ @ @ @
|
|
@ @ @ @ @ @ @
|
|
@ @ @ @@ @ @
|
|
@@@@ @ @ @@@@@
|
|
|
|
|
|
|
|
|
|
|
|
@@@@@@@ @@@@@@@ @@@@@@@
|
|
@ @ @ @ @
|
|
@ @ @
|
|
@@@@@ @ @
|
|
@ @ @
|
|
@ @ @
|
|
@ @ @
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
J . W e n z l a f f
|
|
|
|
Z K I d e r A d W
|
|
K u r s t r . 3 3
|
|
-----------------------
|
|
B E R L I N , 1 0 8 6
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
- 1 -
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ING_DB 6.3/4 AMX(FORTRAN77)
|
|
|
|
|
|
|
|
EINLEITUNG
|
|
Fuer die Einbindung von Datenbankaktionen in FORTRAN77 unter
|
|
UNIX bsd 2.9 stehen die AMX-Compiler `amxf' und `oamxf' zur
|
|
Verfuegung. `oamxf' ist die overlay-Version von `amxf'.
|
|
Die Datenbankaktionen werden in AMX/C programmiert und mit
|
|
`amxf' uebersetzt, alle anderen Programmteile koennen in
|
|
FORTRAN77 geschrieben werden. Sie werden mit `f77' ueber-
|
|
setzt und mit `amxf' bzw. `oamxf' gelinkt (verbunden).
|
|
Die Verwendung von `amxf' zur Programmerstellung erfordert
|
|
keine Angabe einer speziellen AMX-Bibliothek (analog zu
|
|
`amx'). Die Verwendung von `oamxf' erfordert vom Nutzer
|
|
|
|
1. die Angabe des Flags `-V' beim Uebersetzen der zu
|
|
ueberlagernden Moduln
|
|
|
|
2. die Angabe der ueberlagerbaren AMX-Bibliotheken
|
|
-lova1 bzw. `.../lib/libova1.a'
|
|
-lova2 bzw. `.../lib/libova2.a'
|
|
-lova3 bzw. `.../lib/libova3.a'
|
|
-lova4 bzw. `.../lib/libova4.a'
|
|
wobei der Pfad `.../' das home-directory des Da-
|
|
tenbanksystems ING_DB 6.3 angeben soll.
|
|
|
|
Jede Bibliothek belegt ein Textsegment (8 KByte). Ent-
|
|
sprechend der Ueberlagerungsstruktur koennen die Biblio-
|
|
theken verteilt werden. Die Nummerierung schreibt aber die
|
|
Reihenfolge der Angabe beim Verbinden vor.
|
|
|
|
|
|
EIN-/AUSGABEN
|
|
Solange in FORTRAN77 und C jeweils verschiedene Dateien an-
|
|
gesprochen werden, koennen ohne Sprachmixprobleme beliebige
|
|
Ein-/Ausgabeoperationen ausgefuehrt werden. Gleiche Dateien
|
|
koennen nur dann in beiden Sprachen angesprochen werden,
|
|
wenn es sich um die Standard-Ein- oder -Ausgabedatei han-
|
|
delt.
|
|
|
|
FORTRAN77 C
|
|
--------- ---------------------
|
|
Einheit 5 stdin (Deskriptor 0)
|
|
Einheit 6 stdout (Deskriptor 1)
|
|
Einheit 0 stderr (Deskriptor 2)
|
|
|
|
Einheit 5, 6 oder 0 in FORTRAN77 darf dabei keiner anderen
|
|
Datei zugewiesen werden, wie auch stdin, stdout oder stderr
|
|
bzw. Deskriptor 0, 1 oder 2 in C. In C sollten die Stan-
|
|
darddateien auch nicht gepuffert werden (s. SETBUF(III)).
|
|
|
|
|
|
|
|
|
|
|
|
|
|
- 1 -
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ING_DB 6.3/4 AMX(FORTRAN77)
|
|
|
|
|
|
|
|
FELDER
|
|
In FORTRAN77 beginnen Indizes von Felder (Vektoren) immer
|
|
mit 1, in C dagegen mit 0.
|
|
|
|
Beispiel
|
|
FORTRAN77: array(n) hat die Indizes 1 .. n
|
|
C array[n] hat die Indizes 0 .. (n - 1)
|
|
|
|
Probleme koennen immer dann auftreten, wenn ueber Argumente
|
|
ein Index uebermittelt wird, der den Bearbeitungsstand des
|
|
Feldes ausdruecken soll. Die Uebermittlung der Kardinali-
|
|
taet des Feldes (Anzahl der Feldelemente) bringt keine Pro-
|
|
bleme.
|
|
In mehrdimensionalen Feldern hat in FORTRAN77 Spalte vor
|
|
Zeile, in C Zeile vor Spalte Vorrang.
|
|
|
|
FORTRAN77
|
|
+-----------------------------------+
|
|
a(2,3) | 1,1 | 1,2 | 1,3 | 2,1 | 2,2 | 2,3 |
|
|
a(3,2) | 1,1 | 1,2 | 2,1 | 2,2 | 3,1 | 3,2 |
|
|
a(6) | 1 | 2 | 3 | 4 | 5 | 6 |
|
|
+-----------------------------------+
|
|
C
|
|
+-----------------------------------+
|
|
a[6] | 0 | 1 | 2 | 3 | 4 | 5 |
|
|
a[2,3] | 0,0 | 1,0 | 0,1 | 1,1 | 0,2 | 1,2 |
|
|
a[3,2] | 0,0 | 1,0 | 2,0 | 0,1 | 1,1 | 2,1 |
|
|
+-----------------------------------+
|
|
|
|
|
|
FORTRAN77 KONVENTIONEN
|
|
Der Eintrittspunkt in das FORTRAN77-Programm ist
|
|
|
|
subroutine amx()
|
|
|
|
Damit wird eine ordnungsgemaesse Datenbankinitialisierung
|
|
und -beendigung gesichert.
|
|
Fuer FORTRAN77 gibt es keine weiteren Konventionen zu
|
|
beachten, folgende Hinweise sollen die Arbeit etwas erleich-
|
|
tern:
|
|
|
|
- Vermeiden Sie die Verwendung von Funktionen, die
|
|
in C geschrieben sind und von FORTRAN77 aufgerufen
|
|
werden, solange Sie den Mechanismus der Argu-
|
|
mentuebergabe nicht vollstaendig verstanden haben.
|
|
|
|
- Stringvariablen in FORTRAN77, die Zeichenketten-
|
|
domaenen aufnehmen sollen, muessen ein Zeichen
|
|
laenger sein, als die Laenge der Zeichenketten-
|
|
domaene in der Datenbank, auch wenn FORTRAN77 das
|
|
Abschlusszeichen `\0' fuer die Zeichenkette nicht
|
|
|
|
|
|
- 2 -
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ING_DB 6.3/4 AMX(FORTRAN77)
|
|
|
|
|
|
benoetigt.
|
|
|
|
- Schon sehr kleine AMX/FORTRAN77-Programme belegen
|
|
den vollen Adressraum. Benutzen Sie von vornhe-
|
|
rein die Ueberlagerungsstrukturen.
|
|
|
|
- Benutzen Sie fuer AMX/F-Austauschobjekte vom Typ
|
|
`integer' immer `integer*2' bzw. `integer*4'.
|
|
|
|
|
|
C KONVENTIONEN
|
|
Vom C-Teil der C/FORTRAN77-Programmen koennen alle
|
|
FORTRAN77-Objekte (Routinen, Daten), vom FORTRAN77-Teil
|
|
koennen nur bestimmte C-Objekte benutzt werden.
|
|
|
|
|
|
NAMEN
|
|
FORTRAN77-Namen (Symbole) duerfen maximal 6 Zeichen lang
|
|
sein. In C muss an den FORTRAN77-Namen ein zusaetzlicher
|
|
Unterstrich `_' angehaengt werden, um FORTRAN77-Objekte in C
|
|
zu erreichen.
|
|
|
|
z.B. FORTRAN77 name string func
|
|
C name_ string_ func_
|
|
|
|
Normalerweise wird in FORTRAN77 Gross- und Kleinschreibung
|
|
nicht unterschieden, d.h. der FORTRAN77-Compiler uebersetzt
|
|
alle Gross- in Kleinbuchstaben. Das `f77'-Flag `-U'
|
|
gestattet die Verwendung von Gross- und Kleinbuchstaben.
|
|
|
|
|
|
TYPKONVERSIONEN
|
|
Fuer die Typen in FORTRAN77 und C gelten folgende Zuordnun-
|
|
gen:
|
|
|
|
integer*2 short bzw. short int
|
|
integer long bzw. long int
|
|
oder
|
|
short bzw. short int
|
|
(siehe `f77'-Flag `-i2')
|
|
integer*4 long bzw. long int
|
|
logical long bzw. long int
|
|
oder
|
|
short bzw. short int
|
|
(siehe `f77'-Flag `-i2')
|
|
real float
|
|
double precision double
|
|
complex struct { float r, i; }
|
|
double complex struct { double r, i; }
|
|
character*n char [n]
|
|
|
|
|
|
|
|
|
|
- 3 -
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ING_DB 6.3/4 AMX(FORTRAN77)
|
|
|
|
|
|
|
|
ARGUMENTKONVERSIONEN
|
|
In FORTRAN77 werden Parameter grundsaetzlich durch
|
|
Adressverweise (Call By Reference) uebergeben, einige Para-
|
|
meter (Funktionen, Parameter vom Typ character*n) erzeugen
|
|
einen zusaetzlichen Laengenparameter vom Typ integer*4 bzw.
|
|
long.
|
|
|
|
subroutine f(..., x, ...) f_(..., x, ...)
|
|
integer*2 x short *x;
|
|
|
|
subroutine f(..., x, ...) f_(..., x, ...)
|
|
integer x long *x;
|
|
oder
|
|
short *x;
|
|
(siehe `f77'-Flag `-i2')
|
|
|
|
subroutine f(..., x, ...) f_(..., x, ...)
|
|
integer*4 x long *x;
|
|
|
|
subroutine f(..., x, ...) f_(..., x, ...)
|
|
logical x long *x;
|
|
oder
|
|
short *x;
|
|
(siehe `f77'-Flag `-i2')
|
|
|
|
subroutine f(..., x, ...) f_(..., x, ...)
|
|
real x float *x;
|
|
|
|
subroutine f(..., x, ...) f_(..., x, ...)
|
|
double precision x double *x;
|
|
|
|
subroutine f(..., x, ...) f_(..., x, ...)
|
|
complex x struct {float r, i; } *x;
|
|
|
|
subroutine f(..., x, ...) f_(..., x, ...)
|
|
double complex x struct {double r, i; } *x;
|
|
|
|
subroutine f(..., x, ...) f_(..., x, ..., xlen)
|
|
character*(*) x char x[];
|
|
long xlen;
|
|
|
|
subroutine f(..., x, ...) f_(..., x, ..., xnull)
|
|
subroutine x int (*x)();
|
|
long xnull; /* == 0L */
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
- 4 -
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ING_DB 6.3/4 AMX(FORTRAN77)
|
|
|
|
|
|
FUNKTIONSKONVERSIONEN
|
|
Fuer die Uebergabe von Funktionswerten an aufrufende Routi-
|
|
nen gelten folgende Zuordnungen:
|
|
|
|
integer*2 function f(...) short f_(...)
|
|
|
|
integer function f(...) long f_(...)
|
|
oder
|
|
short f_(...)
|
|
(siehe `f77'-Flag `-i2')
|
|
|
|
integer*4 function f(...) long f_(...)
|
|
|
|
logical function f(...) long f_(...)
|
|
oder
|
|
short f_(...)
|
|
(siehe `f77'-Flag `-i2')
|
|
|
|
real function f(...) nicht darstellbar, weil
|
|
float in Ausdruecken
|
|
immer in double umgewan-
|
|
delt wird
|
|
|
|
double precision function f(...) double f_(...)
|
|
|
|
complex function f(...) f_(r, ...)
|
|
struct {float r, i;} *r;
|
|
|
|
double complex function f(...) f_(r, ...)
|
|
struct {double r, i;} *r;
|
|
|
|
character*n function f(...) f_(r, l...)
|
|
char r[];
|
|
long l;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
- 5 -
|
|
|
|
|
|
|
|
|