AdaバインディングアプリケーションでCからAdaに構造体を渡す必要があります。したがって、私はAdaとCの両方の構造を宣言し、両方のソース側が構造の構成を解読できるようにしました。CからAdaへの構造体の受け渡し
Cで、エイダで
typedef struct {
int Status_Code;
int Error_Code;
} Edit_Result_Type;
、
type Edit_Result_Rec_Type is
record
Status : Integer;
Error_Code : Integer;
end record;
pragma Convention (Convention => C,
Entity => Edit_Result_Rec_Type);
for Edit_Result_Rec_Type use
record
Status at 0 range 0 .. 31;
Error_Code at 0 range 32 .. 63;
end record;
type Edit_Result_Rec_Type_Ptr is access all Edit_Result_Rec_Type;
私が参照によって呼び出しを通してCからエイダの構造を渡していたとき、私が知りたかった:
Adaで(上記のように-)構造体の「すべてアクセス」ベクトル型を宣言しても構いません。 Ada関数の仮パラメータとして直接使用します。例:
procedure Process_Data (Edit_Result_Ptr : in out Edit_Result_Rec_Type_Ptr) is begin Edit_Result_Ptr.Status := 1; Edit_Result_Ptr.Error_Code := 0; end Process_Data;
このアプローチは致命的ですか?私はそれが知っている、ちょうど "どのように"深さを知りたい!
他の(より良い)アプローチで参照渡しを行う方法はありますか?私はそれを "System.Address"パラメータとして渡し、Ada関数内のローカルベクトルの
Edit_Result_Rec_Type_Ptr
に "チェックされていない変換"を行い、レコードメンバーを読み書きすることができますか?このアプローチには致命的な問題がありますか?
あなたは何を意味するのかわかりません。 Cは**厳密には**値による呼び出しです。 – Olaf
はい、まさに! Cは参照を提供しません。オブジェクトのアドレスをポインタに渡すことはできますが、ポインタも値渡しになります。 – Olaf