home *** CD-ROM | disk | FTP | other *** search
- (* ------------------------------------------------------ *)
- (* FORTRAN.PAS *)
- (* Das Unterprogramm dient dazu, ein Unterprogramm, das *)
- (* in FORTRAN geschrieben wurde, in ein Pascal-Programm *)
- (* einzubinden. Zuvor muß jedoch mit MAKECALL eine EXE- *)
- (* Datei erzeugt worden sein. *)
- (* (c) 1988 by Jörg Stein & PASCAL International *)
- (* ------------------------------------------------------ *)
- UNIT FORTRAN;
-
- INTERFACE
-
- USES Dos;
-
- TYPE Typen = ARRAY[1..10] OF STRING[2];
- Pointer_Array = ARRAY[1..10] OF POINTER;
-
- PROCEDURE Call_Fortran_Subroutine(Name: STRING;
- (* Name des FORTRAN-Unterprogramms *)
- Anzahl_x: INTEGER;
- (* Anzahl der zu übergebenden Parameter *)
- Typ: Typen;
- (* Typbezeichnung der Parameter *)
- VAR x: Pointer_Array);
- (* Adressen der Parameter *)
- IMPLEMENTATION
-
- PROCEDURE Call_Fortran_Subroutine;
- CONST
- Profort_Path = 'C:\FORTRAN\';
- VAR f : TEXT;
- j : INTEGER;
- ch : CHAR;
- IPtr : ^Integer;
- RPtr : ^Real;
- LPtr : ^Boolean;
- BEGIN
- (* Die temporäre Datei TEMPIN dient der Übergabe von *)
- (* Parametern zwischen Pascal- und FORTRAN-Programmen. *)
- (* Sie sollte zweckmäßigerweise auf einer RAM-Disk *)
- (* (hier: D) angelegt werden. *)
- Assign(f,'D:TEMPIN');
- ReWrite(f);
- WriteLn(f,Anzahl_x);
- FOR j := 1 TO Anzahl_x DO WriteLn(f,'''',Typ[j]:2,'''');
- FOR j := 1 TO Anzahl_x DO BEGIN
- IF (Typ[j]='I2') OR (Typ[j]='I4') THEN BEGIN
- IPtr := x[j]; WriteLn(f,IPtr^); END;
- IF (Typ[j]='R4') OR (Typ[j]='R8') THEN BEGIN
- RPtr := x[j]; WriteLn(f,RPtr^); END;
- IF (Typ[j]='L4') THEN BEGIN
- LPtr := x[j]; WriteLn(f,LPtr^); END;
- END;
- Close(f);
- (* Aufruf des durch MAKECALL eingebundenen FORTRAN- *)
- (* Unterprogrammes. Achtung! Um den folgenden Befehl *)
- (* ausführen zu können, muß das Hauptprogramm eine *)
- (* M-Option enthalten! *)
- Exec('C'+Name+'.EXE','');
- (* Lesen der eventuell modifizierten Parameter *)
- Assign(f,'D:TEMPOUT');
- ReSet(f);
- FOR j := 1 TO Anzahl_x DO BEGIN
- IF (Typ[j] = 'I2') OR (Typ[j] = 'I4') THEN BEGIN
- IPtr := x[j]; ReadLn(f,IPtr^); END;
- IF (Typ[j] = 'R4') OR (Typ[j] = 'R8') THEN BEGIN
- RPtr := x[j]; ReadLn(f,RPtr^); END;
- IF (Typ[j] = 'L4') THEN BEGIN
- LPtr := x[j]; ReadLn(f,ch);
- IF UpCase(ch) = 'T' THEN LPtr^ := TRUE
- ELSE LPtr^ := FALSE;
- END;
- END;
- Close(f);
- END;
-
- END.