如何从GetEnv&amp ;;初始化Ada无界字符串文字

时间:2015-03-06 01:00:54

标签: string ada getenv

G'day,我发现编译错误应该是一段简单的代码。目标是使用环境变量作为默认值的一部分。我们正在使用Ada95,所以我想知道它是否是版本的东西。

' model '我们用这样的外观(东西)说:

  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做错了,因为如果我可以正确地从GetEnv()中分配值,看起来我们想要的所有内容都会发生类似于DATA_FILES_2选项的工作(根据我的编译器) 。

有人可以指出我的错误吗?或者Ada95对我正在看的例子使用不同的规则?

1 个答案:

答案 0 :(得分:3)

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可能是区分丢失的环境变量和值为空字符串的环境变量的机会。不幸的是,它返回在两种情况下都可以访问空字符串。)