Ich muss eine Struktur von C nach Ada in einer Ada-Bindeanwendung übergeben. Daher habe ich die Struktur sowohl in Ada als auch in C so deklariert, dass beide Quellseiten die Strukturzusammensetzung entschlüsseln können.Struktur von C nach Ada übergeben
In C
typedef struct {
int Status_Code;
int Error_Code;
} Edit_Result_Type;
In Ada,
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;
Wenn ich die Struktur von C nach Ada durch Bezugnahme durch Anruf bin vorbei, wollte ich wissen:
Ist es in Ordnung, wenn ich in Ada und. Einen "Access all" - Vektortyp für die Struktur deklariere (wie oben -
Edit_Result_Rec_Type_Ptr
)? verwende es direkt als formalen Parameter in der Ada-Funktion. Für zB: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;
Ist dieser Ansatz FATAL? Ich weiß es ist, wollte nur "wie" in der Tiefe wissen!
Gibt es noch andere (bessere) Ansätze zum Durchlaufen von Call by Reference? Ich glaube, ich kann es als "System.Address" -Parameter übergeben und eine "ungeprüfte Konvertierung" in
Edit_Result_Rec_Type_Ptr
in einem lokalen Vektor innerhalb der Ada-Funktion und dann lesen/schreiben Datensatzmitglieder? Hat dieser Ansatz Todesopfer?
Nicht sicher, was Sie meinen. C ist ** strikt ** Aufruf nach Wert. – Olaf
Ja, genau! C bietet keine Referenzen. Sie können die Adresse eines Objekts an einen Zeiger übergeben, aber der Zeiger wird auch als Wert übergeben. – Olaf