Ада Доступ к процедуре без параметров "неправильное соглашение" - PullRequest
2 голосов
/ 23 мая 2019

У меня есть следующая привязка:

function atexit(proc : access Procedure) return Integer with
    Import, Convention => C;

А также процедура:

procedure Exiting is
begin
    Put_Line("Exiting");
end Exiting;

Когда я пытаюсь назвать это как:

I : Integer := atexit(Exiting'Access);

не получается с subprogram "Exited" has wrong convention

однако, предоставляя мой собственный (несовместимый) atexit, который принимает параметр, и изменение Exiting для использования этого же параметра позволяет просто пройти процедуру.

Похоже, проблема заключается в передаче процедуры без параметров в качестве типа доступа.

Я пытался указать именованный тип доступа, например

type Procedure_Access is access Procedure;

Но результат точно такой же.

Как мне пройти процедуру без параметров?

1 Ответ

6 голосов
/ 23 мая 2019

Возможно, вы забыли аспекты Convention в объявлениях Exiting и Procedure_Access.Следующие работы в GNAT CE 2018:

foo.c

int _atexit(void (*f)(void))
{
  (*f)();
  return 0;
}

main.adb

with Ada.Text_IO;  use Ada.Text_IO;
with Interfaces.C; use Interfaces.C;

procedure Main is

   type proc_ptr is access procedure
     with Convention => C;

   function atexit(proc : proc_ptr) return int
     with Import, Convention => C, Link_Name => "_atexit";


   procedure Exiting
     with Convention => C;      

   procedure Exiting is
   begin
      Put_Line("Exiting");
   end Exiting;


   I : Integer := Integer (atexit (Exiting'Access));

begin
   Put_Line("atexit returned " & I'Image);
end Main;

default.gpr

project Default is

   for Source_Dirs use ("src");
   for Object_Dir use "obj";
   for Main use ("main.adb");
   for Languages use ("Ada", "C");

end Default;

вывод

Exiting
atexit returned  0
...