From: KARGL@rzmain.rz.uni-ulm.de (ComRam)
Subject: Einzelnes Zeichen von VAX FORTRAN -> VAX C ?
Organization: Chaos Computer Club Ulm
Date: Tue, 24 Nov 1992 00:58:29 GMT
X-News-Reader: VMS NEWS 1.24

Ich hab hier ein kleines Problem. Ich moechte von nachstehendem FORTRAN
Programm ein einzelnes Zeichenh (in dele) dem C Programm uebergeben. Wieso
geht das nicht in der nachstehend gezeigten Art und Weise ? Eigentlich
sollte da doch ein Fixed-Length Descriptor uebergeben werden.

--------------- schnippeln Sie hier ---------------------------------------

	PROGRAM CREATEFIL

	IMPLICIT NONE
	
* Creating a file and then using a C routine to delete it.

	INTEGER dummy,err
	CHARACTER*80 fname
	CHARACTER*1  dele
		
	EXTERNAL schliesse_file
	
        fname = 'test.dat'
        dele = 'D'
      
	OPEN(10,STATUS='NEW',FILE=fname)
	WRITE(10,*) 'Test'
	CLOSE (10)

        CALL oeffne_file (fname,0,err)
        
	CALL schliesse_file(dele,err)

	STOP
	END


----------------------------------------------------------------------

und nun der C Teil

----------------------------------------------------------------------

#include ssdef
#include descrip
#include stdio

FILE *eingabe;
char *filename;

void oeffne_file (struct dsc$descriptor_s *fn, int *mode,int *err)
/* Oeffnen eines Files <fn> */
{
   short status;

   filename = fn->dsc$a_pointer;
   filename[fn->dsc$w_length] = '\0';
   fn->dsc$w_length = strlen(filename);

   printf("Filename : %s",filename);
   
   if (*mode == 0)
          eingabe = fopen(filename,"r");
   else
          eingabe = fopen(filename,"rb");

   if (eingabe==NULL)
          err = 1;
   else
          err = 0;
}

int lies_zeichen (void)
/* Einlesen eines einzelnen Zeichens aus <fn> */
{
   int dummy;
   
   if (eingabe==NULL)
      return -1;
   else
      return fgetc(eingabe);
}

void schliesse_file (struct dsc$descriptor_s *mode,int *err)
/* Schliessen eines Files + evtl loeschen von <fn> */
{
   short status;
   char *modetext;
   $DESCRIPTOR (dfn,filename);

   modetext = mode->dsc$a_pointer;
   modetext[mode->dsc$w_length] = '\0';
   mode->dsc$w_length = strlen(modetext);

   status = fclose (eingabe);
   if (status==0)
      *err = 0;
   else
      { *err = 1; goto end; }
      
   if (modetext[1]=='D')
   {
      status = LIB$DELETE_FILE(dfn);
      if (status != SS$_NORMAL)
          printf("SCRDMP: error deleting %s\n",filename);
      end:;
   }
}

---------------------------------------------------------------------------

Das Problem entsteht wie zu sehen bei der Uebergabe von FORTRAN dele an C
mode in schliesse_file. Kurioserweise funktioniert die identische Uebergabe
des filenamens an oeffne_file tadellos.

Antworten per E-Mail oder wie auch immer und danke im Voraus.

Ciao ...


-------------------------------------------------------------------------------
 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.