我在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++,但在实践中,您可能会得到与更广泛的编译器版本配合使用的东西。(
- 清除所有内容;删除放置的对象
- 重建两者;确保C和Ada使用相同的体系结构构建(32位与64位(
- 如果这不起作用,请尝试在Ada中使用
C_Plus_Plus
约定