ファイル ハンドル、文字列、および長さを渡す Fortran 77 関数を C++ から呼び出しています。ファイルが正常に開き、Fortran サブルーチンが終了します。ただし、C++ コードに戻ると、fortran に渡された文字列が壊れています。関数 openFile の最後に達すると、プログラムがクラッシュします。
クラッシュはリリースでのみ表示され、デバッグでは表示されません。文字列をプロットすると、変数 fileNameToFortran がゴミでいっぱいになっていることがわかります。
ご協力いただきありがとうございます
リリース (Windows 7 マシン (32 ビット)) では、次のコンパイラ フラグで ifort を使用します: /names:lowercase /f77rtl /traceback /iface:cref /threads /recursive /LD
およびデバッグ: /names:lowercase /f77rtl /traceback /iface:cref /threads /recursive /LDd /Zi /debug:full /check:all /traceback
Cコードは次のとおりです。
typedef void (FORTCALL *sn_openfile_func) (int *,
char[],
int *,
int);
void openFile(const int fileHandle, const std::string fileName)
{
int fileHandleToFortran = fileHandle;
char fileNameToFortran[20];
assert(fileName.size() < 20);
strcpy(fileNameToFortran, fileName.c_str());
int lstr = strlen(fileNameToFortran);
openfile_func_handle(&fileHandleToFortran, fileNameToFortran, &lstr, lstr);
}
Fortran コードは次のとおりです。
SUBROUTINE SN_OPENFILE(FILENR,FILENAME,FSIZE)
!DEC$ ATTRIBUTES DLLEXPORT :: SN_OPENFILE
IMPLICIT NONE
INTEGER FILENR, FSIZE
CHARACTER FILENAME*FSIZE
OPEN (FILENR,FILE = FILENAME,
& ACCESS = 'SEQUENTIAL' , STATUS = 'REPLACE', ERR=222)
GOTO 333
222 WRITE(*,*) 'Error opening file'
333 END