意外的 Ada 类型兼容性

sha*_*ing 0 ada gnat

为什么伏特、安培和欧姆兼容?


with ada.text_io; use ada.text_io;
                                                                    
procedure main is                                                   
    type Volts is delta 1.0 / 2.0 ** 12 range -45_000.0 .. 45_000.0;
    type Amps is delta 1.0 / 2.0 ** 16 range -1_000.0 .. 1_000.0;   
    type Ohms is delta 0.125 range 0.0 .. 1.0E8;                    
                                                                    
    V : Volts := 1.0;                                               
    A : Amps := 1.0;                                                
    R1 : Ohms := 1.0;                                               
    R2 : Ohms := 1.0;                                               
                                                                   
begin                                             
                     
    v := A * (R1 + R2);
                       
    put_line(V'Img);   
                       
end main;  
Run Code Online (Sandbox Code Playgroud)

如果类型被定义为new Float我在编译期间收到以下异常:


main.adb:22:12: error: invalid operand types for operator "*"
main.adb:22:12: error: left operand has type "Amps" defined at line 5
main.adb:22:12: error: right operand has type "Ohms" defined at line 6
Run Code Online (Sandbox Code Playgroud)

我期望使用带有 Volts 的 type 来定义与其他类型不兼容的新类型,因为它不是定点类型的显式子类型。

小智 5

自 Ada 95 起,Ada 标准明确允许(预定义)使用不同定点类型的操作数进行乘法和除法 - 请参阅http://www.ada-auth.org/standards/22rm/html/RM-4-5 -5.html,第 18 段——但仅在结果也预期为某种定点类型的情况下(参见第 19.1/2 段)。不同定点类型之间的加法和减法不是预定义的,当然不同定点类型在例如中是不兼容的。参数或赋值。

至于为什么不同类型之间允许使用*和/,我没有明确的答案。相关的 Ada 问题之一 ( http://www.ada-auth.org/cgi-bin/cvsweb.cgi/ais/ai-00364.txt?rev=1.15 ) 有 Randy Brukardt 的简短评论:“.. . Ada 95 规则的出现是因为人们抱怨必须编写类型转换: A := B * 5.0; 这被认为让 Ada 看起来很糟糕。”

同一个人工智能也有批评新规则的评论……所以意见不同。