Страница 2 из 5
Re: массивы
Добавлено: 03.02.2017 13:48:28
Лекс Айрин
enot777 писал(а): а дальше, как это часто бывает, начинается песня о совместимости.
А в следующих версиях захотят инициировать семерками.... правило не надеяться на не инициированные значения возникло не просто так, а от очень нехорошей жизни.
Re: массивы
Добавлено: 03.02.2017 13:54:32
enot777
Re: массивы
Добавлено: 03.02.2017 14:01:18
vitaly_l
enot777 писал(а):Нашёл такое описание, что есть глобальные и локальные переменные.
И????....
Вы изучили, то, что нашли?
И теперь уже можете ответить:
b <== это локальная или глобальная переменная, в коде топикстартера?
Re: массивы
Добавлено: 03.02.2017 14:14:00
enot777
>> vitaly_l
Исходя из приведённого описания выходит, что "b" глобальная переменная и судя по поведению программы это подтверждается.
Насчёт инициализации переменных: я с этим полностью согласен. Лучше знать с чем имеешь дело, чем не знать.
Re: массивы
Добавлено: 03.02.2017 15:35:34
beria
enot777 писал(а):Это, я так понимаю, было изначально характерно для первых версий Pascal,
Как минимум на TP3 без явной инициализации в программном блоке в переменной был мусор.....
Re: массивы
Добавлено: 03.02.2017 17:03:27
vitaly_l
enot777 писал(а): "b" глобальная переменная и судя по поведению программы это подтверждается
Верно - она глобальная. Но вот проблема, судя по Вашим словам, компилятор говорит, что она
не инициализированаenot777 писал(а):Если вы явно не инициализируете глобальную переменную, компилятор устанавливает для нее значение 0.
enot777 писал(а):если в IDE Free Pascal в настройках (Options->Compiler->Verbose) выбрать Warnings, Notes, Hints, General Info, то при компиляции программы из первого поста, выяснится, что переменная b может быть не инициализирована
Соответственно: либо Вы, либо компилятор - вводите художников в заблуждение. Если в заблуждение вводите Вы, то это пофигу, а вот если компилятор... То нужно срочно писать в баг-трекер.
Кто заблуждается Вы или компилятор?.
Re: массивы
Добавлено: 03.02.2017 17:20:48
Лекс Айрин
vitaly_l писал(а):Кто заблуждается Вы или компилятор?
Речь идет об инициации программистом. Т. е. компилятор, условно, говорит: "А тут переменная не проиниициализирована... ну ладно, поставлю ноль. Но ты проверь, нет ли ошибки."
Re: массивы
Добавлено: 03.02.2017 17:26:04
enot777
Как минимум на TP3 без явной инициализации в программном блоке в переменной был мусор.....
Про TP3 не скажу, а такая программа на TP7 выведет на экран нули
Код: Выделить всё
program arr;
type
TA = array [1..10] of integer;
var
i: integer;
a: TA;
begin
for i:=low(a) to high(a) do writeln(a[i]);
readln;
end.
7.2 Turbo Pascal
Free Pascal was originally designed to resemble Turbo Pascal as closely as possible. There are, of
course, restrictions. Some of these are due to the fact that Turbo Pascal was developed for 16-bit
architectures whereas Free Pascal is a 32-bit/64-bit compiler. Other restrictions result from the fact
that Free Pascal works on more than one operating system.
Из fpc_user.pdf. Стр. 97.
Re: массивы
Добавлено: 03.02.2017 17:35:48
Лекс Айрин
enot777, массивы ладно... но ведь бывают случаи, при работе со ссылочными типами, когда указатель дается на просто область памяти, которую потом программа вольна использовать как угодно.... и если в этой области не произвести глобальную зачистку, то могут быть любые последствия. Так как до этого в ней могло находиться что угодно. И если не приучить себя изначально, то потом очень тяжело заметить почему вдруг программа ведет себя непредсказуемо.
Re: массивы
Добавлено: 03.02.2017 17:38:11
vitaly_l
enot777 писал(а):Про TP3 не скажу, а такая программа на TP7 выведет на экран нули
И что??? Сейчас рисует нули (потому что в ячейке на момент создания переменной, было пусто), через час там может оказаться мусор. И программа выведет мусор. В локальных переменных, всё тоже самое. Напишите этот код, в процедуру и она тоже выведет нули или мусор.
Re: массивы
Добавлено: 03.02.2017 17:43:46
enot777
Естественно, этот код в процедуре работать так же не будет, ибо переменные не будут глобальными.
Re: массивы
Добавлено: 03.02.2017 17:52:12
vitaly_l
enot777 писал(а):ибо переменные не будут глобальными
Если в переменную, 100% заносится 0, то тогда она 100% инициализирована. <== Вот в чём суть.
Значит обманывает компилятор?
Re: массивы
Добавлено: 03.02.2017 18:13:54
enot777
Лекс АйринВыше я уже писал, что считаю явную инициализацию любых переменных правильным поведением и единственно верным.
Здесь и сейчас рассматривался код из первого поста и особенности его реализации.
vitaly_lКомпилятор вас не может обманывать.
Разработчики позиционируют FPC как максимально возможного приемника Turbo Pascal, и эта особенность FPC оттуда же (TP).
Добавлено спустя 11 минут 54 секунды:Вот пример с
pointer. На экране появится 0.
Проверенно fpc 3.1.1.
Использовать это не надо, но знать, что у FPC есть такая особенность, для общего развития, наверное, можно. Код: Выделить всё
{$mode objfpc}
var p: pointer;
begin
writeln(integer(p));
readln;
end.
Re: массивы
Добавлено: 03.02.2017 18:21:25
vitaly_l
enot777 писал(а):Использовать это не надо, но знать, что у FPC есть такая особенность, для общего развития, наверное, можно.
Стоп, это лишние итерации и их очень много. Такого технически не может быть, т.к. если массив 1 000 000 000 000 элементов, такая приблуда ненужного принудительного обнуления - тормознёт в два раза любую программу. Вы явно заблуждаетесь.
Re: массивы
Добавлено: 03.02.2017 18:27:43
Лекс Айрин
enot777 писал(а):Вот пример с pointer. На экране появится 0.
При прямой инициации... Я же описывал немного другой механизм... используя Get/FreeMem.