Ada 将记录数组传递给 c 函数
Ada pass array of records to c function
我知道类似的问题已经发布,但它的解决方案对我不起作用。在我的规范文件中,我有代码:
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
由于我将编译器标志设置为将警告视为错误,因此无法编译。关于如何解决这个问题有什么建议吗?
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-spec。 See Generating Ada Bindings for C and C++ headers
我知道类似的问题已经发布,但它的解决方案对我不起作用。在我的规范文件中,我有代码:
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
由于我将编译器标志设置为将警告视为错误,因此无法编译。关于如何解决这个问题有什么建议吗?
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-spec。 See Generating Ada Bindings for C and C++ headers