Почему порядковое выражение ожидается в if здесь - PullRequest
0 голосов
/ 19 июня 2019

Я пытаюсь написать функцию, которая возвращает true, если какой-либо символ отправленной строки имеет значение ascii> 127 (не для печати):

function isBinary(line: string): boolean; 
begin
    result := false; 
    for c in line do 
        if (Ord(c) > 127) then 
            result := true; 
        end; 
end; 

Однако выдает ошибку:

 Error: Ordinal expression expected

Где проблема и как ее можно решить? Спасибо за вашу помощь.

Ответы [ 2 ]

2 голосов
/ 19 июня 2019

В показанном вами коде есть как минимум две ошибки.

  1. Вы не объявляете переменную цикла c.Вы должны сделать это, используя тип, соответствующий преобладающему типу string в вашем коде, который мы не можем вывести.
  2. У вас есть один оператор begin в коде, но два оператора end.Это один end слишком много.

Даже когда вы исправите это, эта функция не проверяет, является ли что-либо двоичным.A string по определению содержит текст.И большое количество текста может быть закодировано с порядковыми значениями, превышающими 127.

Кроме того, в кодировке ASCII используются значения от 0 до 127 включительно, поэтому «значение ascii> 127» является чем-то противоречивым в терминах.

1 голос
/ 19 июня 2019

Отказ от ответственности: Я пишу этот ответ, не зная типа c.

Функция Ord имеет следующий прототип:

function Ord(X: TOrdinal):LongInt;

Это означает, что в качестве параметра принимается порядковый тип.Если c имеет тип char, то функция работает отлично, но в вашем коде у вас есть дополнительный end после предложения if.

Правильный способ написания функции:

function isBinary(line: string): boolean; 
begin
    result := false; 
    for c in line do 
        if (Ord(c) > 127) then 
            result := true; 
end; 

Если c не равно char, то причина проблемы теперь становится очевидной.

...