Operatör aşırı yüklenmiyor

Sep 10 2020

İyi günler, boş zamanlarımda bazı Codeforces egzersizleri yapıyorum ve kullanıcının kız mı erkek mi olduğunu test etmekte sorun yaşadım, benim sorunum o değil, kodu gösterdim. Kodumu bilgisayarımda derlerken (i386 için 3.0.4 sürümünü kullanıyorum) hata almıyorum, ancak kod güçleri bana bu hatayı veriyor

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 

Aynı komut dosyası benim sürümümle mükemmel bir şekilde derlendiğinden, hata benim için yeterince açık değildi. Platform (sürüm 3.0.2 i386-Win32) kullanıyor.

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.

Hatanın muhtemelen bu satırda olması gerekiyor:

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

Yardımcı olan herkese teşekkürler.

Yanıtlar

1 RemyLebeau Sep 10 2020 at 15:26

Bir işlevin içinde, işlevin adı, açık bir yerel değişken veya Result. freq()ve OddUserName()her ikisi de bunu yapıyor, ancak yalnızca freq()işlev adını atamanın sağ tarafında bir işlenen olarak kullanıyor. modern Pascal derleyicilerinde yasal bir ifade freq := freq + 1; olmalıdır , bkz. Neden fonksiyon adını pascal'da tanımsız değişken adı olarak kullanabilirim? .

Bununla birlikte, hata mesajı başarısız olan derleyicinin freqifadede freg + 1yerel bir değişken olarak değil bir işlev türü olarak davrandığını gösteriyor gibi görünüyor . Bu, neden ShortIntbir işlev türüne sahip bir ekleyememekten şikayet ettiğini açıklar .

Bu nedenle, bunun yerine açık bir yerel değişken (veya Resultderleyiciniz bunu sağlıyorsa özel değişken) kullanmanız gerekecektir , örneğin:

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;