2016-07-05 9 views
0

Ich habe Probleme, eine Zeichenfolge von Fortran an C zu übergeben. Der C-Code übergibt eine Zeichenfolge, die einen Dateipfad zu einer Fortran-Funktion enthält. Die Funktion liest die Datei ein und sollte eine zwei Zeichen lange Zeichenfolge zurückgeben.Wie Übergeben einer konstanten Zeichenfolge von Fortran-Funktion zu C

Hier ist meine 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 ; 
} 

Hier ist meine Fortran Funktion

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 

Die Ausgabe lautet:

Id_type=IR (From the Fortran side) 

id_type is IRV2?  (From the C side) 

Die Ausgabe, in der C-Code, sollte nur sein die ersten zwei Zeichen. Jede Hilfe sehr geschätzt werden würde

+0

Vielleicht http://stackoverflow.com/q/19913383/577108 und http://stackoverflow.com/q/9972743/577108 kann Ihnen eine Idee geben. – haraldkl

+0

Übrigens, '', '', '' und '' sind C++ - Header, und 'using namespace std;' ist eine C++ - Anweisung. Also wird dieser Code nicht als C kompiliert. Obwohl der Hauptcode ein reiner C-Stil ist, wird er nur als C++ kompiliert. –

+1

Es gibt ein Beispiel für die Übergabe einer Zeichenfolge von C an Fortran unter http://stackoverflow.com/questions/8207997/calling-a-fortran-subroutine-from-c. Ich schlage vor, das zu studieren, um den Unterschied zwischen C- und Fortran-Saiten zu verstehen. Nächster Schritt: Weitere Untersuchung der ISO C-Bindung, um ein Rückgabeargument hinzuzufügen. Es gibt viele Beispiele für Stack Overflow. –

Antwort

0

Statt

id_type[2] 

, dass mindestens

id_type[3] 

und stellen Sie die 3 rd Zeichen (bei Index 2) 0 nach dem Aufruf auf ganzzahlige zu der Fortran-Routine, andernfalls wird es keine mit Null beendete Zeichenfolge sein, die C versteht.


Da der aktuelle Code auszugeben versucht, eine Nicht-Null-terminierte Zeichenkette, die es über die Speicher-Array zugreift, und hat formal undefiniertes Verhalten.

Mit UB alles oder nichts oder möglicherweise was Sie erwarten können passieren.

Sie haben gerade ein paar seltsame zusätzliche Zeichen.


die Zeichenfolge richtig angezeigt wird in Fortran, weil Sie angegeben haben, da seine Länge,

character(2) :: id_type 

Es gibt nicht wirklich eine entsprechende Funktion in C, aber in C++ Sie eine std::string der Länge 2 verwenden könnte und Pass seinen Puffer in die Fortran-Routine,

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

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

Ich habe id_type [3] versucht und die Ausgabe ist ziemlich genau das gleiche: id_type ist IR ?? h – Milton

+0

Wenn Sie wirklich das 3. Zeichen auf Integer 0 setzen, dann zeigen C-Ausgabefunktionen nicht mehr als die 2 zuerst Figuren. Also, versuche es noch einmal. ;-) –

+0

Vielen Dank! Die Lösung erwies sich als einfacher. Der Schlüsselpunkt ist, die Zeichenfolge null zu beenden. Ich benutze 'id_type [2] = '\ 0'; 'und es funktioniert gut! – Milton

Verwandte Themen