代码之家  ›  专栏  ›  技术社区  ›  LambdaBeta

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

  •  2
  • LambdaBeta  · 技术社区  · 8 年前

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

    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 回复  |  直到 8 年前
        1
  •  1
  •   RREE    8 年前

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

    Raw_Image 作为无约束数组。C中没有对应的数组。您只能将受约束的数组从C传递到C。

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

    (1) 将第一个参数声明为类型 System.Address 并使用该软件包 System.Address_To_Access_Conversions

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