在我继承的代码中,缓冲区使用其起始地址和长度作为参数传递给过程。此过程代码使用内联汇编语言来处理缓冲区内容。
在使用相同参数的新过程中,我想将缓冲区称为数组,但我想使用与现有过程相同的参数及其类型。这样我就不必对原始代码进行侵入式修改,除非使用相同的调用签名,如下所示:
procedure Push_Buffer(
Source_Address : Address;
Count : Natural);
在这种情况下,缓冲区只是一个机器字数组。我想将它称为机器字数组,并且已经有其他地方使用的类型(Word和Buffer_Type)没有问题。 (无约束类型Buffer_Type的对象在使用它们的地方定义了约束。)
我想在我的过程中引用地址作为数组传递的缓冲区。我该怎么做?
答案 0 :(得分:3)
像这样(它与-gnat83
一起使用,但可能不适用于真正的Ada83编译器;我没有一个可以检查):
with Text_IO; use Text_IO;
with System;
procedure Push is
type Integers is array (Positive range <>) of Integer;
procedure Push_Buffer (Source_Address : System.Address;
Count : Natural) is
Source : Integers (1 .. Count);
for Source use at Source_Address;
begin
for J in Source'Range loop
Put_Line (Integer'Image (J) & " => " & Integer'Image (Source (J)));
end loop;
end Push_Buffer;
begin
declare
Data : Integers (1 .. 3) := (4, 5, 6);
begin
Push_Buffer (Data'Address, Data'Length);
end;
end Push;
作为附注,可能与您的情况无关:如果您指定了地址的对象的默认初始化问题(例如,如果它是包含访问变量的结构,则默认初始化为null
)您需要通过将声明写为
Source : Integers (1 .. Count);
pragma Import (Ada, Source);
for Source use at Source_Address;
(或类似于编译器的东西; GNAT表示warning: (Ada 83) pragma "Import" is non-standard
)。请参阅GNAT Reference Manual 8.15, Address Clauses,大约一半。
答案 1 :(得分:0)
我会使用无约束数组作为参数,而不是System.Address。这可以确保编译器不传递绑定信息(也就是#34;胖指针&#34;在gcc和gnat中),并且应该与pragma import兼容。
type Unconstrained_Integer_Array is array (Positive) of Integer;
procedure Push_Buffer (Buffer : Unconstrained_Integer_Array;
Length : Natural)
is
begin
for A in 1 .. Length loop
...
end loop;
end Push_Buffer;
我们在GtkAda绑定中与C接口时使用类似的技巧