Nie przeciąża operatora

Sep 10 2020

Dzień dobry, w wolnym czasie wykonuję ćwiczenia Codeforces i miałem problem, aby sprawdzić, czy użytkownik był chłopcem czy dziewczynką, cóż, mój problem nie jest taki, właśnie pokazałem kod. Podczas kompilacji kodu na moim komputerze (używam wersji 3.0.4 dla i386) nie widzę błędu, ale codeforces daje mi ten błąd

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 

Błąd nie był dla mnie wystarczająco jasny, ponieważ ten sam skrypt został doskonale skompilowany z moją wersją. Platforma używa (wersja 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.

Błąd ma być prawdopodobnie w tej linii:

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

Dziękuję wszystkim, którzy pomagają.

Odpowiedzi

1 RemyLebeau Sep 10 2020 at 15:26

Wewnątrz funkcji nazwa funkcji może być używana jako substytut dla użycia jawnej zmiennej lokalnej lub Result. freq()i OddUserName()oboje to robią, ale tylko freq()używają nazwy funkcji jako operandu po prawej stronie przypisania. freq := freq + 1; powinno być stwierdzeniem prawnym we współczesnych kompilatorach Pascala, zobacz Dlaczego mogę używać nazwy funkcji w pascalu jako nazwy zmiennej bez definicji? .

Jednak wydaje się, że komunikat o błędzie sugeruje, że kompilator, który uległ awarii, traktuje freqinstrukcję freg + 1jako typ funkcji, a nie jako zmienną lokalną. To by wyjaśniało, dlaczego narzeka na niemożność dodania a ShortIntz typem funkcji.

Więc zamiast tego będziesz musiał użyć jawnej zmiennej lokalnej (lub specjalnej Resultzmiennej, jeśli twój kompilator to zapewnia), np:

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;