我有一个正在Ada上工作的程序,该程序最近已从32位升级到64位。我没有编写此代码,我只是负责使其在64位版本的RedHat上运行。
我仍在解决由此迁移引起的错误。该代码是段错误,不是以前的。
这是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);
这让我有些困惑,我怀疑,但是我不确定内存地址如何跨语言界面工作。我以为它们会像机器语言一样处在一个过程中,所以这根本不重要,但是我可能会遗漏一些东西。
任何帮助都会很棒!
答案 0 :(得分:1)
您可以使用GCC / G ++的-fdump-ada-spec
标志来重新生成与C ++函数的绑定。这样,您将获得绑定,编译器开发人员认为该绑定可以在该版本的GCC上正常工作。 (官方要求您使用相同版本的GCC来编译Ada和C ++,但实际上,您可能会获得与更广泛的编译器版本兼容的功能。)
答案 1 :(得分:0)
C_Plus_Plus
约定。