... wie umgeht man Compilerschwächen?
[ F77-GETARG | C->Fortran
| Host-Infos ]
Hin und wieder soll es vorkommen, daß die Compiler für unseren
Parallelrechner sich etwas anders benehmen, als man es von anderen Compilern
kennt. Meistens gibt es einfache Lösungen, die leider den Compiler-Experten
nicht eingefallen sind.
Hier möchte ich zur Nachnutzung für andere Interessenten einige
solche ausgefallenen Dinge empfehlen:
- Fortran-Standardfunktionen für Kommandozeilenargumente
- Die in mehreren F77-Compilern realisierten Standardfunktionen
integer function iargc()
subroutine getarg(i,string)
waren in der Fortranbibliothek für PowerPC nicht zu finden.
- Eine Variante ist ab sofort in der Bibliothek libCubecom.a
enthalten. Da die Art des Zugriffs auf diese Argumente für Parix
nicht dokumentiert ist, besteht somit keine Gewähr (aber eine gute
Chance) für künftige Versionen. Getestet wurde mit den Versionen
1.5 und 1.7.1 der Motorola-Compiler.
- Wer sich für das Know-How
interessiert, findet dort die C-Quelle.
- C ruft Fortran
- Es treten bekanntlich Probleme auf, wenn ein in C geschriebenes Hauptprogramm
main() Fortran-Unterprogramme aufruft, in denen Ein-/Ausgabe-Anweisungen
ausgeführt werden. In manchen Fällen findet man eine spezielle
Initialisierungsroutine für das Fortran-I/O-System, nicht so in der
Parix-Dokumentation. Der folgende Trick hilft weiter:
- Das Hauptprogramm in C erhält den Namen MAIN_() statt
main(). Zum Linken sollte man sowieso f77.px (und nicht
cc.px) verwenden, damit alle Standardbibliotheken automatisch
gefunden werden.
- Etwas mehr ist zu tun, wenn man Kommandozeilenargumente verwendet:
- Statt
main(int argc, char **argv)
schreibe man
int xargc;
char **xargv;
MAIN_()
und kann an jeder Stelle des Programms auf die Kommandozeile zugreifen
(nur eben mit "xarg." statt "arg." ).
- Es geht natürlich auch "sauberer" (oder umständlicher):
MAIN_()
{
extern int xargc;
extern char **xargv;
int argc = xargc;
char **argv = xargv;
...
}
- Fortran-Zugriff auf Datum/Uhrzeit/UserID
- Die Bibliothek libTools.a
enthält auch einige Routinen, die solche nebensächlichen
Informationen wie Datum undUhrzeit oder den Login-Namen des aktuellen Nutzers
liefern.
- Datum / Uhrzeit als Zeichenkette:
character*26 datum
call frontend_time (datum)
- Datum / Uhrzeit als Integer (Sekunden seit 01.01.80 (?))
integer zeit
zeit = int_frontend_time()
- Login-Name des aktuellen Nutzers:
character*10 nutzer
call getuser(nutzer)
- Diese Tools sind in gleicher Weise natürlich auch auf anderen
Workstations zu verwenden. Es gibt allerdings einige Abweichungen auf dem
Parallelrechner (ppc):
Die Uhrzeit wird evtl. für eine falsche Zeitzone umgerechnet.
Der Benutzername wird auf Umweg über die Hostworkstation ermittelt,
wozu im aktuellen Verzeichnis kurzzeitig ein File geschrieben wird.
Matthias
Pester - 15. Mai 1996
Zugriffe:
Last modified: