GNAT 18.1将字符视为字符串

时间:2018-11-29 15:06:44

标签: string char ada

我将我的项目从GNAT 7.3.1传递到了GNAT 18.1,并且在char影响上遇到了编译错误。

我想影响字符串末尾度数'°'的特殊字符,但编译器向我返回此错误:

Map(COL1 -> "loe", COL2 -> "MFM---0521")

我知道了:

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 中,则编译器会说同样的话。

有人遇到过同样的问题吗?

2 个答案:

答案 0 :(得分:10)

您的代码(从此处复制并粘贴到我的编辑器中)是UTF-8编码的,因此您的度数符号使用两个字节(十六进制C2B0)进行编码。

默认情况下,GNAT期望Latin-1 so you have to tell it在使用-gnatW8的字符/字符串/文本IO中使用UTF-8。

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°

答案 1 :(得分:4)

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

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

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