Pascal 不重载运算符
你好,我在空闲时间做一些Codeforces练习,我有一个问题要测试用户是男孩还是女孩,好吧,我的问题不是,我刚刚演示了代码。 在我的计算机上编译代码时(我使用的是i386的3.0.4版),我没有收到任何错误,但是codeforces给了我这个错误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
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;