从Ada调用C函数返回Array

时间:2015-02-26 22:20:00

标签: c interface ada

我有一个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数组并在不知道其长度的情况下迭代它?

1 个答案:

答案 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元素;)