有点尴尬地问这个,但我知道这是最好的.我已经在Ada编程多年了,并且能够流利地理解语言的几乎所有部分.但是,我似乎永远无法绕过T'Class.借用别人,有人可以"像我五岁那样解释它吗?".
编辑:我买它只是为了拥有,但包含在内的是T'Class的一个很好的描述和示例使用; 我指的是Michael B. Feldman撰写的"Ada 95的软件构建和数据结构".
我可以处理另一个,而不是干净的方式,但希望能够利用以下内容:
type Prefix is (Yocto, Zepto, Atto, Femto, Pico, Nano,
Micro, Milli, Centi, Deci, None, Deca, Hecto, Kilo,
Mega, Giga, Tera, Peta, Exa, Zetta, Yotta);
for Prefix use (
Yocto => -24,
Zepto => -21,
Atto => -18,
Femto => -15,
Pico => -12,
Nano => -9,
Micro => -6,
Milli => -3,
Centi => -2,
Deci => -1,
None => 0,
Deca => 1,
Hecto => 2,
Kilo => 3,
Mega => 6,
Giga => 9,
Tera => 12, …Run Code Online (Sandbox Code Playgroud) 我有以下绑定:
function atexit(proc : access Procedure) return Integer with
Import, Convention => C;
Run Code Online (Sandbox Code Playgroud)
以及过程:
procedure Exiting is
begin
Put_Line("Exiting");
end Exiting;
Run Code Online (Sandbox Code Playgroud)
当我尝试这样称呼它时:
I : Integer := atexit(Exiting'Access);
Run Code Online (Sandbox Code Playgroud)
它失败了 subprogram "Exited" has wrong convention
但是提供我自己的(不兼容的)atexit接受参数,并修改Exiting为使用相同的参数,则可以顺利通过过程。
因此,似乎该问题正在将无参数过程作为访问类型传递。
我试图给一个命名的访问类型像
type Procedure_Access is access Procedure;
Run Code Online (Sandbox Code Playgroud)
但是结果是完全一样的。
那我该如何通过无参数程序呢?
说我有以下类型:
type Example_Type is new Float;
Run Code Online (Sandbox Code Playgroud)
将为Example_Type定义大量内部运算符,这在绝大多数情况下都很好.喜欢:
function "+"(Left, Right : Example_Type) return Example_Type;
Run Code Online (Sandbox Code Playgroud)
和
function "*"(Left, Right : Example_Type) return Example_Type;
Run Code Online (Sandbox Code Playgroud)
但是,让我们说两个Example_Type的乘法不应该等于另一个Example_Type,就像Dimensions一样.如何有选择地隐藏这些内在运算符?
什么是libgnarl?我在各个地方找到了对它的引用,比如gcc源代码或gprbuild的详细输出.gprbuild专门报告决定是否libgnarl有必要,所以它显然是一个可选的库,但实际的库是什么?我找不到任何文件.这些源包含一堆看起来像属于标准库的包,但不是(喜欢Ada.Execution_Time.Timers),所以显然我缺少一些东西.
我正试图像一个阵列
[ "First.Package", "Second.Package" ]
Run Code Online (Sandbox Code Playgroud)
把它变成
[ "First.Package.ads", "First.Package.adb", "Second.Package.ads", "Second.Package.adb" ]
Run Code Online (Sandbox Code Playgroud)
我尝试过以下方法:
packages = [ "First.Package", "Second.Package" ]
files = []
packages.each do |package|
files << (package << ".ads")
files << (package << ".adb")
end
return files
Run Code Online (Sandbox Code Playgroud)
这不符合我认为它应该做的事情.我明白了:
First.Package.ads.adb
First.Package.ads.adb
Second.Package.ads.adb
Second.Package.ads.adb
Run Code Online (Sandbox Code Playgroud)
我想要:
First.Package.ads
First.Package.adb
Second.Package.ads
Second.Package.adb
Run Code Online (Sandbox Code Playgroud) 我有一个带有以下签名的通用包
generic
type T is private;
with function "="(Left : T; Right : T) return Boolean is <>;
with function Wide_Wide_Image(Self : T) return Wide_Wide_String is <>;
package Generics.Testing.Assertions is
Run Code Online (Sandbox Code Playgroud)
它有一个带有以下签名的子包
generic
with function "<"(Left : T; Right : T) return Boolean is <>;
with function ">"(Left : T; Right : T) return Boolean is <>;
package Generics.Testing.Assertions.Comparisons is
Run Code Online (Sandbox Code Playgroud)
我正在尝试在另一个包中实例化它们,但有一个有趣的问题。
这工作正常:
package Integer_Assertions is new Generics.Testing.Assertions(
Integer,
Wide_Wide_Image => Integer'Wide_Wide_Image);
Run Code Online (Sandbox Code Playgroud)
奇怪的是当我尝试使用以下方法实例化子包时:
package Integer_Comparisons is new Integer_Assertions.Comparisons;
Run Code Online (Sandbox Code Playgroud)
GPS正常地找到了Comparisons包裹,正如它应该的那样。Integer_Assertions …
我可以很好地迭代一个数组:
def source_names(packages)
files = []
packages.each do |package|
files << (package + ".ads")
files << (package + ".adb")
end
return files
end
Run Code Online (Sandbox Code Playgroud)
但只要传入一个数组(或者可能是任何集合).但是,当只有一个包作为更大脚本的一部分传递给此方法时,这会失败,因为类型是字符串,而不是数组中的单个元素:
在'source_names'中:未定义的方法'each'代表"Generics.Mathematics":String(NoMethodError)
那么我怎么不关心只传递一个元素,它只被识别为字符串?
Clairification:我知道字符串不支持数组方法.我的困惑是为什么我有时会得到一个数组,而一个字符串除了单个元素数组之外.