5

これが私のボディファイルの一部です。「words.adb:75:42: actual for "S" must be a variable」というエラーが表示されます。

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

少なくとも直接的にはできません。

a が何であるかはわかりませんがUStringDelete手順によって a が変更されると思います。Sinの宣言を に変更するRemove_CharacterS: in Ustring、おそらく の呼び出しでエラーが発生しますDelete

私が考えることができる最も簡単なアプローチは、 in のコピーを作成することSですIs_Subset:

Copy_Of_S: UString := S;

次に、(変更可能な) コピーを に渡しますRemove_Character

「最も単純」とは、既存のコードに最小限の変更を加えることを意味します。しかし、おそらくそれを再編成することを検討する必要があります。文字列の 1 つを変更して、ある UString が別の UString のサブセットであるかどうかを判断することは、最善の方法とは思えません。もっと効率的な方法があると確信しています。

マイナーで無関係なポイント: これ:

if Could_Remove = false then

次のように書く方が良いです:

if not Could_Remove then
于 2013-05-18T06:57:24.293 に答える