- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我遇到了一个问题,即在 Ada 中使用不能被系统的 Storage_Unit
整除的模块化类型。 (在运行时的 system.ads
中定义)将引发 Constraint_Error
在运行时访问时。我最初在使用最小运行时间的裸机系统上工作时遇到了这个问题,同时尝试通过将 12 位数组覆盖在内存中的缓冲区上来从缓冲区读取 12 位值。有谁知道为什么会这样?
以下最小示例说明了我遇到的问题。我使用 AdaCore 的 GNAT 2019 进行了测试,使用包含的 zfp
编译运行。使用标准运行时不会重现该问题。
with Ada.Text_IO; use Ada.Text_IO;
procedure Main is
----------------------------------------------------------------------------
-- Modular type with standard size divisible by 8.
----------------------------------------------------------------------------
type Type_One is mod 2 ** 16;
type Buffer_Type_One is array (1 .. 128) of Type_One;
----------------------------------------------------------------------------
-- Modular type with non-base 8 size.
----------------------------------------------------------------------------
type Type_Two is mod 2 ** 12;
type Buffer_Type_Two is array (1 .. 128) of Type_Two;
type Buffer is array (1 .. 256) of Character;
----------------------------------------------------------------------------
-- Example buffer.
----------------------------------------------------------------------------
Test_Buffer : Buffer := (others => ' ');
begin
----------------------------------------------------------------------------
-- Will not raise an exception.
----------------------------------------------------------------------------
Test_One :
declare
Buffer_One : Buffer_Type_One
with Import,
Convention => Ada,
Address => Test_Buffer'Address;
begin
Put_Line ("Testing type one");
for I in Natural range 1 .. 16 loop
Put_Line ("Test: " & Buffer_One (I)'Image);
end loop;
end Test_One;
----------------------------------------------------------------------------
-- Will raise a constraint error at runtime.
----------------------------------------------------------------------------
Test_Two :
declare
Buffer_Two : Buffer_Type_Two
with Import,
Convention => Ada,
Address => Test_Buffer'Address;
begin
Put_Line ("Testing type two");
for I in Natural range 1 .. 16 loop
Put_Line ("Test: " & Buffer_Two (I)'Image);
end loop;
exception
when Constraint_Error =>
Put_Line ("Constraint error encountered.");
end Test_Two;
end Main;
project Test is
for Object_Dir use "obj";
for Exec_Dir use "build";
for Create_Missing_Dirs use "True";
for Languages use ("Ada");
package Builder is
for Executable ("main.adb") use "test";
end Builder;
for Main use ("main.adb");
package Compiler is
for Default_Switches ("Ada") use (
"-gnat2012",
"-gnatwadehl",
"-gnatVa",
"-gnaty3abcdefhiklmnoprstux"
);
end Compiler;
for Runtime ("Ada") use "zfp";
end Test;
Buffer_Type_Two
的一个实例覆盖在指定的内存地址会将该位置的内存解释为 12 位值的序列。看来情况并非如此。似乎编译器将类型的大小四舍五入到 16 位,然后提高
Constraint_Error
当从数组中读取的 16bit 值不符合 12bit 类型时。
最佳答案
使用最近的 GNAT,您可以通过定义 Buffer_Type_Two
来实现您想要的行为。作为
type Buffer_Type_Two is array (1 .. 128) of Type_Two
with Pack;
type Buffer_Type_Two is array (1 .. 128) of Type_Two
with Component_Size => 12;
...
Testing type two
Test: 32
Test: 514
Test: 32
Test: 514
...
...
Testing type two
Test: 32
Test: 257
Test: 2056
Test: 64
Test: 514
Test: 4112
Test: 128
Test: 1028
Test: 32
...
-full-
运行时系统;对于其他人,正如上面@egilhh 所指出的,
ajxs.adb:14:09: packing of 12-bit components not supported by configuration
关于ada - 使用不能被 8 整除的模类型时引发 Constraint_Error,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61933040/
这就是我到目前为止所拥有的;我必须使用这个主要方法。 public class HW4 { public static boolean isDivisibleByThree(String n)
这个问题在这里已经有了答案: Is floating point math broken? (31 个答案) 关闭 7 年前。 我不明白为什么 % 会这样: >>> 5 % 0.5 == 0 Tru
目录 整除 整除的定义与基本性质 素数 素数的定义与基本性质
我正在编写一个 C 程序,要求用户输入密码并检查数字中的每个数字是否可以被 2 整除。例如,如果他们输入 123452,它会告诉用户这是错误的,因为 1, 2,3,5 不能被 2 整除。如果我输入 6
我有一些东西要读取一个文本文件,然后是一个像这样的函数文件 int Myiseven(int x) { int isOdd = 0; if (x % 2 == 1) {
我需要编写一个程序,在给定的数字范围内,程序需要找到数字之和能被3整除的数字。之后,它需要检查总和是否大于0,如果它能被4整除,并打印满足上述条件的数字。这是我尝试过的: include int m
我对 ffmpeg 有疑问。我想将图像序列格式化为视频。我为此使用以下命令: ffmpeg -framerate 24 -i image%04d.jpeg Project.mp4 -vf "pad=c
我把这个作业作为家庭作业,但我不知道该怎么做: Input is a string of the numbers 1, 2 and 3. You need to build a function th
这里我需要检查数字中的每个数字,因为范围应该被3整除,这意味着当我输入20和40时,代码需要验证20到40之间数字的每个数字,并且它应该显示 30,33,36,39 我试图做的是获取代码的最后一位数字
Given an array of integers and a number k, write a function that returns true if given array can be
如果用户输入从最高位到最低位的数字,如何检查二进制数是否可以整除 13? 位数可能非常大,因此将其转换为十进制然后检查其可整除性是没有意义的。 我已经以常规方式处理了它。位数最多为 10^5,因此在将
我正在解决这个问题,即我们给了数字 N,它可以很大,最多可以有 100000 个数字。 现在我想知道找到这些数字的最有效方法是什么,我认为在大数字中我最多需要删除 3 位数字才能被 3 整除。 我知道
这个问题在这里已经有了答案: 关闭 12 年前。 Possible Duplicate: Check if a number is divisible by 3 如果一个二进制数的个数是偶数,它是否
我想知道二进制有没有除以3的整除法则 例如:在十进制中,如果数字和除以 3,则数字除以 3。例如:15 -> 1+5 = 6 -> 6 除以 3所以 15 除以 3。 要了解的重要一点是,我不是在寻找
这工作正常,但我想让它更漂亮 - 并容纳所有可被 4 整除的值: if i==4 || i==8 || i==12 || i==16 || i==20 || i==24 || i==28 || i==
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 要求提供代码的问题必须表现出对所解决问题的最低限度理解。包括尝试过的解决方案、为什么它们不起作用,以及预
如何判断一个变量是否可以被 2 整除?此外,如果是,我需要执行一个功能;如果不是,我需要执行另一个功能。 最佳答案 使用模数: // Will evaluate to true if the vari
处理器中的除法需要很多时间,所以我想问一下如何以最快的方式检查数字是否可以被其他数字整除,在我的情况下,我需要检查数字是否可以被 15 整除。 我也一直在浏览网页并发现 有趣 方法来检查数字是否可以被
我一直在学习可变参数模板,在 this excellent blog post 的帮助下,我已经设法编写了一个函数模板 even_number_of_args 它返回它接收到的参数的数量是否可以被 2
我的一个 friend 在对一家公司进行在线评估时遇到了这个问题,并向我提出了这个问题。 An array of integers is given and we have to (possibly)
我是一名优秀的程序员,十分优秀!