Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 23.08.2011, 10:32   #11
mss
Заблокирован
 
Регистрация: 27.05.2010
Сообщений: 1,099
По умолчанию

Цитата:
ссылкаться на то, что некоторые компонеты могут быть заменены это смешно
Какие такие "компоненты" ?
ГДЕ ты в моем посте увидел хоть что-либо касаемое "компонентов" ?
Выдумывать небылицы - это смешно.

Цитата:
Если в документации сказано, что глобальные переменные инициализируются нулевыми значениями, то оно так и есть
Так оно и есть если исп.модуль проекта собирается (не путать с "компилируется") в Делфи.
Но ничто в принципе не мешает собрать исп.модуть проекта другим сборщиком, для которого это правило "обнуления" не является обязательным.

Последний раз редактировалось mss; 23.08.2011 в 10:38.
mss вне форума Ответить с цитированием
Старый 23.08.2011, 10:35   #12
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

mss, вы уж извините, но у вас стереотип к слову "компонент".
имеется в виду не VCL-компоненты, а компонент компилятора.(т.е. линкер)
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 23.08.2011, 10:44   #13
DenNik2006
Пользователь
 
Аватар для DenNik2006
 
Регистрация: 27.07.2011
Сообщений: 71
По умолчанию

Цитата:
Сообщение от xrob Посмотреть сообщение
еще я как-то создал массив интегров, и по невнимательности пытался его читать,
предварительно не записав туда данные - ну так вот, читалась всякая хрень,
всегда разная - очень похоже на то что я описал выше.
экспериментировал с массивом интегров.
Если объявить статический массив (a: array[0..5] of integer), то при чтении выводит всякую дрянь, а если так
Код:
a: array of integer
SetLength(a,5)
то все значения нули. Получается что SetLength проводит начальную инициализацию?
Техника несовершенна: компьютеру, чтобы прийти в себя, нужно три пальца, человеку - всего два!
DenNik2006 вне форума Ответить с цитированием
Старый 23.08.2011, 10:52   #14
chertovich
Форумчанин
 
Аватар для chertovich
 
Регистрация: 26.07.2009
Сообщений: 489
По умолчанию

Цитата:
Сообщение от DenNik2006 Посмотреть сообщение
экспериментировал с массивом интегров.
Если объявить статический массив (a: array[0..5] of integer), то при чтении выводит всякую дрянь, а если так
Код:
a: array of integer
SetLength(a,5)
то все значения нули. Получается что SetLength проводит начальную инициализацию?
Врядли, это просто повезло, наткнулся на очищенную область. Надеятся на это не стоит
Если в глубине души вы программист, то, следуя своим наклонностям, вы захотите написать кусок кода.
chertovich вне форума Ответить с цитированием
Старый 23.08.2011, 10:57   #15
DenNik2006
Пользователь
 
Аватар для DenNik2006
 
Регистрация: 27.07.2011
Сообщений: 71
По умолчанию

Цитата:
Сообщение от chertovich Посмотреть сообщение
Врядли, это просто повезло, наткнулся на очищенную область. Надеятся на это не стоит
нет, пробовал несколько раз - все время нули
Техника несовершенна: компьютеру, чтобы прийти в себя, нужно три пальца, человеку - всего два!
DenNik2006 вне форума Ответить с цитированием
Старый 23.08.2011, 11:04   #16
GunSmoker
Старожил
 
Регистрация: 13.08.2009
Сообщений: 2,581
По умолчанию

Цитата:
Сообщение от mss Посмотреть сообщение
Код:
..
implementation
var N: Integer;
Чему будет равна N при первом же обращении к ней по чтению ?
Она ни разу не глобальная.
Чегоооо? В каком месте она не глобальная?

Справка:
Цитата:
Variables declared within a procedure or function are sometimes called local, while other variables are called global.
Цитата:
И не обязана быть равна нулю в общем случае.
В Delphi это гарантируется. В языке C это, по-моему, аж в стандарт записано.

FreePascal - таки, да, говорит "Any assumption that they contain 0 or any other default value is erroneous: They can contain rubbish".

Но лично мне тогда не понятно: как же он тогда компилирует Delphi код?

