私はあなたのコードには、いくつかのポイントがあります。
コンパイル可能なコードを入力し、その正確なコードの出力を記述してください。
これには、標準ヘッダー用の#include
が含まれています。コードをデバッグしたい場合は、ユーザーが「明白」と思われたために省略した行を検索する必要がないようにします。ちょうどすべてを貼ります。ここからコピーするとコードがコンパイルされるはずです!
コードの実行可能部分であっても、私のコンパイラではコンパイルされません。 *data
をdata
に変更する必要がありました。実際のコードをコピーしてもよろしいですか?
cfun.c: In function ‘copymemory_’:
cfun.c:13:9: error: invalid type argument of unary ‘*’ (have ‘int’)
*data[i] = i;
^
cfun.c:14:31: error: invalid type argument of unary ‘*’ (have ‘int’)
printf("memory %i \n",*data[i]);
^
あなたのFortranコードには、printf
サブルーチンの呼び出しが含まれています。これはどこに定義されていますか?あなたの実際のコードには存在しますか?私はそうは思わない。 StackOverflowに常に完全でコンパイル可能なコードをコピーしてください。
だから、明らかに固定した後、あなたの現在のコードは次のとおりです。
#include <stdio.h>
#include <stdint.h>
void copymemory_(uint32_t *addr, int *size, uint8_t *data)
{
int i;
printf("addr %x \n", *addr);
printf("size %i \n", *size);
for (i = 0; i<*size; i++)
{
data[i] = i;
printf("memory %i \n",data[i]);
}
}
implicit none
integer :: memsize = 4
integer memory(4)
integer i
call copymemory(z'dead', 4, memory)
DO i = 1,memsize
print *, (memory(i))
END DO
END
それはクラッシュしませんが、Fortranでmemory
はゴミが含まれています。それはinteger
であり、Cでint8_t
と扱っているからです。
したがって、Cで4つの整数の配列として扱うか、1バイトずつコピーしますが、正しい数を渡す必要があります。コピーするバイト数。あなたの説明から、あなたの意図であるので、私はただ一つの可能性が表示されますどちら明らかではない。
void copymemory_(uint32_t *addr, int *size, uint32_t *data)
を出力が正しいです:
> gfortran-4.10 -fsanitize=address cfun.c ffun.f90
> ./a.out
addr dead
size 4
memory 0
memory 1
memory 2
memory 3
0
1
2
3
は、なぜあなたは何かが間違っていると思いますか?何が起こるのですか? Fortran側では、 'memsize'と' printf'とは何ですか?そして 'z'dead''はどこにいますか? C側で、なぜ 'uint8_t'ですか?標準のFortran-C相互運用性を使用できないのはなぜですか? – francescalus
よく仲間ですが、これは呼び出し規約にかなり依存しています...私は一生を通してFortranコードを書いたことはありませんでしたが、今は試してみます – DrPrItay
エラーメッセージはありますか?どれ?間違った結果が印刷されますか?彼らはどのように見えるのですか? –