2017-05-31 73 views
0

最近,我遇到的是隻使用阿達安全關鍵系統來了。該系統提供約3個包裝,每個包裝中包含約200-300個功能作爲源。暴露ADA API以C/C++(可伸縮方式)

我需要訪問幾乎所有這些功能的其他軟件系統(非常漂亮整潔的),它完全用C/C++。

目標:我需要公開這些阿達功能C/C++。

我明白我可以使用pragma Export()結構導出的功能和interfaces.C包到C和Ada之間的參數轉換。

但是,我在想,如果有一個更容易或更可擴展的方式來做到這一點?

  1. 可能在某種程度上暴露了完整的包?
  2. 或者開發RPC架構?
  3. 或者使用創建C/C++聲明和類型轉換的工具?

如果有相似經驗的人可以指引我正確的方向,那真的會有幫助。

記住我尋找一個Ada to C translator

+1

編譯出口,或相關方面,如果你有2012阿達工作,你在找什麼,至少我對你的目標的理解。你可以寫一個腳本來爲你生成那些輸出;這就是我要做的。 –

+0

不好意思,我的意思是C或C++都可以。最好是C++。 – Tony

+0

@PatrickKelly:您能否詳細說明您如何使用腳本?我之前從未使用腳本將ADA功能暴露給C.或者可能共享一個簡單的腳本。謝謝 – Tony

回答

0

你可以嘗試,如果你使用的是阿達2012編譯器添加ExportConvention => X方面的包;例如:

Package K with Export, Convention => C_Plus_Plus is 

    Function A(Input_1, Input_2 : Integer) return Integer; 

End K; 

這實際上編譯,但因爲我沒有任何C++或C混源項目試試這件,我不能告訴你,如果結果是嚴格講從C++側可用。

如果不起作用,也許是更好的方法是創建一個包特別適用於出口,這將在C++側使用的功能(和類型)。

With 
System, 
Interfaces.C.Strings, 
Interfaces.C.Pointers; 

Package K with Convention => C_Plus_Plus is 

    ------------- 
    -- TYPES -- 
    ------------- 

    Type CPP_Window_Handle is Private; 
    Subtype CPP_String is Interfaces.C.Strings.chars_ptr; 

    -------------- 
    -- MODULES -- 
    -------------- 

    Package UI_Module is 
     Procedure Set_Title(Window : CPP_Window_Handle; Text : CPP_String) 
     with Export; 
    End UI_Module; 

Private 
    Package STUB_TYPES is 
     Type Window is tagged null record; 
    End STUB_TYPES; 
    Use STUB_TYPES; 

    Type CPP_Window_Handle is not null access Window'Class 
    with Convention => C_Plus_Plus, Size => Interfaces.C.int'Size; 

End K; 

實現爲:

Package Body K is 

    Package STUB_FUNCTIONS is 
     Procedure Set_Window(Object : in out STUB_TYPES.Window'Class; Text : String) is null; 
     --' 
    End STUB_FUNCTIONS; 

    Package Ada_Dependencies renames STUB_FUNCTIONS; 

    Package Body UI_Module is 
     Procedure Set_Title(Window : CPP_Window_Handle; Text : CPP_String) is 
      function Value (Item : CPP_String) return Interfaces.C.char_array 
       renames Interfaces.C.Strings.Value; 
      function Convert(Item  : Interfaces.C.char_array; 
          Trim_Nul : Boolean := True) return String 
       renames Interfaces.C.To_Ada; 
     Begin 
      Ada_Dependencies.Set_Window(
       Object => Window.all, 
       Text => Convert(Value(Text)) 
     ); 
     End Set_Title; 

    End UI_Module; 

End K; 
+0

這與此類似:https://stackoverflow.com/questions/42938883/interface-ada-dynamic-library-with-java-using-jna-and-adas-interface-c-packages/42938971#42938971。正如@ Shark8所述,您可以在要公開的方法上添加'pragma export',或者添加一個使用'pragma export'編寫的路由層,以實現對Ada程序/函數的有效調用。如果您的ada服務的輸入中含有具有歧視性的類型,則可以使用其他類型的轉換:ifntance。由於Ada結構不能總是易於用C/C++映射 – LoneWanderer