2016-05-13 15 views
3

Ich habe eine Anforderung, wo ich eine Zeichenfolge von einer C-Funktion an eine Ada-Funktion übergeben muss (eine C-Ada-Bindungsanwendung).Die besten Möglichkeiten, Strings von C nach Ada zu übergeben

C Funktion:

extern void ada_func_print_string(char*); 
void Pass_String() 
{ 
    char str[] = "Hello_Ada"; 
    ada_func_print_string(str); 
} 

Ada-Funktion:

Spec:

pragma Export (Convention => C, 
       Entity  => Ada_Print_String, 
       External_Name => "ada_func_print_string"); 

Körper:

procedure Ada_Print_String (C_Source : Interfaces.C.char_array) 
    Ada_Str : String := Interfaces.C.To_Ada(Item  => C_Source, 
              Trim_Nul => True); 
begin 
    Ada.Text_IO.Put_Line(Ada_Str);  
end Ada_Print_String; 

Der obige Code ziemlich funktioniert ohne jede Hektik. Die Frage, die ich habe, ist, ob die Deklaration der formalen Parameter C_Source ist gut, um ein Interfaces.C.char_array oder es sollte besser Interfaces.C.Strings.chars_ptr? Was ist der Unterschied zwischen den beiden in Bezug auf diese Anwendung? Gibt es einen Todesfall unter diesen beiden Arten hier?

+0

Großartig, es hat wirklich geholfen !! –

Antwort

3

Ada 95 Rationale, §B.2 C Interface Package, §B.2.2 Strings kann einige Perspektive dazu bieten. Beachten Sie, dass Interfaces.C ein pure Paket ist, das die grundlegenden Typen und Unterprogramme bereitstellt, die es einem Ada-Unterprogramm erlauben, eine C-Zeichenfolge zu akzeptieren. Im Gegensatz dazu ermöglicht Interfaces.C.Strings "ein Ada-Programm, C-Style-Strings zuzuteilen, zu referenzieren, zu aktualisieren und freizugeben" über den privaten Typ chars_ptr. In Ihrem Beispiel fügt der C-Compiler must einen Null-Terminator an Ihr String-Literal an, aber ein fehlerhaftes C-Programm kann Unheil verursachen.

char str[] = {'H','e','l','l'}; 

Überprüfen Sie, ob Ihr Code die resultierende Terminator_Error verarbeitet.