【发布时间】:2015-04-17 18:06:13
【问题描述】:
我正在使用 AdaSDL2,一个第三方绑定到 C 库。 SDL 中的事件是通过联合处理的,如以下参考所示:
http://www.willusher.io/sdl2%20tutorials/2013/08/20/lesson-4-handling-events/
问题是绑定将 SDL_Event 类型定义为 Unchecked Union,因此您无法检查判别式以查看它是什么类型。这是类型的定义:
type SDL_Event (discr : C.unsigned := 0) is record
case discr is
when 0 =>
typ : aliased Uint32;
when 1 =>
common : aliased SDL_CommonEventRecord;
when 2 =>
window : aliased SDL_WindowEventRecord;
when 3 =>
key : aliased SDL_KeyboardEventRecord;
when 4 =>
edit : aliased SDL_TextEditingEventRecord;
when 5 =>
text : aliased SDL_TextInputEventRecord;
when 6 =>
motion : aliased SDL_MouseMotionEventRecord;
when 7 =>
button : aliased SDL_MouseButtonEventRecord;
when 8 =>
wheel : aliased SDL_MouseWheelEventRecord;
when 9 =>
jaxis : aliased SDL_JoyAxisEventRecord;
when 10 =>
jball : aliased SDL_JoyBallEventRecord;
when 11 =>
jhat : aliased SDL_JoyHatEventRecord;
when 12 =>
jbutton : aliased SDL_JoyButtonEventRecord;
when 13 =>
jdevice : aliased SDL_JoyDeviceEventRecord;
when 14 =>
caxis : aliased SDL_ControllerAxisEventRecord;
when 15 =>
cbutton : aliased SDL_ControllerButtonEventRecord;
when 16 =>
cdevice : aliased SDL_ControllerDeviceEventRecord;
when 17 =>
quit : aliased SDL_QuitEventRecord;
when 18 =>
user : aliased SDL_UserEventRecord;
when 19 =>
syswm : aliased SDL_SysWMEventRecord;
when 20 =>
tfinger : aliased SDL_TouchFingerEventRecord;
when 21 =>
mgesture : aliased SDL_MultiGestureEventRecord;
when 22 =>
dgesture : aliased SDL_DollarGestureEventRecord;
when 23 =>
drop : aliased SDL_DropEventRecord;
when others =>
padding : aliased SDL_Event_padding_array;
end case;
end record;
pragma Convention (C_Pass_By_Copy, SDL_Event);
pragma Unchecked_Union (SDL_Event);
所以当上面参考中的示例代码说要检查 e.type 时,我在 Ada 类型中没有相关值。当我尝试这个时:
procedure Process_Events is
E : access SDL_Event;
begin
while SDL_PollEvent(E) = 1 loop
if E.discr = SDL_SHUTDOWN then
Ada.Text_IO.Put("Shutdown requested.");
Ada.Task_Identification.Abort_Task(Ada.Task_Identification.Current_Task);
end if;
end loop;
end Process_Events;
GNAT 说“无法引用 Unchecked_Union 的判别式。我尝试了几种不同的想法来确定它是什么类型的事件,但到目前为止,似乎没有一个既可行又有效。是否有一个通用的解决方案,或者有人有什么想法吗?谢谢。
【问题讨论】:
标签: binding sdl union ada unchecked