Article View: de.comp.os.vms
Article #61Re: FORTRAN CHARACTER*(*) -> globale C Variable
From: Sepp Huber, CERN -4439,-6712
Date: Thu, 19 Nov 1992 19:32
Date: Thu, 19 Nov 1992 19:32
43 lines
2729 bytes
2729 bytes
In article <1992Nov17.212109.22789@wega.rz.uni-ulm.de>, KARGL@rzmain.rz.uni-ulm.de (ComRam) writes...
>Ich hab hier ein ziemliches Problem. Ich soll fuer ein Programm eine
>Routine schreiben, welche folgendes leistet:
>Ein Fortran String unbekannter Laenge wird von einem C-Routine als globale
>Variable uebernommen. Gleichzeitig wird noch ein einzelnes Zeichen als
>Argument an die C-Rout. uebergeben.
>Ich weiss, dass das mit der globalen Variable furchtbar kompliziert ist. Es
>soll aber anscheinend so sein. Kann mir da jemand helfen ?
>
>Noch mal das ganze in Kurzfassung:
>
>FORTRAN C
>CHARAKTER*(*) fname ---> globale Variable char *fname[]
>CHARAKTER*1 d ---> Argument void rout(char *d)
>
Da dies in os.vms steht, die loesung in VAX-C und VAX-Fortran, mit VMS Linker
(linker ? ja, weil dinge wie globals variable nicht einfach nur von den
compilern abhaengen!)
Das einfache ist das single character argument:
in Fortran: CALL ROUT(%REF(D))
Das globale character array:
grundsaetzlich erzeugt jede globale variable in VAX-C eine PSECT mit dem namen
der variablen. In Fortran entspricht dem ein named COMMON, whaehrend der
variablen name nur lokale bedeutung hat.
Im beispiel also:
Character*48 fname
Common /FNAME/fname
Abgesehen von formalen dingen, sollte man bei fortran/c mischung bedenken, dass
C ja in wirklichkeit keine variablen vom typ character kennt, sondern nur
arrays of bytes, deren ende durch eine null markiert ist. Wenn die C routinen
also auf die fortran character variablen string manipulation machen (strcat,
strcpy etc.), dann muss sichergestellt werden, dass eine null auf den letzten
signifikanten character folgt! Fortran tut nichts dergleichen.
Einfacher patch: in fortran die dimension immer maximum+1, dann vor uebergabe
an C: fname(LEN(fname):LEN(fname))=char(0)
-
Joseph "Sepp" Huber | At present in CERN, phone -4439/-6712
Max-Planck-Institut Physik | Internet: huber@vxcern.cern.ch
Munich, Germany | HEPnet: VXCERN::HUBER
Technical Details
Message-ID:
<19NOV199220324830@vxcrna.cern.ch>Path:
arc1-ca.pugleaf.net!sparky!uunet!zaphod.mps.ohio-state.edu!sol.ctr.columbia.edu!ira.uka.de!math.fu-berlin.de!unidui!rrz.uni-koeln.de!Germany.EU.net!mcsun!dxcern!vxcrna.cern.ch!huberReferences:
<1992Nov17.212109.22789@wega.rz.uni-ulm.de>Show Full Headers
Complete Article Headers
Newsgroups: de.comp.os.vms Path: arc1-ca.pugleaf.net!sparky!uunet!zaphod.mps.ohio-state.edu!sol.ctr.columbia.edu!ira.uka.de!math.fu-berlin.de!unidui!rrz.uni-koeln.de!Germany.EU.net!mcsun!dxcern!vxcrna.cern.ch!huber From: huber@vxcrna.cern.ch (Sepp Huber, CERN -4439,-6712) Subject: Re: FORTRAN CHARACTER*(*) -> globale C Variable Message-ID: <19NOV199220324830@vxcrna.cern.ch> News-Software: VAX/VMS VNEWS 1.41 Sender: news@dxcern.cern.ch (USENET News System) Organization: European Organization for Nuclear Research, CERN References: <1992Nov17.212109.22789@wega.rz.uni-ulm.de> Date: Thu, 19 Nov 1992 19:32:00 GMT Lines: 43