1

C 関数を呼び出す Fortran サブルーチンがあります。C 関数の引数の 1 つは fortran 文字列です。これは、長さ 512 バイトの空の文字列として初期化され、C 関数に として渡さtrim(str)//char(0)\0ますstrlen

character(len=512)  :: str = ""
call C_foo (  trim(str)//char(0)  )

C関数内で、これを行うことができますか

strncpy (str, "something", strlen("something") )

私が知りたいのは、 docstrimに記載されている変換関数であるため、それを C に渡すと実際に割り当てられたスペースが変更されるということです。C 関数内で、strncpy が失敗することはありますか (ソース文字列の長さが 512 未満の場合) ? 試してみましたが、問題なく動作しますが、安全であることを確認したいと思います。

4

2 に答える 2

4

useISO_C_BINDING を使用して、次の方法で文字列を初期化しないのはなぜですか。

character(len=512)  :: str = C_NULL_CHAR

この場合、文字列の長さは 512 になり、最初の文字は C 文字列の null 文字で、残りは空白になります。

于 2013-09-26T16:00:50.247 に答える
2

「C」が何をするのかには触れずに、私のコメントを詳しく説明するために、次の純粋な fortran の例を考えてみましょう。

character(len=512) :: g=""
call f(trim(g))
end

subroutine f(s)
character(len=*) :: s
integer :: i
do i=1,100
 s(i:i)="0"
enddo
end

これは正常にコンパイルされますが、セグメント障害が発生します。

call f(g)

大丈夫です。あるいは、g を十分に長い空白以外の文字列に割り当てると、たとえば追加します。

g(100:100)="0"

それはうまく機能します。

表示されるのは、trim() によって渡される文字列が必要な長さ (最初のケースではゼロ) しかないか、 //char(0) を追加した場合は 1 であることです)

ちなみにサブルーチンでの簡単な代入

s=" ... 512 characters .. "

機能します..割り当ては、指定されたスペースに収まる多くの文字のみです。(gfortran)が埋めるスペースの量をどういうわけか知っているのは興味深い..しかし、私はそれを当てにしない.

于 2013-09-26T18:52:47.643 に答える