4

ファイル ハンドル、文字列、および長さを渡す 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
4

1 に答える 1

1

OK、私は自分で答えを見つけました。

マクロ FORTCALL は __STDCALL として定義されていました。現在、iface:cref を使用すると、リリースでのみクラッシュします。それは奇妙ですが、削除した後は、リリースとデバッグで機能します。

于 2013-03-15T14:38:52.200 に答える