Search code examples
validationsyntaxerror-handlingpascalpascalscript

Error : Operator is not overloaded


I've created a simple block of code using Free Pascal to validate an ID number such as Abc123 being input.

When I try to run the program I get an error saying, "Operator is not overloaded" at the points where it says,

 IF not (Ucase in Upper) or (Lcase in Lower) or (Num in Int) then

Specifically where the "in" appears. Does anyone have any idea why the error occurs and what I can do to solve it?

Thanks!

Program CheckChar;

VAR
UserID, LCase, UCase, Num : String;
readkey : char;
L  : Integer;


CONST
Upper = ['A'..'Z'];
Lower = ['a'..'z'];
Int   = ['0'..'9'];

Begin
Write('Enter UserID ');Readln(UserID);
Ucase := Copy(UserID,1,1);
LCase := Copy(UserID,2,1);
Num   := Copy(UserID,3,2);
L     := Length(UserID);

  While L = 6 Do
  Begin
    IF not (Ucase in Upper) or (Lcase in Lower) or (Num in Int) then
    Begin
    Writeln('Invalid Input');
    End;
 Else
   Writeln('Input is valid');

  End;

 readln(readkey);
 End.

Solution

  • in is used to test the presence of an element in a set. Here you set is a set of char, so the element to test must also be a char. In your sample the elements you tested were some strings (UCase, LCase and Num) which caused the error message.

    You have to use a slice of Ucase and LCase of length one or you can also directly take a single character (astring[index]) instead of copying with Copy.

    Also your while loop is totally useless. You have to test only 6 characters so let's unroll the loop instead of puting some complexity while obsvioulsy you just start learning.

    Finally, one way to write your checker correctly is so:

    Program CheckChar;
    var
      UserID  : string;
      readkey : char;
      L  : Integer;
      invalid: boolean;
    
    const
      Upper = ['A'..'Z'];
      Lower = ['a'..'z'];
      Int   = ['0'..'9'];
    
    begin
      Write('Enter UserID ');
      Readln(UserID);
      L := length(UserId);
    
      if L <> 6 then invalid := true
      else
      begin
        invalid :=  not (UserID[1] in Upper) or // take a single char, usable with in
                    not (UserID[2] in Lower) or // ditto
                    not (UserID[3] in Lower) or // ditto
                    not (UserID[4] in Int) or // ditto
                    not (UserID[5] in Int) or // ditto
                    not (UserID[6] in Int); // ditto
      end;
    
      if invalid then
        Writeln('Invalid Input')
      else
       Writeln('Input is valid');
    
     readln(readkey);
    end.