Ant*_*ony 6 c string pointers ada
什么是"中投"的Ada的一个很好的方式String到System.Adress这将是相当于铸造char*到void*在C.
我正在连接哪个C库.AC类型具有类型的属性void*,并且库的用户通常将C字符串指向的地址指定为该值.例如:
struct my_type {
void* value;
};
int main() {
my_type t;
t.value = "banana";
}
Run Code Online (Sandbox Code Playgroud)
如何从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;
Run Code Online (Sandbox Code Playgroud)
我对任何解决方案都很满意,甚至是Ada 2012.
您在评论中提到您正在使用void*\xe2\x80\x9c 因为它应该能够获取任何内容的地址;不仅仅是一个字符串。\xe2\x80\x9d
那么,人们必须问如何将通用指针转换为 Ada,特别是如何利用类型和子类型功能。我认为 \xe2\x80\x9canything\xe2\x80\x9d 在这种情况下一般无法解决;也就是说,如果您想保持构造的“灵活性”,您必须牺牲 Ada 及其类型系统提供的优势。此外,我认为按原样呈现,通常不可能可靠地使用 \xe2\x80\x9canything\xe2\x80\x9d。
\n\n我这样说是因为没有方法可以确定所包含的 \xe2\x80\x9canything 的长度。\xe2\x80\x9d 如果它是一个字符串,那么长度是从指向地址开始,连续计数,直到第一个 NUL字符(ASCII 0)。但是,如果它不是字符串,则没有方法确定长度(我们如何知道数组 [1,2,3] 或 OBJECT 的长度/大小)...因此我们甚至没有方法确定\xe2\x80\x9canything 的长度。\xe2\x80\x9d
\n\n确定长度是编写稳定/安全代码的一个重要因素,因为如果不这样做,就会导致缓冲区溢出。
\n\n但是,如果您可以提供一些有关数据的信息,无论是通过参数还是更改my_struct,那么我们就可以使用该信息来构建更好的类型转换。(一般来说,关于类型的信息越多越好,因为您可以用以前无法做到的方式检查数据的有效性;或者更好的是,让编译器为您检查。)
Type Data_Type is Array( Positive Range <> ) of Interfaces.Unsigned_8;\n For Data_Type'Component_Size Use 8;\n\n\nFunction Some_Data( Stream : not null access Ada.Streams.Root_Stream_Type'Class; \n Length : In Positive ) Return Data_Type is\n begin\n Return Result : Data_Type(1..Length) do\n For Index in Result'Range loop\n Interfaces.Unsigned_8'Read(Stream, Result(Index));\n end Loop;\n End Return;\n end Some_Data;\nRun Code Online (Sandbox Code Playgroud)\n\n您可以使用上面的代码生成一个 8 位无符号整数数组,其中包含流中的数据。它概述了在一般情况下你必须做的事情,尽管因为你正在使用 C 导入,你可以做的就是稍微修改它,以便 a) 有一个变量,它是一个Temp类似于数组的变量Result,但用于For Temp'Address Use [...]覆盖它放在 my_type.value 上,然后使用 for 循环将其复制出来。
| 归档时间: |
|
| 查看次数: |
943 次 |
| 最近记录: |