Из языка POV, должен ли Succ / Prev применяться к указателям? [закрыто]

Интересно, можно ли использовать функции Inc / Prev intrinsics для типизированных типов указателей. Также как и Dec/ PointerVar+1или математика ( PointerVar-1и ).program Project9; // Delphi does have reverse-analogu for Pos/PosEx functions {$APPTYPE CONSOLE} // So Delphi IDE ( Version Insight) to cut away a last part uses // of string abuses mixing of record helper (LastIndexOf) System.SysUtils; // and System.Copy function. Searchinf to fix it found this... var OutPut, RemoteName: string; P: PChar; begin try OutPut := 'aaaaaa/zzzzzz'; P := StrRScan( PChar(OutPut), '/'); P := Succ(P); // XE2: [DCC Fatal Error] Project9.dpr(13): F2084 Internal Error: AV0C068241-R00000000-0 // 10.1: [dcc32 Error] Project9.dpr(13): E2008 Incompatible types P := 1+P; // Another way to say Succ() - and works in both XE2 and 10.1 Inc(P); // Yet one more way to say Succ() - and works in both XE2 and 10.1 too RemoteName := P; except on E: Exception do Writeln(E.ClassName, ': ', E.Message); end; end.

Они применяются только для succ / var P : Pointer ; S : Строка ; P : = Succ ( P ); // ошибка Inc ( P ); // ошибка P : = 1 + P ; // работает в XE2, если {$ POINTERMATH ON} , ошибка if {$ POINTERMATH OFF} // ошибка в 10.1 независимо от S : = PChar ( P ); // сбой XE2, если « P : = 1 + P существует выше «порядковых типов», которые не перечислены в списке. Так Pascal Report 1972 (называющий его Scalar Types)

Однако http://www.gnu-pascal.de/gpc/Succ.html#Succ утверждает: «Применение Succ к указателям определено в Borland Pascal». и, как представляется, неразумно исключать эти функции вслед за указателями Math.

Является ли это ограничение обоснованным по языку или просто проблемой реализации, поскольку функции Succ / Succ рассматриваются как несколько загадочные?

Pred

Интересно сравнить его с измененным типом var, Succа не с PChar.

Pred

delphi,pascal,freepascal,turbo-pascal,

0

Ответов: 2


1 принят

Afaik TP не допускает никакого приращения, afaik даже не на pchar (что Delphi до $ pointermath уже разрешено). Таким образом, вопрос для TP (сегментированная модель памяти!) Отличается от вопроса о Delphi.

succ и pred определены для работы с ординалами. Несмотря на то, что вы можете добавлять целые числа к указателям, в настоящее время указатели не считаются порядковым типом. (см., например, порядковые типы ).

Можно утверждать, что это может быть порядковый тип (указатель в delphi соответствует требованиям в ссылке выше), но это не так, как только ваша модель памяти сегментирована (поскольку существует несколько минимумов и максимумов)

Исключение может быть сделано, возможно, для succ и pred во всяком случае, но какой смысл, кроме надежды, работать? Это не делает ничего возможного, чего нельзя было сделать раньше.


4

Конечно же нет. Это противоречит языковым правилам. Вот формальный контракт Succи Predреализуется (из ISO / IEC 7185: 1990 ):

Succ (х)

Из выражения x, которое должно быть порядкового типа, эта функция возвращает результат, который должен быть того же типа, что и выражение (см. 6.7.1). Функция должна давать значение, порядковое число которого больше, чем значение выражения x, если такое значение существует. Это ошибка, если такое значение не существует.

PRED (х)

Из выражения x, которое должно быть порядкового типа, эта функция возвращает результат, который должен быть того же типа, что и выражение (см. 6.7.1). Функция должна давать значение, порядковое число которого меньше, чем значение выражения x, если такое значение существует. Это ошибка, если такое значение не существует.

Как вы видите, Succи Predопределяются только для аргументов только порядковых типов, поэтому они несовместимы с типами указателей (из-за отсутствия присущей обыденности в соответствии с контрактом).

Дельфы, паскаль, FreePascal, турбо паскаль,
Похожие вопросы