如何从 GetEnv 和 Literal 初始化 Ada 无界字符串
How to initialise an Ada Unbounded String from GetEnv & Literal
你好,我在应该是一段简单代码的地方发现了编译错误。 objective 是使用环境变量作为默认值的一部分。我们正在使用 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 上给出的例子也给我一个错误。
- Establishing a default value
- GetEnv example
- 查看 "GetEnv()" 上:Advanced Linux Programming
username : string := Gnat.Os_Lib.Getenv("USER");
DATA_FILES : String := Gnat.Os_Lib.Getenv( "DATA_FILES" );
报错:
- 生成器结果预期类型 "Standard.String" 181:37 预期类型 "Standard.String" 生成器结果
- Builder 结果发现类型 "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 是否对我正在查看的示例使用了不同的规则?
Gnat.Os_Lib.Getenv
函数的声明是:
function Getenv (Name : String) return String_Access;
请注意,它 return 是 String_Access,而不是字符串(我不确定为什么)。
添加 .all
以从 String_Access
结果中获取 String
值应该可以解决您的问题:
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
return 一个 String_Access
而不是 String
可能是一个区分缺失环境变量和值为空的环境变量的机会字符串。不幸的是,return在这两种情况下都是对空字符串的访问。)
你好,我在应该是一段简单代码的地方发现了编译错误。 objective 是使用环境变量作为默认值的一部分。我们正在使用 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 上给出的例子也给我一个错误。
- Establishing a default value
- GetEnv example
- 查看 "GetEnv()" 上:Advanced Linux Programming
username : string := Gnat.Os_Lib.Getenv("USER");
DATA_FILES : String := Gnat.Os_Lib.Getenv( "DATA_FILES" );
报错:
- 生成器结果预期类型 "Standard.String" 181:37 预期类型 "Standard.String" 生成器结果
- Builder 结果发现类型 "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 是否对我正在查看的示例使用了不同的规则?
Gnat.Os_Lib.Getenv
函数的声明是:
function Getenv (Name : String) return String_Access;
请注意,它 return 是 String_Access,而不是字符串(我不确定为什么)。
添加 .all
以从 String_Access
结果中获取 String
值应该可以解决您的问题:
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
return 一个 String_Access
而不是 String
可能是一个区分缺失环境变量和值为空的环境变量的机会字符串。不幸的是,return在这两种情况下都是对空字符串的访问。)