【发布时间】:2012-02-13 02:59:08
【问题描述】:
有什么好方法可以将 Ada String“转换”为 System.Adress,这相当于在 C 中将 char* 转换为 void*。
我正在连接哪个 C 库。 C 类型具有void* 类型的属性,并且库的用户通常将 C 字符串指向的地址分配为该值。例如:
struct my_type {
void* value;
};
int main() {
my_type t;
t.value = "banana";
}
如何在 Ada 中实现等效,从 Ada 字符串开始?
我目前正在使用这种技术,但对我来说似乎很可疑。
declare
str : constant String := "banana";
data : constant char_array := To_C(str);
mine : my_type;
begin
mine.value := data(data'First)'Address;
end;
我可以接受任何解决方案,即使是 Ada 2012。
【问题讨论】:
-
你应该看看包
Interfaces.C.Strings,它包含一个类型chars_ptr。您导入的 C 函数应使用 chars_ptr 类型而不是 void*。 -
另外,请在此处查看建议的解决方案:en.wikibooks.org/wiki/Ada_Programming/Types/…
-
该类型的
void*成员是void*,因为它应该能够获取任何地址;不仅仅是一个字符串。这就是g++为其生成 Ada 规范并使用System.Address的原因。我发现目前这项技术正在发挥作用。也许它是健全的? -
好吧,我猜你只想将它用于字符串,在这种情况下,你可以更改它以提高可读性并减少代码。但是,是的,
System.Address应该可以正常工作。