字符被GNAT 18.1视为字符串。

3

我将项目从GNAT 7.3.1转移到GNAT 18.1,但在字符赋值时出现编译错误。

我想在字符串末尾添加特殊字符“°”,但编译器返回以下错误:

R : String := "-NNN.N°";
begin
   ...
   R(R'Last) := '°';
   return R;
end

我得到了这个:
strings are delimited by double quote character
expected type "Standard.Character"
found a string type

如果我用字母或数字替换符号°,它可以正常工作。但当我尝试将其转换为R(R'Last) := Standard.Character('°');时,编译器会报同样的错误。

是否有人遇到过相同的问题?

2个回答

10

你从这里复制并粘贴到我的编辑器中的代码是UTF-8编码的,因此你的度符号使用两个字节进行编码,十六进制为C2B0

默认情况下,GNAT将使用Latin-1,因此你需要告诉它在字符/字符串/文本IO中使用UTF-8,使用-gnatW8

lnlb.adb的示例为例,

with Ada.Text_IO;
procedure Lnlb is
   R : String := "-NNN.NX";
begin
   R(R'Last) := '°';
   Ada.Text_IO.Put_Line (R);
end Lnlb;

编译(在macOS上)

$ gnatmake lnlb.adb -gnatW8
gcc -c -gnatW8 lnlb.adb
gnatbind -x lnlb.ali
gnatlink lnlb.ali

并运行

$ ./lnlb
-NNN.N°

4

字符被定义为Latin-1,因此当使用标准键盘上没有直接可用的字符时,最好使用某种其他方式引用它们,而不是使用字符字面量:

R (R'Last) := Ada.Characters.Latin_1.Degree_Sign;

或者

R (R'Last) := Character'Val(176); -- Degree symbol

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接