5

所以这是我的身体文件的一部分。我收到错误“words.adb:75:42:“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 out Ustring 而函数 Is_Subset 使用 S : in Ustring。我的问题是如何将变量从 Remove_Character 更改为仅 Ustring 中的变量?抱歉,如果这有点混乱,我对编程和网站都很陌生。

4

1 回答 1

5

你不能,至少不能直接。

我不知道 aUString是什么,但我认为Delete程序会修改它。如果您将Sin的声明更改Remove_CharacterS: in Ustring,您可能会在调用 to 时遇到错误Delete

我能想到的最简单的方法是复制Sin Is_Subset

Copy_Of_S: UString := S;

然后将(可修改的)副本传递给Remove_Character.

通过“最简单”,我的意思是它对您现有的代码进行了最小的更改。但是您可能应该考虑对其进行重组。通过修改其中一个字符串来确定一个 UString 是否是另一个 UString 的子集似乎不是最好的方法。我确信有一种更有效的方法可以做到这一点。

一个次要且无关紧要的点:这个:

if Could_Remove = false then

最好写成:

if not Could_Remove then
于 2013-05-18T06:57:24.293 回答