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" );
给出错误:
我想用这种方法我可以
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对我正在看的例子使用不同的规则?
答案 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
可能是区分丢失的环境变量和值为空字符串的环境变量的机会。不幸的是,它返回在两种情况下都可以访问空字符串。)