Как инициализировать неограниченную строку Ады из GetEnv и Literal

Добрый день, я нахожу ошибки компиляции в том, что должно быть простым фрагментом кода. цель состоит в том, чтобы использовать переменную среды как часть значения по умолчанию. Мы используем Ada95, поэтому мне интересно, дело в версии.

Заявленная нами «модель» выглядит примерно так:

  Default_Override_Message_Text   : Ada.Strings.Unbounded.Unbounded_String
      := Ada.Strings.Unbounded.To_Unbounded_String(
             Gnat.Os_Lib.Getenv( "DATA_FILES" ) & 
             "/override_required.txt" );

Я получаю сообщение об ошибке &:

  • invalid operand types for operator & invalid operand types for operator "&"

Между тем, это нормально.

  Default_Override_Message_Text   : Ada.Strings.Unbounded.Unbounded_String
      := Ada.Strings.Unbounded.To_Unbounded_String(
             "DATA_FILES" & "/override_required.txt" );

Я обратился к интернету и книгам, это только кажется, что это должно работать, и вот трудности с набором текста или что-то в этом роде. Пример, приведенный на PLEAC, тоже дает мне ошибку.

    username : string := Gnat.Os_Lib.Getenv("USER");
    DATA_FILES  : String := Gnat.Os_Lib.Getenv( "DATA_FILES" );

Выдает ошибку:

  • Ожидаемый тип результатов построителя "Standard.String" 181:37 ожидаемый тип "Standard.String" Результаты построителя
  • Результаты построителя нашли тип "System.Strings.String_Access" 181:37

Я думал, что с таким подходом я могу

DATA_FILES   : String := Gnat.Os_Lib.Getenv( "GPS_DATA_FILES" );

Default_Override_Message_Text : Ada.Strings.Unbounded.Unbounded_String
        := Ada.Strings.Unbounded.To_Unbounded_String(
                DATA_FILES & "/override_required.txt" ); -- ERROR

DATA_FILES_2 : String := "GPS_DATA_FILES";        -- WORKS

Default_Override_Message_Text : Ada.Strings.Unbounded.Unbounded_String
        := Ada.Strings.Unbounded.To_Unbounded_String(
                DATA_FILES_2 & "/override_required.txt" ); -- WORKS

Я все еще делаю что-то неправильно с GetEnv, потому что похоже, что все, что мы хотим, произойдет, подобно тому, как сработает опция DATA_FILES_2 (согласно моему компилятору), если я смогу правильно присвоить значение из GetEnv().

Может ли кто-нибудь указать на мою ошибку? Или Ада95 использует другие правила, чем примеры, которые я рассматриваю?


person will    schedule 06.03.2015    source источник
comment
В Ada 2005 добавлены пакеты Ada.Directories и Ada.Environment_Variables, чтобы вы могли делать то, что вам нужно, без жесткого кодирования соглашений об именах файлов, зависящих от ОС, или полагаться на пакеты GNAT. Может пора задуматься об обновлении?   -  person ajb    schedule 06.03.2015
comment
@ajb ... спасибо. Да теперь вижу. К счастью, наш друг Кит вразумил меня. Большое спасибо, я только начинаю осваивать этот язык.   -  person will    schedule 06.03.2015


Ответы (1)


Объявление функции Gnat.Os_Lib.Getenv:

function Getenv (Name : String) return String_Access;

Обратите внимание, что он возвращает String_Access, а не String (я не уверен, почему).

Добавление .all для получения значения String из результата String_Access должно решить вашу проблему:

Default_Override_Message_Text   : Ada.Strings.Unbounded.Unbounded_String
   := Ada.Strings.Unbounded.To_Unbounded_String(
         Gnat.Os_Lib.Getenv( "DATA_FILES" ).all & 
         "/override_required.txt" );

(Если Gnat.Os_Lib.Getenv возвращает String_Access, а не String, это могло дать возможность отличить отсутствующую переменную среды от той, значением которой является пустая строка. К сожалению, в обоих случаях он возвращает доступ к пустой строке.)

person Keith Thompson    schedule 06.03.2015
comment
Спасибо, Кит. Значит, эти примеры ошибочны? - person will; 06.03.2015