Типы данных

Вопросы программирования на Free Pascal, использования компилятора и утилит.

Модератор: Модераторы

Re: Типы данных

Сообщение Mikhail » 05.12.2017 17:52:04

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

В общем-то правильная :)
Mikhail
постоялец
 
Сообщения: 483
Зарегистрирован: 24.10.2013 16:06:47

Re: Типы данных

Сообщение Лекс Айрин » 05.12.2017 18:03:51

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


Тайна проста. Условно, все ссылочные переменные не определены. Да и в for требуется перечислимый тип. (Byte, Integer, longint... и производные от них).
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 4175
Зарегистрирован: 19.02.2013 16:54:51

Re: Типы данных

Сообщение Mikhail » 05.12.2017 18:12:00

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

Там разыменован типизированный указатель на Integer
Mikhail
постоялец
 
Сообщения: 483
Зарегистрирован: 24.10.2013 16:06:47

Re: Типы данных

Сообщение serbod » 05.12.2017 18:17:33

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

Выше уже сказано:
Лекс Айрин писал(а):Это компилятор дает по рукам, так как не может проверить (на этапе компиляции) что находится за ссылочной переменной и существует ли она вообще.


Подумай, что будет с циклом for, если в указателе на переменную цикла будет nil? И локальные переменные для цикла не устраивают? Они же будут или в регистрах или в кеше процессора, а указатель может быть куда угодно, даже в paged memory, в своп.
Аватара пользователя
serbod
постоялец
 
Сообщения: 215
Зарегистрирован: 16.09.2016 11:03:02
Откуда: Минск

Re: Типы данных

Сообщение Дож » 05.12.2017 18:19:52

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

В общем-то правильная :)

С чего бы это вдруг? Тут явно написано "variable identifier" https://www.freepascal.org/docs-html/re ... 600013.2.4

Добавлено спустя 1 минуту 24 секунды:
Подумай, что будет с циклом for, если в указателе на переменную цикла будет nil? И локальные переменные для цикла не устраивают? Они же будут или в регистрах или в кеше процессора, а указатель может быть куда угодно, даже в paged memory, в своп.

А что будет с такой программой, если pI = nil?
Код: Выделить всё
pI^ := 0;
while pI^ <= 100 do begin ... Inc(pI^); end;

Может этот кусок кода тоже запретить на тех же основаниях?
Аватара пользователя
Дож
энтузиаст
 
Сообщения: 689
Зарегистрирован: 12.10.2008 16:14:47

Re: Типы данных

Сообщение iskander » 05.12.2017 18:22:14

Mikhail писал(а):В общем-то правильная

Нет.
Лекс Айрин писал(а):Тайна проста. Условно, все ссылочные переменные

Что значит условно?
После for должно быть имя переменной.
iskander
новенький
 
Сообщения: 99
Зарегистрирован: 08.01.2012 18:43:34

Re: Типы данных

Сообщение Mikhail » 05.12.2017 18:24:10

Дож писал(а): Тут явно написано "variable identifier"

Гм, да ты прав. :?
Mikhail
постоялец
 
Сообщения: 483
Зарегистрирован: 24.10.2013 16:06:47

Re: Типы данных

Сообщение Лекс Айрин » 05.12.2017 18:36:34

Mikhail писал(а):Там разыменован типизированный указатель на Integer


А компилятор не смотрит, что там и как разыменовано. Он как только видит, что есть ссылочная переменная или намек на нее, то как скандальная жена заявляет -- "... мне пофиг как у тебя тюбетейка надета."
serbod писал(а):Подумай, что будет с циклом for, если в указателе на переменную цикла будет nil?


А тут и думать нечего -- сработает прерывание общей защиты, так только перейдут по этому адресу, и все.

Дож писал(а):Может этот кусок кода тоже запретить на тех же основаниях?


У тебя ссылочные переменные съедят больше места, чем локальные счетчики циклов. И да, я бы тоже не стал так извращаться.
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 4175
Зарегистрирован: 19.02.2013 16:54:51

Re: Типы данных

Сообщение olegy123 » 05.12.2017 18:54:42

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

Не все счётчики размещаются в регистрах, какие-то будут на стеке.

Т.е как я понял - сейчас модно не локализировать переменные, а все толкать в стэк.
olegy123
энтузиаст
 
