编写非ASCII字符判断函数时“Ordinal expression expected”报错排查
嘿,我来帮你排查这个问题!你遇到的Error: Ordinal expression expected报错主要有两个明确的原因,另外我还发现一个可以优化的小细节,下面给你一一拆解:
问题1:变量c未声明
Delphi是强类型语言,所有变量在使用前必须明确声明类型。你在for c in line do循环里直接用了c,但没提前告诉编译器它是什么类型——编译器不知道c是不是序数类型,自然没法处理Ord(c)这个表达式,这就是报错的核心原因。
问题2:多余的end;
你的函数末尾多写了一个end;,函数只需要一个end;来闭合开头的begin块,多余的这个会破坏语法结构,也会导致编译问题。
额外优化点:提前终止循环
原代码会遍历完整个字符串,哪怕已经找到第一个ASCII值大于127的字符了。其实只要找到目标字符,我们就可以直接返回true并终止循环,这样能提升代码效率。
修正后的代码(适配Delphi 2009+,默认Unicode字符串)
function isBinary(line: string): boolean; var c: Char; // 明确声明字符变量类型 begin result := false; for c in line do begin if Ord(c) > 127 then begin result := true; Break; // 找到目标字符后立即退出循环,不用再遍历 end; end; end;
如果需要兼容旧版Delphi(ANSI字符串)
要是你的项目还在使用Delphi 2007及以前的版本(默认string是AnsiString),可以用这个版本:
function isBinary(line: string): boolean; var c: AnsiChar; begin result := false; for c in line do begin if Ord(c) > 127 then begin result := true; Break; end; end; end;
补充说明一下:Ord()函数用来获取序数类型的数值,对于Char(也就是WideChar)它返回对应的Unicode码点,对于AnsiChar则返回ASCII值,完全符合你的需求。
内容的提问来源于stack exchange,提问作者rnso
相关产品推荐
相关产品推荐

