🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

2 total messages Started by ComRam Tue, 17 Nov 1992 21:21
FORTRAN CHARACTER*(*) -> globale C Variable
#60
Author: ComRam
Date: Tue, 17 Nov 1992 21:21
24 lines
1680 bytes
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)

Hilfe per E-Mail oder Follow-Up ... also quasi egal wie.


-------------------------------------------------------------------------------
 ComRam  (in real life : Frank Kargl)   Student Consultant for VMS-Programming
 Internet      : COMRAM@RZ.UNI-ULM.DE   University of Ulm          Germany
 DECnet(Belwue): 50186::KARGL           All statements posted above are
 Bitnet        : KARGL@DULRUU51.BITNET  my personal oppinion ONLY !
-------------------------------------------------------------------------------
  Use the SOURCE, Luke!             I feel a great disturbance in the SOURCE.
Re: FORTRAN CHARACTER*(*) -> globale C Variable
#61
Author: 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
Thread Navigation

This is a paginated view of messages in the thread with full content displayed inline.

Messages are displayed in chronological order, with the original post highlighted in green.

Use pagination controls to navigate through all messages in large threads.

Back to All Threads