Ada具有C函数导入Seg Faults



我在Ada中有一个程序,最近从32位升级到64位。我没有写这段代码,我只是负责让它在64位版本的RedHat上运行。

我仍然在处理由这次迁移引起的错误。这个代码是seg错误,以前没有。

这是Ada函数

function Read_Fields
(table         : DB_API_Types.DB_Table_Type;
key           : System.Address;
return_fields : System.Address;
function      : Process_DB_Access_Type;
client        : System.Address)
return C_Types.Int;
pragma Interface(C, Read_Fields);
pragma Import_Function
(Internal => Read_Fields,
External => "GetFields",
Result_Type => C_Types.Int);

这是C函数

int GetFields ( DB::table_code table_type, char *key,
char **return_fields, DB::GetFieldCB function,
void *client) {
return ( DB::System::Ptr()->get_fields(table_type, key, return_fields, func, client)); 
}

以下是Ada 中此函数的调用示例

DB_Status :=
Read_Fields
(table         => table,
key           => c_types.null_terminated.to_address_or_null_pointer(field),
return_fields => table_Fields'address,
function      => Process_Data'access,
client        => read_Data_Return'address);

这让我有点困惑,我有自己的怀疑,但我不确定内存地址是如何跨语言接口工作的。我以为它们都会作为机器语言在一个过程中,所以这根本不重要,但我可能遗漏了一些东西。

任何帮助都会很棒!

您可以使用GCC/G++的-fdump-ada-spec标志重新生成到C++函数的绑定。通过这种方式,您可以获得一个绑定,编译器开发人员相信该绑定将正确地与该版本的GCC配合使用。(官方要求您使用相同版本的GCC来编译Ada和C++,但在实践中,您可能会得到与更广泛的编译器版本配合使用的东西。(

  1. 清除所有内容;删除放置的对象
  2. 重建两者;确保C和Ada使用相同的体系结构构建(32位与64位(
  3. 如果这不起作用,请尝试在Ada中使用C_Plus_Plus约定

相关内容

  • 没有找到相关文章

最新更新