2013-05-18 32 views
4

因此,这是我的身体文件的一部分。我得到错误“words.adb:75:42:”S“的实际值必须是一个变量”。Ada实际为“S”必须是一个变量

procedure Remove_Character(S : in out Ustring; C : in Character; Successful : out Boolean) is 
begin 
    for I in 1..length(S) loop 
     if Element(S, I) = C then 
      Delete(S, I, I); 
      Successful := true; 
      return; 
     end if; 
    end loop; 
    Successful := false; 
end Remove_Character; 

function Is_Subset(Subset : Ustring; S : Ustring) return Boolean is 
Could_Remove : Boolean; 
begin 
    for I in 1..length(Subset) loop 
     Remove_Character(S , Element(Subset, I), Could_Remove); 
     if Could_Remove = false then 
      return false; 
     end if; 
    end loop; 
    return True; 
end Is_Subset; 

我明白我的错误来自哪里。 Remove_Character使用S:in Ustring,而函数Is_Subset使用S:在Ustring中。 我的问题是如何将变量从Remove_Character更改为仅在Ustring中? 对不起,如果这是一个混乱,我相当新的编程和网站。

回答

5

你不能,至少不能直接。

我不知道UString是什么,但我认为Delete过程修改它。如果您将Remove_Character中的S声明更改为S: in Ustring,那么您可能会在致电Delete时发生错误。

我能想到的最简单的办法是使S副本中Is_Subset

Copy_Of_S: UString := S; 

,然后通过(修改)复制到Remove_Character。 “最简单”,我的意思是它对现有代码进行了最小的修改。但你应该考虑重新组织它。通过修改其中一个字符串来确定一个UString是否是另一个UString的子集似乎不是最好的方法;我相信有一个更有效的方法来做到这一点。

A小调和无关点:本:

if Could_Remove = false then 

更好写成:

if not Could_Remove then 
+1

基思是正确有关如何解决您的编辑问题。但是,你应该仔细考虑你的循环; '1..length(subset)'在循环开始时计算一次,但在循环过程中更改'length(Subset)'。您可以使用[循环退出语句](http://www.ada-auth.org/standards/12rm/html/RM-5-5.html#p15)。 –

相关问题