2

基本的に、ここに私の問題があります。自分の C++ コードから他の誰かの FORTRAN 関数を呼び出しているのですが、頭痛の種です。いくつかのコード:

function c_error_message()
character(len = 255) :: c_error_message
errmsg(1:9) = 'ERROR MSG'
return
end

それがFORTRAN関数です。私の最初の質問は、セグメンテーション違反を引き起こすものはありますか?

そうでない場合は、2 番目に: それは何を返しますか? ポインタ?次のCステートメントで呼び出そうとしています:

char *e = c_error_message_();

これにより、セグメンテーション違反が発生します。

c_error_message();

それもセグメンテーション違反を引き起こします。

以前に次のコードで c_error_message_() を宣言しました。

extern"C" {
    char* c_error_message_();
}

実際の戻り値の型とは異なる戻り値の型を持つ関数を宣言すると、segfault が発生しますか?

私は途方に暮れています。返信ありがとうございます。

4

3 に答える 3

2

これが機能する方法です。文字列を返す関数で ISO C Binding を使用しようとすると、コンパイラが反対しました。したがって、代わりにサブルーチン引数を使用する場合:

subroutine fort_err_message (c_error_message) bind (C, name="fort_err_message")

use iso_c_binding, only: C_CHAR, C_NULL_CHAR

character (len=1, kind=C_CHAR), dimension (255), intent (out) :: c_error_message

character (len=255, kind=C_CHAR) :: string
integer :: i

string = 'ERROR MSG' // C_NULL_CHAR

do i=1, 255
   c_error_message (i) = string (i:i)
end do

return

end subroutine fort_err_message

技術的には C 文字列は文字の 1D 配列であるため、Fortran は少し厄介です。

そして、これが機能することをデモする C コードの例:

#include <stdio.h>

void fort_err_message ( char chars [255] );

int main ( void ) {

  char chars [255];

  fort_err_message ( chars );

  printf ( "%s\n", chars );

  return 0;

}
于 2010-03-25T02:41:53.543 に答える
1

2行目は関数名と同じ名前を宣言しているので、関数の戻り値の型、つまり255文字のスケーラ文字列を宣言しています。しかし、理論的には、これは内部 API を教えてくれません。「errmsg」がどこから来たのかわかりません-それは他の場所で宣言する必要があります-おそらくMichael Andersonによって提案されたグローバル変数です。または、これは間違いで、行は c_error_message = "ERROR MSG" のはずです。(部分文字列の範囲を指定する必要はありません。文字列の残りの部分は空白で埋められます。) IMO、C から Fortran を呼び出す (またはその逆) ための最良の方法は、ISO C を使用することです。 Fortran コンパイラが C 互換のインターフェイスを使用するようにします。文字列を返す関数は実行していませんが、

于 2010-03-25T02:18:39.587 に答える
0

FORTRAN 関数は、関数名に割り当てられた値を返します。返される型は関数定義で指定されており、この場合は 255 文字の文字列を返しています。タイプの不一致が、セグメンテーション違反の理由だと思います。では、どの C 型を使用すればよいでしょうか。知らない。

このUsing C with FORTRANページを見つけました。著者は、FORTRAN サブルーチンを使用し、それらを void 型を返す C 関数として呼び出すことを強く推奨しています。

ここにF95 のクイック リファレンスがあります。

于 2010-03-25T02:23:56.807 に答える