0

Error: Operator is not overloaded on line 7.Do I have to do a another repeat and can't use the and operator?というエラーが表示されます。

Function GetValidPlayerName : String;
  Var
    PlayerName : String;
  Begin
    Repeat
      Readln(PlayerName);
      If PlayerName = '' And Length(PlayerName) > 10
        Then Write('That was not a valid name.  Please try again: ');
    Until PlayerName <> '';
    GetValidPlayerName := PlayerName;
  End;
4

2 に答える 2

3

まず、書く必要があります

If (PlayerName = '') And (Length(PlayerName) > 10) Then

括弧は必須です。

次に、これは常にと評価されfalseます。これは、空で長さが 11 以上の文字列は存在しないためです。実際、文字列は長さがゼロの場合にのみ空であるため、基本的には「長さがゼロで、長さが 11 以上の場合は...」と言います。

ほとんどの場合、代わりに選言を使用したい、つまり の代わりに使用しorたいand:

If (PlayerName = '') Or (Length(PlayerName) > 10) Then

名前が空の場合、または名前が長すぎる場合、エラー メッセージが表示されます。

さらに、 ifはthen IndeedPlayerNameと等しいため、名前が無効であってもループは終了します。ThisIsATooLongNamePlayerName <> ''

必要なのは次のようなものです

Function GetValidPlayerName : String;
Var
  PlayerName : String;
Begin
  Repeat
    Readln(PlayerName);
    If (PlayerName = '') Or (Length(PlayerName) > 10) Then
    Begin
      Write('That was not a valid name.  Please try again: ');
      PlayerName := '';
    End;
  Until PlayerName <> '';
  GetValidPlayerName := PlayerName;
End;

また

Function GetValidPlayerName : String;
Var
  PlayerName : String;
Begin
  result := '';
  Repeat
    Readln(PlayerName);
    If (PlayerName = '') Or (Length(PlayerName) > 10) Then
      Write('That was not a valid name.  Please try again: ')
    Else
      result := PlayerName;
  Until result <> '';
End;
于 2011-05-21T13:17:39.483 に答える
0

ウルムも同じような状況で、

while(Length(conversionrates[i].rate)<>2)) do
begin
    writeln('the conversion name should be 2 letters. (E.G Pounds to Dollars would be "PD")');
    readln(conversionrates[i].fromto);
end;

これが機能するかどうか疑問に思っているのですが、これを入れたプログラムはコンパイルされません。

于 2015-03-31T10:08:28.367 に答える