Ada将记录数组传递给c函数

时间:2017-11-13 00:41:25

标签: c ada gnat

我知道已经发布了一个类似的问题,但它的解决方案并不适用于我。在我的spec文件中,我有代码:

type Colour_Component is mod 256;

type Colour is
    record
        A, R, G, B : Colour_Component;
    end record;

type Raw_Image_Data is array (Interfaces.C.int range <>) of Colour;

type Raw_Image is access all Raw_Image_Data;
pragma Convention (C, Raw_Image);

然后我尝试与C函数接口:

function C_SDL_CreateRGBSurfaceFrom (
    Pixels : Raw_Image;
    Width : int;
    Height : int;
    Depth : int;
    Pitch : int;
    Rmask : Unsigned_32;
    Gmask : Unsigned_32;
    Bmask : Unsigned_32;
    Amask : Unsigned_32)
    return System.Address;
pragma Import (C, C_SDL_CreateRGBSurfaceFrom, "SDL_CreateRGBSurfaceFrom");

但是当我尝试编译它时,我收到警告:

warning: type of "C_SDL_CreateRGBSurfaceFrom.Pixels" does not correspond to C pointer
warning: this access type does not correspond to C pointer

由于我将编译器标志设置为将警告视为错误而不进行编译。关于如何解决这个问题的任何建议?

1 个答案:

答案 0 :(得分:1)

Ada数组有两种类型,即约束和无约束数组。 C数组是受约束的(较新的C标准也有动态大小的数组),但如果您在函数调用周围传递C数组,则使用零元素或单独的长度参数终止它们。

无论如何,您将参数Raw_Image声明为无约束数组。 C中没有对应物。您只能将约束数组从C传递给C。

我认为你有两个选择:(1)使用地址来访问转换或(2)使用绑定生成器-fdump-ada-spec

(1)声明您的第一个参数System.Address,并使用包System.Address_To_Access_Conversions

(2)最简单的方法是在C头上使用g​​cc开关-fdump-ada-spec。 See Generating Ada Bindings for C and C++ headers