Более того, непонятно, как вообще в этом случае могут у него быть глобальные переменные типа дин. массивов и строк? Типа, он создаёт глобальные переменные в... чём? Что у нас есть, что не zero-initialized? Куча менеджера памяти? 0_o А затем затирает нулями только автоматические типы? .... бред какой-то получается.
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
GunSmoker вне форума Ответить с цитированием
Старый 23.08.2011, 11:07   #17
mss
Заблокирован
 
Регистрация: 27.05.2010
Сообщений: 1,099
По умолчанию

Цитата:
Если объявить статический массив (a: array[0..5] of integer), то при чтении выводит всякую дрянь
Смотря где объявить. Если этот стат.массив объявлен локальной переменной подпрограммы, то "дрянь" объяснима и ожидаема. В противном случае дельфийский линкер обязан его обнулить.
mss вне форума Ответить с цитированием
Старый 23.08.2011, 11:11   #18
GunSmoker
Старожил
 
Регистрация: 13.08.2009
Сообщений: 2,581
По умолчанию

Цитата:
Сообщение от DenNik2006 Посмотреть сообщение
нет, пробовал несколько раз - все время нули
В SetLength для дин.массивов:
Код:
  // Set the new memory to all zero bits
  FillChar((PAnsiChar(p) + elSize * oldLength)^, elSize * (newLength - oldLength), 0);
Справка:
Цитата:
Existing elements in the array are preserved and newly allocated space is set to 0 or nil
Но это не так для строк.

Цитата:
Existing characters in the string are preserved, but the content of newly allocated space is undefined.
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
GunSmoker вне форума Ответить с цитированием
Старый 23.08.2011, 11:20   #19
GunSmoker
Старожил
 
Регистрация: 13.08.2009
Сообщений: 2,581
По умолчанию

Цитата:
Сообщение от mss Посмотреть сообщение
В противном случае дельфийский линкер обязан его обнулить.
Вообще-то это не компоновщик делает, а загрузчик ОС.

В Windows глобальные переменные (не инициализированные явно) выделяются в отдельный сегмент. В исполняемый модуль пишется только размер этого сегмента, но не содержимое. А уж при загрузке модуля загрузчик ОС создаёт в памяти процесса блок памяти (zero-initialized) - в нём и будут лежать глобальные переменные. Вот почему глобальные переменные всегда гарантировано равны нулю.

Глобальные переменные, которым в коде явно задано инициализирующее значение, идут в сегмент данных, который явно хранится в модуле и при его загрузке проецируется в память процесса.

Аналогичные механизмы предусмотрен и в других ОС.
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
GunSmoker вне форума Ответить с цитированием
Старый 23.08.2011, 11:24   #20
mss
Заблокирован
 
Регистрация: 27.05.2010
Сообщений: 1,099
По умолчанию

Цитата:
В каком месте она не глобальная?
"Глобальность" - понятие касаемое исключительно области видимости.

Видимость ид-ра переменной на уровне проекта в целом и видимость ид-ра переменной в пределах юнита - все же разного уровня "глобальности" вещи.
И во избежание недоразумений всегда следует уточнять этот уровень.

Но объединяет их одно - время жизни, обусловленное способом резервирования памяти.

Цитата:
В Delphi это гарантируется
Не знаю.
Завтра Эмаркадеро запросто может развернуть оглобли и в лучшем случае из соображений обратной совместимости сделать дифолтную "обнуляцию" data опциональной.
Полагаться на эти гарантии я бы не стал. Тем более если проект заведомо подлежит перспективному портированию, например, в тот же Лазарь.

Последний раз редактировалось mss; 23.08.2011 в 11:31.
mss вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Обьявление глобальной функции Scorpeon Общие вопросы Delphi 3 22.04.2010 11:11
Обьявление массива bondik Общие вопросы C/C++ 1 31.03.2009 19:09
обьявление классов пыхонин филипп Помощь студентам 1 21.03.2009 20:10
var Черничный Общие вопросы Delphi 9 25.06.2008 17:10
Работа с файлами (создание, удаление, открытие, связываение с переменной, очищение памяти переменной) Arkuz Общие вопросы Delphi 12 25.09.2007 20:47