Сообщения: 763
Зарегистрирован: 25.02.2016 12:10:20

Re: Типы данных

Сообщение Лекс Айрин » 05.12.2017 18:56:17

iskander писал(а):Что значит условно?


Это значит, что значение ссылочной переменной не контролируется компилятором вообще. Максимум, на совпадение типов. Совпадает -- присваивай не хочу, но в некоторых случаях, типа for, просто требуется реальный тип т. е .тот же PInteger^ <> Integer. Это особенность языка.
iskander писал(а):После for должно быть имя переменной.


Я открою тебе страшный секрет -- если бы не нужно было использовать счетчик внутри цикла, то вообще не было надобности в отдельной переменной.
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 4175
Зарегистрирован: 19.02.2013 16:54:51

Re: Типы данных

Сообщение olegy123 » 05.12.2017 18:56:52

serbod писал(а):Подумай, что будет с циклом for, если в указателе на переменную цикла будет nil? И локальные переменные для цикла не устраивают? Они же будут или в регистрах или в кеше процессора, а указатель может быть куда угодно, даже в paged memory, в своп.

В си for(;true;) будет работать.. а в паскале много условностей, и не всегда понятно что на выходе можно получить.
olegy123
энтузиаст
 
Сообщения: 763
Зарегистрирован: 25.02.2016 12:10:20

Re: Типы данных

Сообщение iskander » 05.12.2017 18:57:55

Лекс Айрин писал(а):Он как только видит, что есть ссылочная переменная или намек на нее, то как скандальная жена

Лекс ты не понял, это синтаксическая ошибка.
Насчет "видит": это самообман. Когда дело доходит до указателей компилятор в основном нервно курит в сторонке.
например код
Код: Выделить всё
procedure BigBang;
var
  p: PInteger;
  I: Integer;
begin
  p := nil;
  for I := 0 to 100 do
    p[I] := I;
end;

компилируется в FPC недельной давности без единого замечания.
iskander
новенький
 
Сообщения: 99
Зарегистрирован: 08.01.2012 18:43:34

Re: Типы данных

Сообщение Лекс Айрин » 05.12.2017 18:59:18

olegy123 писал(а):сейчас модно не локализировать переменные, а все толкать в стэк.


Дело не в моде. Это просто особенности реализации компилятора. Для процессора проще использовать или особый регистр-счетчик, либо использовать переменную. И локальные переменные располагаются в стеке, так как ими там проще манипулировать.
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 4175
Зарегистрирован: 19.02.2013 16:54:51

Re: Типы данных

Сообщение olegy123 » 05.12.2017 19:00:04

Дож писал(а):А что будет с такой программой, если pI = nil?

nil = 0

Добавлено спустя 2 минуты 31 секунду:
Лекс Айрин писал(а):
olegy123 писал(а):сейчас модно не локализировать переменные, а все толкать в стэк.


Дело не в моде. Это просто особенности реализации компилятора. Для процессора проще использовать или особый регистр-счетчик, либо использовать переменную. И локальные переменные располагаются в стеке, так как ими там проще манипулировать.
о чем сабж..
мне бы спокойно создать руками в теле функции переменные в куче.. и их в конце удалить. А то сиди и гадай, что на выходе компилятор придумает.
В этом плане Си более адекватный.
olegy123
энтузиаст
 
Сообщения: 763
Зарегистрирован: 25.02.2016 12:10:20

Re: Типы данных

Сообщение Лекс Айрин » 05.12.2017 19:05:48

olegy123 писал(а):В си for(;true;) будет работать..


С это совсем другой язык и у него столько недостатков, что удивляюсь в его живучести. Он позволяет программе отстрелить себе ноги, руки, голову и мелко покрошить все остальное. И, кстати, я бы не гордился данным фактом.

iskander писал(а):Насчет "видит": это самообман. Когда дело доходит до указателей компилятор в основном нервно курит в сторонке.


Не ожидал, что настолько :shock: Обидно... Впрочем, ссылочные типы вообще считаются бедой любого языка и рекомендуют использовать их как можно меньше.
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 4175
Зарегистрирован: 19.02.2013 16:54:51

Пред.След.

Вернуться в Free Pascal Compiler

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 5

Рейтинг@Mail.ru
cron