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.