小编OCT*_*RAM的帖子

将 Ada 闭包转换为 C 回调(函数 + void*)

大多数干净的 C API 将回调声明为回调函数和用户数据的组合。用户数据通常是无效的*。WinAPI 使用指针大小的整数 (lParam)。在进行厚绑定时,自然希望允许使用 Ada 2005 闭包代替 C 回调。

我有一个代码。它就像 GNAT 上的魅力一样(GPL 2012,x86-windows 至少经过测试),但通常不能保证 Run_Closure_Adapter.X 变量和 Run_Closure.X 参数将具有相同的内部结构。

问题是:是否有适当的(符合标准的)方法来做到这一点?也许涉及标记类型、接口或泛型的技巧。至少有一种方法可以做到这一点:在不同的任务中运行闭包执行器和闭包,并使用集合点。但这太慢了。

Closure_Test.adb

with Closure_Lib; use Closure_Lib;
with Ada.Text_IO; use Ada.Text_IO;
with Ada.Strings.Fixed; use Ada.Strings.Fixed;

procedure Closure_Test is

   procedure Closure_Tester is

      Local_String : String := "Hello, world!";

      procedure Closure is
      begin
         Put_Line (Local_String);
      end Closure;

   begin
      Run_Closure (Closure'Access);
   end Closure_Tester;

   procedure Ada_Run_Closure (X : access procedure) is
   begin
      X.all;
   end Ada_Run_Closure;

   -- Nested_Closure fills the execution stack with
   -- several …
Run Code Online (Sandbox Code Playgroud)

c closures ada

4
推荐指数
1
解决办法
1242
查看次数

Wine64如何设法处理macOS?

这是十年来的主要障碍.据报道这是不可能的.论坛会谈提到了与设置和恢复GS有关的问题.Wine HQ FAQ仍然是指ABI不兼容页面,它不是实时维基页面,而是新闻档案链接.

Wine 2.0宣布支持macOS 64位.但是......怎么样?这不是所有macOS黑客都应该知道的吗?对于任何x86-64黑客来说,也许一些优雅(或肮脏)的技巧本身就很有趣.

macos assembly wine x86-64

3
推荐指数
1
解决办法
562
查看次数

标签 统计

ada ×1

assembly ×1

c ×1

closures ×1

macos ×1

wine ×1

x86-64 ×1