You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

编写非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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 08:13:23