Pascal 不重载运算符

Pascal 不重载运算符,pascal,freepascal,Pascal,Freepascal,你好,我在空闲时间做一些Codeforces练习,我有一个问题要测试用户是男孩还是女孩,好吧,我的问题不是,我刚刚演示了代码。 在我的计算机上编译代码时(我使用的是i386的3.0.4版),我没有收到任何错误,但是codeforces给了我这个错误 program.pas(15,16) Error: Operator is not overloaded: "freq(Char;AnsiString):LongInt;" + "ShortInt" progr

你好,我在空闲时间做一些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)


感谢所有提供帮助的人。

在函数内部,函数名可以用作使用显式局部变量或
结果的替代品
freq()
OddUserName()
都在这样做,但只有
freq()
将函数名用作赋值右侧的操作数<代码>频率:=频率+1
应该是现代Pascal编译器中的法律声明,请参阅

但是,错误消息似乎表明失败的编译器将语句
freg+1
中的
freq
视为函数类型,而不是局部变量。这就解释了为什么它抱怨不能用函数类型添加
ShortInt

因此,您必须使用显式局部变量(或特殊的
结果
变量,如果编译器提供),例如:

函数freq(chartofId:char;用户名:String):整数;
变量
i、 f:整数;
开始
f:=0;
对于i:=1到长度(用户名)do
如果chartofId=username[i],则
f:=f+1;
//书面(f);
频率:=f;
结束;
函数freq(chartofId:char;用户名:String):整数;
变量
i:整数;
开始
结果:=0;
对于i:=1到长度(用户名)do
如果chartofId=username[i],则
结果:=结果+1;
//书面(f);
结束;

不确定编译器错误(可能与
char
参数命名为与数据类型相同有关,请尝试重命名),但确实存在逻辑错误。在对字符串进行迭代时,不能修改该字符串。
长度
不会在每次循环迭代中重新计算,它只计算一次并缓存。但即使重新计算,循环也会在每次
删除后跳过一个字符。错误出现在第15行,即“freq:=freq+1”;您正在使用赋值右侧的函数名。这可能是不对的。尝试使用局部变量而不是freq,最后,用局部变量指定freq。我只是在猜测。@RemyLebeau我知道,但我也认为你不能在转让权上使用它。此时,它被视为函数调用,需要参数。可以使用“结果”,而不是函数名。但用户似乎不使用Delphi,并且该方言中可能不存在“Result”伪变量。这就是我建议使用局部变量的原因。@fpiette“我也认为您不能在赋值右边使用它”——现代Pascal编译器确实允许这样做。因此,这可能是失败的编译器中的一个错误,或者编译器太旧了,不允许使用它。@RemyLebeau D10.4.1不希望使用它。这可能是最有说服力的答案,在旧版本中,只能将相同类型的局部变量指定给函数名,而不能指定值,在新一代Pascal编译器中,它似乎是合法的。不幸的是,我的编译器没有提供结果变量,但是局部变量工作得很好。非常感谢你!
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;