1

私は、 ( Ada で)Ada.Strings.Unbounded.Unbounded_Stringを取る C 関数に渡したいを持っています。char *Interfaces.C.chars_ptr

私の現在の実装では、無制限の文字列を固定文字列にコピーしてから、固定文字列をchars_ptr.

F_String : String := To_String (UB_String);
C_String : chars_ptr := New_String (F_String);

これは 2 回コピーされることに注意してください。

Imported_Function (C_String);
Free (C_String);

そして捨てるF_String

最小限のコピーを使用して、目的の動作 (Unbounded String に保持されている文字列をインポートされた C 関数に渡す) を実現できますか? 理想的には、内部バッファーを関数に直接渡すのがクールです UB_Stringが、これはおそらく移植性がありません。中間の固定文字列を必要とせずに、少なくとも同じ動作を実現できますか?

Ada.Strings.Unbounded.AuxGNAT には、Unbounded String の内部バッファーへのアクセスを可能にする内部パッケージがあることがわかりましたが、これは移植性がなく、GNAT のバージョン間で壊れる可能性があります。

4

2 に答える 2

1

ADA での文字列操作は苦痛であり、最初から無制限の文字列を使用しないようにする以外にできることはあまりありません (おそらく、レコードに文字列フィールドが必要な場合にのみ使用しますか?)。

with Ada.Strings.Unbounded; use Ada.Strings.Unbounded;
with Interfaces.C; use Interfaces.C;
...
procedure Imported_Function(Item : in access Interfaces.C.Char);
pragma Import(C, Imported_Function, "...");
Item : aliased Interfaces.C.Char_Array := To_C(To_String(UB_String)); -- no need to free
begin
  Imported_Function(Item(Item'first)'access);
  ... 
于 2013-10-01T11:18:17.127 に答える