我已经和 Ada 一起工作了一年多,虽然我认为我已经掌握了它的窍门并且对非常强大的类型系统感到满意,但我偶尔也会遇到麻烦。
目前,我有一个关于嵌套过程的问题,其中编译器给了我一个错误,我真的无法理解:subprogram must not be deeper than access type. 当我声明一个类型是对过程的访问时会出现此错误,但是在使用匿名访问参数时它可以完美地工作,如下面的 MWE 所示:
procedure Generaltest is
type T_Access_Procedure is access procedure;
procedure Test_Access (Proc : access procedure) is
begin
null;
end Test_Access;
procedure Test_Type (Proc : in T_Access_Procedure) is
begin
null;
end Test_Type;
procedure Test is
procedure Nested_Procedure is
begin
null;
end;
-- Not allowed; subprogram must not bee deeper than access procedure.
Proc : T_Access_Procedure := Nested_Procedure'Access;
begin
Test_Access (Nested_Procedure'Access); -- This line works fine.
Test_Type …Run Code Online (Sandbox Code Playgroud) 我正在 Ada 中试验 IP 多播,但似乎没有收到发送到多播组的任何流量。不知何故,我似乎无法让应用程序获取传入的数据包。
我可以验证(使用 Wireshark)是否从我的计算机发送了多播加入,并且我还可以验证是否有数据发送到多播组。
我可以验证操作系统是否已通过 netsh 命令注册了多播加入:
netsh interfaces ip show joins
Run Code Online (Sandbox Code Playgroud)
如果我运行我的程序,则列出的组的引用为 1;如果不运行,则引用为 0。
以下过程显示了我的侦听器,我使用Mcast_IP => "239.255.128.128"和调用它Mcast_Port => "8807":
with GNAT.Sockets;
with Ada.Streams;
with Ada.Text_IO;
procedure Receive_Multicast (Mcast_IP : in String;
Mcast_Port : in String)
is
package GS renames GNAT.Sockets;
package AS renames Ada.Streams;
package Tio renames Ada.Text_IO;
use GS;
use type Ada.Streams.Stream_Element_Offset;
Socket : GS.Socket_Type;
Address : GS.Sock_Addr_Type;
Data : AS.Stream_Element_Array (1 .. 2**16);
Offset : AS.Stream_Element_Offset;
Sender : GS.Sock_Addr_Type;
begin …Run Code Online (Sandbox Code Playgroud)