🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: de.comp.os.vms
Article #61

Re: FORTRAN CHARACTER*(*) -> globale C Variable

#61
From: Sepp Huber, CERN -4439,-6712
Date: Thu, 19 Nov 1992 19:32
43 lines
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!huber
References: <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