Символ рассматривается GNAT 18.1 как строка - PullRequest
0 голосов
/ 29 ноября 2018

Я передал свой проект из 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 ]

0 голосов
/ 02 декабря 2018

Символ определен как Latin-1, поэтому при использовании символов, не доступных напрямую на стандартной клавиатуре, лучше обращаться к ним другим способом, чем с литералом Character:

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

или

R (R'Last) := Character'Val(176); -- Degree symbol
0 голосов
/ 29 ноября 2018

Ваш код (скопированный отсюда и вставленный в мой редактор) имеет кодировку UTF-8, поэтому ваш знак степени кодируется с использованием двух байтов: шестнадцатеричный C2B0.

GNAT будет ожидать Latin-1 отпо умолчанию, , поэтому вы должны указать , чтобы использовать 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°
...