массивы

Общие вопросы программирования, алгоритмы и т.п.

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

Re: массивы

Сообщение Лекс Айрин » 03.02.2017 14:48:28

enot777 писал(а): а дальше, как это часто бывает, начинается песня о совместимости.


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

Re: массивы

Сообщение enot777 » 03.02.2017 14:54:32

enot777
новенький
 
Сообщения: 24
Зарегистрирован: 24.11.2016 15:20:58

Re: массивы

Сообщение vitaly_l » 03.02.2017 15:01:18

enot777 писал(а):Нашёл такое описание, что есть глобальные и локальные переменные.

И????....
Вы изучили, то, что нашли?
И теперь уже можете ответить: b <== это локальная или глобальная переменная, в коде топикстартера?
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41

Re: массивы

Сообщение enot777 » 03.02.2017 15:14:00

>> vitaly_l
Исходя из приведённого описания выходит, что "b" глобальная переменная и судя по поведению программы это подтверждается.

Насчёт инициализации переменных: я с этим полностью согласен. Лучше знать с чем имеешь дело, чем не знать.
enot777
новенький
 
Сообщения: 24
Зарегистрирован: 24.11.2016 15:20:58

Re: массивы

Сообщение beria » 03.02.2017 16:35:34

enot777 писал(а):Это, я так понимаю, было изначально характерно для первых версий Pascal,

Как минимум на TP3 без явной инициализации в программном блоке в переменной был мусор.....
Аватара пользователя
beria
постоялец
 
Сообщения: 130
Зарегистрирован: 29.09.2016 08:57:13

Re: массивы

Сообщение vitaly_l » 03.02.2017 18:03:27

enot777 писал(а): "b" глобальная переменная и судя по поведению программы это подтверждается

Верно - она глобальная. Но вот проблема, судя по Вашим словам, компилятор говорит, что она не инициализирована
enot777 писал(а):Если вы явно не инициализируете глобальную переменную, компилятор устанавливает для нее значение 0.

enot777 писал(а):если в IDE Free Pascal в настройках (Options->Compiler->Verbose) выбрать Warnings, Notes, Hints, General Info, то при компиляции программы из первого поста, выяснится, что переменная b может быть не инициализирована

Соответственно: либо Вы, либо компилятор - вводите художников в заблуждение. Если в заблуждение вводите Вы, то это пофигу, а вот если компилятор... То нужно срочно писать в баг-трекер.

Кто заблуждается Вы или компилятор?

.
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41

Re: массивы

Сообщение Лекс Айрин » 03.02.2017 18:20:48

vitaly_l писал(а):Кто заблуждается Вы или компилятор?


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

Re: массивы

Сообщение enot777 » 03.02.2017 18:26:04

Как минимум на 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.
enot777
новенький
 
Сообщения: 24
Зарегистрирован: 24.11.2016 15:20:58

Re: массивы

Сообщение Лекс Айрин » 03.02.2017 18:35:48

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

Re: массивы

Сообщение vitaly_l » 03.02.2017 18:38:11

enot777 писал(а):Про TP3 не скажу, а такая программа на TP7 выведет на экран нули

И что??? Сейчас рисует нули (потому что в ячейке на момент создания переменной, было пусто), через час там может оказаться мусор. И программа выведет мусор. В локальных переменных, всё тоже самое. Напишите этот код, в процедуру и она тоже выведет нули или мусор.
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41

Re: массивы

Сообщение enot777 » 03.02.2017 18:43:46

Естественно, этот код в процедуре работать так же не будет, ибо переменные не будут глобальными.
enot777
новенький
 
Сообщения: 24
Зарегистрирован: 24.11.2016 15:20:58

Re: массивы

Сообщение vitaly_l » 03.02.2017 18:52:12

enot777 писал(а):ибо переменные не будут глобальными

Если в переменную, 100% заносится 0, то тогда она 100% инициализирована. <== Вот в чём суть.
Значит обманывает компилятор?
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41

Re: массивы

Сообщение enot777 » 03.02.2017 19:02:00

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

Здесь и сейчас рассматривался код из первого поста и особенности его реализации.

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.
enot777
новенький
 
Сообщения: 24
Зарегистрирован: 24.11.2016 15:20:58

Re: массивы

Сообщение vitaly_l » 03.02.2017 19:21:25

enot777 писал(а):Использовать это не надо, но знать, что у FPC есть такая особенность, для общего развития, наверное, можно.

Стоп, это лишние итерации и их очень много. Такого технически не может быть, т.к. если массив 1 000 000 000 000 элементов, такая приблуда ненужного принудительного обнуления - тормознёт в два раза любую программу. Вы явно заблуждаетесь.
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41

Re: массивы

Сообщение Лекс Айрин » 03.02.2017 19:27:43

enot777 писал(а):Вот пример с pointer. На экране появится 0.

При прямой инициации... Я же описывал немного другой механизм... используя Get/FreeMem.
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

Пред.След.

Вернуться в Общее

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

Сейчас этот форум просматривают: svk12 и гости: 18

Рейтинг@Mail.ru