iskander писал(а):Это синтаксически неправильная конструкция.
В общем-то правильная

Модератор: Модераторы
iskander писал(а):Это синтаксически неправильная конструкция.

iskander писал(а):Так открой нам эту жгучую тайну, не нужно никаких аксиом.

Лекс Айрин писал(а):Тайна проста. Условно, все ссылочные переменные не определены. Да и в for требуется перечислимый тип. (Byte, Integer, longint... и производные от них).
iskander писал(а):Так открой нам эту жгучую тайну, не нужно никаких аксиом.
Лекс Айрин писал(а):Это компилятор дает по рукам, так как не может проверить (на этапе компиляции) что находится за ссылочной переменной и существует ли она вообще.

Mikhail писал(а):iskander писал(а):Это синтаксически неправильная конструкция.
В общем-то правильная :)
Подумай, что будет с циклом for, если в указателе на переменную цикла будет nil? И локальные переменные для цикла не устраивают? Они же будут или в регистрах или в кеше процессора, а указатель может быть куда угодно, даже в paged memory, в своп.
pI^ := 0;
while pI^ <= 100 do begin ... Inc(pI^); end;

Mikhail писал(а):В общем-то правильная
Лекс Айрин писал(а):Тайна проста. Условно, все ссылочные переменные
Дож писал(а): Тут явно написано "variable identifier"

Mikhail писал(а):Там разыменован типизированный указатель на Integer
serbod писал(а):Подумай, что будет с циклом for, если в указателе на переменную цикла будет nil?
Дож писал(а):Может этот кусок кода тоже запретить на тех же основаниях?

Дож писал(а):Не можете так сделать, потому что это требование компилятора к программе (переменная-счётчик для for-to цикла должна быть локальной к текущему телу).
Не все счётчики размещаются в регистрах, какие-то будут на стеке.
iskander писал(а):Что значит условно?
iskander писал(а):После for должно быть имя переменной.

serbod писал(а):Подумай, что будет с циклом for, если в указателе на переменную цикла будет nil? И локальные переменные для цикла не устраивают? Они же будут или в регистрах или в кеше процессора, а указатель может быть куда угодно, даже в paged memory, в своп.
Лекс Айрин писал(а):Он как только видит, что есть ссылочная переменная или намек на нее, то как скандальная жена
procedure BigBang;
var
  p: PInteger;
  I: Integer;
begin
  p := nil;
  for I := 0 to 100 do
    p[I] := I;
end; 
olegy123 писал(а):сейчас модно не локализировать переменные, а все толкать в стэк.

Дож писал(а):А что будет с такой программой, если pI = nil?
о чем сабж..Лекс Айрин писал(а):olegy123 писал(а):сейчас модно не локализировать переменные, а все толкать в стэк.
Дело не в моде. Это просто особенности реализации компилятора. Для процессора проще использовать или особый регистр-счетчик, либо использовать переменную. И локальные переменные располагаются в стеке, так как ими там проще манипулировать.
olegy123 писал(а):В си for(;true;) будет работать..
iskander писал(а):Насчет "видит": это самообман. Когда дело доходит до указателей компилятор в основном нервно курит в сторонке.
 Обидно... Впрочем, ссылочные типы вообще считаются бедой любого языка и рекомендуют использовать их как можно меньше.
  Обидно... Впрочем, ссылочные типы вообще считаются бедой любого языка и рекомендуют использовать их как можно меньше.
Вернуться в Free Pascal Compiler
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1