不重载运算符

问题描述

早上好,我在业余时间做一些Codeforces练习,并且在测试用户是男孩还是女孩时遇到问题,嗯,我的问题不是,我只是演示了代码。 在计算机上编译我的代码时(我在i386上使用版本3.0.4),我没有收到任何错误,但是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;

感谢所有提供帮助的人。

解决方法

在函数内部,该函数的名称可以替代使用显式局部变量或ng build --prodResultfreq()都是这样做的,但是只有OddUserName()使用函数名作为赋值右侧的操作数。 freq() 应该是现代Pascal编译器中的法律声明,请参见Why i can use function name in pascal as variable name without definition?

但是,错误消息似乎表明失败的编译器正在将语句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;