Оператор без перегрузки
Добрый день, в свободное время я делаю упражнения 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;
Спасибо всем, кто помогает.
Ответы
Внутри функции имя функции может использоваться вместо использования явной локальной переменной или 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;