0

G'day,我发现应该是一段简单的代码的编译错误。目标是使用环境变量作为默认值的一部分。我们使用的是 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() 分配值,看起来我们想要的一切都会发生,类似于该选项会起作用(根据我的编译器)。

有人可以指出我的错误吗?还是 Ada95 对我正在查看的示例使用不同的规则?

4

1 回答 1

3

函数的声明Gnat.Os_Lib.Getenv是:

function Getenv (Name : String) return String_Access;

请注意,它返回一个 String_Access,而不是一个字符串(我不确定为什么)。

添加 a从结果.all中获取StringString_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返回 aString_Access而不是 aString可能是区分缺少的环境变量和值为空字符串的环境变量的机会。不幸的是,在这两种情况下它都会返回对空字符串的访问。)

于 2015-03-06T01:13:21.127 回答