我有一个C函数,它返回一个整数数组。如何在Ada中导入并调用它?
对于我的尝试失败,请参阅下文。
test.c的
#include <stdio.h>
int *get_numbers ()
{
static int numbers[5] = { 1, 2, 3, 4, 5 };
return numbers;
}
test.adb
procedure Test is
type Integer_Array is array (Integer range <>) of Interfaces.C.int;
pragma Convention (C, Integer_Array);
for Integer_Array'Component_Size use Interfaces.C.int'Size;
function Get_Numbers return Integer_Array;
pragma Import (C, Get_Numbers, "get_numbers");
A : Integer_Array := Get_Numbers;
begin
Ada.Text_IO.Put_Line (A (1)'Img);
end Test;
编辑: 当我知道它的长度时,我发现Passing a C++ array to Ada95有效。
但是,是否有可能获得一个C数组并在不知道其长度的情况下迭代它?
答案 0 :(得分:0)
您应使用数据类型来读取任何类型的内存。 请注意,无约束数组类型期望将边界存储在内存中的某处。
以下是使用整数数组类型的示例,它似乎是数据的格式:
with SYSTEM; use SYSTEM;
function Get_Numbers return SYSTEM.Address;
myReturnValue: SYSTEM.Address;
begin
myReturnValue := Get_Numbers();
declare
arrayContent : Integer_Array (0 .. MAXIMAL_IMAGINABLE_ARRAY_SIZE);
for arrayContent'Address use myReturnValue;
begin
Ada.Text_IO.Put_Line (A (1)'Img);
end;
不关心堆栈分配,我们只定义可观察性的类型。但是不要试图访问LAST元素;)