2017-04-17 8 views
0
typedef struct _StructWithCArray { 
    char a[3]; 
    char b; 
} StructWithCArray; 

私はstructとしてa[3]を表すには3 charが含まれているが、それは、iOSのi386シミュレータ上で失敗します。c配列を表す `ffi_type`を作成するには?

誰もがこれをどう対処するか考えていますか?


ここには、バグを示すdemoがあります。 BugReportプロジェクトを実行するには、iPhone 5より新しいシミュレータを使用する必要があります。iPhone 5より新しいシミュレータはこの場合問題ありません。

答えて

0

libffiには、配列型の組み込みの概念はありません。主に、C言語の関数に配列を渡す方法がないため、常にポインタとして崩壊します。しかし、構造の要素として配列を表現する必要がある場合があるため、これは理想的ではありません。つまり、それはlibffiの監督です。

この問題を回避するには、配列の要素ごとに1つの要素を構造体に追加するだけです。あなたの場合、3つのcharフィールドを追加します。これは、配列が要素と同じ位置合わせを持つため、一般的に機能します。

libffi documentationは、このアプローチを明示的に言及しています。

+0

返信いただきありがとうございます。私は3つの文字を持つ構造体を追加しようとしましたが、iOS i386シミュレータで実行すると、ちょうどクラッシュしました。次に、この回避策がこのアーチで同じように扱われないことがわかりました。さらに詳しい情報が必要な場合は、質問に簡単なデモを添付することができます。 – Karl

+0

代わりにgithubにlibffiのバグを報告してください。 –

+0

私はデモプロジェクトを追加しました。後でバグを報告します。 – Karl

0

3文字を含む構造体は、3文字の配列と同じではありません。それは安全にキャスタブルではありません。あなたは、コードを気にしない場合は、

StructWithCArray swc; 
swc.a[0] = s.c1; 
swc.a[1] = s.c2; 
swc.a[2] = s.c3; 

を行う必要がありますポータブルではありません、あなたは、配列と構造体のメモリレイアウトが同じであるという事実を知って、あなたは3をコピーするmemcpyを使用することができますchars。

0

これはどうですか。

ffi_type* ffi_type_nullptr = 0; 
ffi_type ffi_type_array; 

ffi_type_array.alignment = ffi_type_uchar.alignment; 
ffi_type_array.size = ffi_type_uchar.size * 3; 
ffi_type_array.type = FFI_TYPE_STRUCT; // Trick. 
ffi_type_array.elements = &ffi_type_nullptr; // Pointer to a null pointer. 

ffi_type* members[2]; 
members[0] = & ffi_type_array; 
members[1] = 0; 

ffi_type ffi_type_T = {0, 0, FFI_TYPE_STRUCT, members}; 
関連する問題