2016-07-05 3 views
0

У меня возникли проблемы с передачей строки из Fortran на C. Код C передает строку, содержащую путь к файлу Fortran. Функция читается в файле и должна возвращать строку из двух символов.Как передать постоянную строку из функции fortran в C

Вот мой C код

#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 ; 
} 

Вот моя Fortran функция

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 

Выход:

Id_type=IR (From the Fortran side) 

id_type is IRV2?  (From the C side) 

Выход в коде C, должны быть только первые два символа. Любая помощь была бы оценена

+0

может http://stackoverflow.com/q/19913383/577108 и http://stackoverflow.com/q/9972743/577108 может дать вам идею. – haraldkl

+0

Кстати, обратите внимание, что '', '', '' и '' являются заголовками C++, а 'using namespace std;' - это оператор C++. Таким образом, этот код не будет компилироваться как C. Хотя основной код является чистым стилем C, он будет компилироваться только как C++. –

+1

Существует пример передачи строки из C в Fortran по адресу http://stackoverflow.com/questions/8207997/calling-a-fortran-subroutine-from-c. Я предлагаю изучить это, чтобы понять разницу между строками C и Fortran. Следующий шаг: дальнейшее изучение связывания ISO C, чтобы добавить аргумент return. Существует много примеров переполнения стека. –

ответ

0

Вместо

id_type[2] 

сделать что по крайней мере

id_type[3] 

и установить 3 й символ (с индексом 2) в целое число 0 после вызова к процедуре Fortran, в противном случае это не будет строка с нулевым завершением, которую понимает C.


Поскольку текущий код пытается вывести ненулевой заканчивающуюся строку он получает доступ к памяти за пределами массива и формально Неопределенное поведение.

С UB ничего или ничего или, возможно, то, что вы ожидаете, может случиться.

Вы только что получили некоторые странные дополнительные символы.


Строки дисплеи правильно в Fortran, потому что вы указали его длину есть,

character(2) :: id_type 

Там не совсем соответствующая функция в C, но в C++ можно использовать std::string длину 2 и передать его буфер в Fortran рутина,

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

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

Я пытаюсь id_type [3], и вывод почти такой же: id_type is IR ?? h – Milton

+0

Если вы действительно установите 3-го символа в целое число 0, тогда функции вывода C не будут отображаться больше, чем 2 персонажи. Итак, повторите попытку. ;-) –

+0

Спасибо большое! решение оказалось более простым. Ключевым моментом является то, что null завершает строку. Я использую 'id_type [2] = '\ 0'; 'и он работает просто отлично! – Milton