Оператор без перегрузки

Sep 10 2020

Добрый день, в свободное время я делаю упражнения Codeforces, и у меня возникла проблема проверить, был ли пользователь мальчиком или девочкой, ну, моя проблема не в этом, я только что продемонстрировал код. При компиляции кода на моем компьютере (я использую версию 3.0.4 для i386) я не получаю ошибки, но codeforces дает мне эту ошибку

program.pas(15,16) Error: Operator is not overloaded: "freq(Char;AnsiString):LongInt;" + "ShortInt"
program.pas(46,4) Fatal: There were 1 errors compiling module, stopping 

Ошибка была мне недостаточно ясна, так как тот же сценарий был идеально скомпилирован с моей версией. Платформа используется (версия 3.0.2 i386-Win32).

program A236;
uses wincrt, sysutils;

var
    username : String;


function freq(char: char; username : String): Integer;
var 
   i: Integer;
begin
    freq:= 0;
    for i:= 1 to length(username) do
        if char = username[i] then
            freq:= freq + 1;
            //writeln(freq);        
end; 

function OddUserName(username : String): Boolean;
var
    i, counter: Integer;

begin
    OddUserName:= false; // even
    counter:= 0;
    for i:= 1 to length(username) do 
        if freq(username[i], username) <> 1 then    
            delete(username, i, 1)
        else
            counter:= counter + 1;  
    if counter mod 2 <> 0 then
        OddUserName:= true; // odd
    //writeln(counter); 
    //writeln(OddUserName);                 
end;        

begin
    readln(username);
    if not OddUserName(username) then 
        writeln('CHAT WITH HER!')
    else 
        writeln('IGNORE HIM!'); 


    //readkey();    
end.

Вероятно, ошибка должна быть в этой строке:

function freq(character: char; username : String): Integer;

Спасибо всем, кто помогает.

Ответы

1 RemyLebeau Sep 10 2020 at 15:26

Внутри функции имя функции может использоваться вместо использования явной локальной переменной или Result. freq()и OddUserName()оба делают это, но freq()используют только имя функции в качестве операнда в правой части присваивания. freq := freq + 1; должно быть законным заявлением в современных компиляторах Паскаля, см. Почему я могу использовать имя функции в паскале как имя переменной без определения? .

Однако может показаться, что сообщение об ошибке предполагает, что отказавший компилятор обрабатывает freqв операторе freg + 1тип функции, а не локальную переменную. Это объясняет, почему он жалуется на невозможность добавить ShortIntс типом функции.

Таким образом, вместо этого вам придется использовать явную локальную переменную (или специальную Resultпеременную, если ваш компилятор это предоставляет), например:

function freq(charToFind: char; username : String): Integer;
var 
  i, f: Integer;
begin
  f := 0;
  for i := 1 to Length(username) do
    if charToFind = username[i] then
      f := f + 1;
      //writeln(f);
  freq := f;
end; 
function freq(charToFind: char; username : String): Integer;
var 
  i: Integer;
begin
  Result := 0;
  for i := 1 to Length(username) do
    if charToFind = username[i] then
      Result := Result + 1;
      //writeln(f);
end;