简体   繁体   中英

How to pass a constant string from fortran function to C

I'm having troubles to pass a string from Fortran to C. The C code passes a string that contains a filepath to a Fortran function. The function reads in the file and should return a two-characters string.

Here is my C code

#include <stdlib.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <sys/time.h>
#include <iostream>
#include <iomanip>
#include <fstream>
#include <sstream>
#include <time.h>
#include <ctype.h>
using namespace std;

extern "C" void read_id_type_(char *file_path, char *id_type, size_t *path_len_file);

int main(int argc, char **argv) {

char path[500],id_type[2];
char *dir_path, *file_path;
dir_path=path;
size_t path_len=strlen(dir_path);

file_path=strcat(path,"/rnspar_mpt1.dat");
size_t path_len_file=strlen(file_path);

read_id_type_(file_path,id_type,&path_len_file);
 printf("id_type is %s\n",id_type);

 return EXIT_SUCCESS ;
 }

Here is my Fortran function

 integer function read_id_type(filename,id_type,path_len) 
 implicit none

 integer :: nrg, nrf, nrf_deform, nrgin,path_len
 character(400) :: filename
 character(2) ::  id_type,EQ_point

 filename=filename(1:path_len)
 write(*,*),"Reading file", filename

 open(unit = 1,file = trim(filename), status='old')
 read(1,'(4i5)') nrg
 read(1,'(4i5)') nrf
 read(1,'(2i5,2(3x,a2))') nrf_deform, nrgin, id_type, EQ_point
 close(1)
 print *,"Id_type=",id_type
 read_id_type = 0
 end function read_id_type

The output is:

Id_type=IR    (From the Fortran side)

id_type is IRV2?      (From the C side)

The output, in the C code, should be only the first two characters. Any help would be much appreciated

Instead of

id_type[2]

make that at least

id_type[3]

and set the 3 rd character (at index 2) to integer 0 after the call to the Fortran routine, otherwise it won't be a zero-terminated string that C understands.


Since the current code tries to output a non-zero-terminated string it accesses memory beyond the array and has formally Undefined Behavior.

With UB anything or nothing or possibly what you expect can happen.

You just got some weird extra characters.


The string displays correctly in Fortran because you've specified its length there,

character(2) ::  id_type

There's not really a corresponding feature in C, but in C++ you could use a std::string of length 2 and pass its buffer to the Fortran routine,

std::string id_type( 2, ' ' );

//...
read_id_type_( file_path, &id_type[0], &path_len_file );

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM