"S"的实际值必须是变量

use*_*120 4 ada

所以这是我的身体文件的一部分.我收到错误"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;
Run Code Online (Sandbox Code Playgroud)

我理解我的错误来自哪里.Remove_Character在Ustring中使用S:而函数Is_Subset在Ustring中使用S:.我的问题是如何将变量从Remove_Character更改为仅在Ustring中?对不起,如果这有点混乱,我对编程和网站都很新.

Kei*_*son 5

你不能,至少不是直接的.

我不知道它UString是什么,但我认为Delete程序会修改它.如果更改的声明SRemove_CharacterS: in Ustring,你会得到大概的调用上的错误Delete.

我能想到的最简单的方法是制作一份Sin Is_Subset:

Copy_Of_S: UString := S;
Run Code Online (Sandbox Code Playgroud)

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

"最简单",我的意思是它对现有代码进行了最小的更改.但你应该考虑重新组织它.通过修改其中一个字符串来确定一个UString是否是另一个UString的子集似乎不是最好的方法; 我确信有一种更有效的方法.

一个次要而无关紧要的观点:这个:

if Could_Remove = false then
Run Code Online (Sandbox Code Playgroud)

写得更好:

if not Could_Remove then
Run Code Online (Sandbox Code Playgroud)