Tidak membebani operator

Sep 10 2020

Selamat siang, saya melakukan beberapa latihan Codeforces di waktu luang saya, dan saya memiliki masalah untuk menguji apakah penggunanya laki-laki atau perempuan, yah, masalah saya bukan itu, saya baru saja mendemonstrasikan kodenya. Saat menyusun kode saya di komputer saya (saya menggunakan versi 3.0.4 untuk i386) saya tidak mendapatkan kesalahan, tetapi kekuatan kode memberi saya kesalahan ini

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 

Kesalahannya tidak cukup jelas bagi saya, karena skrip yang sama dikompilasi dengan sempurna dengan versi saya. Platform ini menggunakan (versi 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.

Kesalahan seharusnya ada di baris ini mungkin:

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

Terima kasih untuk semua orang yang membantu.

Jawaban

1 RemyLebeau Sep 10 2020 at 15:26

Di dalam suatu fungsi, nama fungsi dapat digunakan sebagai pengganti untuk menggunakan variabel lokal eksplisit atau Result. freq()dan OddUserName()keduanya melakukan itu, tetapi hanya freq()menggunakan nama fungsi sebagai operan di sisi kanan tugas. freq := freq + 1; harus menjadi pernyataan resmi dalam kompiler Pascal modern, lihat Mengapa saya dapat menggunakan nama fungsi di pascal sebagai nama variabel tanpa definisi? .

Namun, tampaknya pesan kesalahan menyarankan bahwa compiler yang gagal memperlakukan freqpernyataan tersebut freg + 1sebagai tipe fungsi dan bukan sebagai variabel lokal. Itu akan menjelaskan mengapa mengeluh tentang tidak bisa menambahkan ShortIntdengan tipe fungsi.

Jadi, Anda harus menggunakan variabel lokal eksplisit, (atau Resultvariabel khusus , jika kompilator Anda menyediakannya), misalnya:

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;