|
|
|
Наполняемость переменной при декларации
|
|||
|---|---|---|---|
|
#18+
Доброго дня господа ! Delphi 10.3.3 (64-ibt) Заметил такую ИСТИНУ (!!!!????) хотел бы уточнить может оптический обман зрения В процедуре объявил переменную типа ADOConnection (пока не создал объект Create) и она уже не равна Nil , Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. Это новый прикол компилятора ? Спасибо ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.04.2020, 19:18 |
|
||
|
Наполняемость переменной при декларации
|
|||
|---|---|---|---|
|
#18+
HOME_X, Это старый прикол. Локальные unmanaged переменные компилятор не инициализирует. Тебе на строке " if adoSave<>Nil then begin " компилятор должен предупреждение выдавать что переменная не инициализирована. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.04.2020, 19:21 |
|
||
|
Наполняемость переменной при декларации
|
|||
|---|---|---|---|
|
#18+
rgreat HOME_X, Это старый прикол. Локальные unmanaged переменные компилятор не инициализирует. Тебе на строке " if adoSave<>Nil then begin " компилятор должен предупреждение выдавать что переменная не инициализирована. Таки "мозг почистил" - ошибка таже Код: pascal 1. 2. 3. 4. 5. Старый ? В 32-bit 7-ке такого не было... Это теперь надо отслеживать ВСЕ !!! объекты ? Локальные unmanaged переменные компилятор не инициализирует. Если это поле объекта компилятор дейcтвует аналогично ... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.04.2020, 19:38 |
|
||
|
Наполняемость переменной при декларации
|
|||
|---|---|---|---|
|
#18+
HOME_X, Это всегда было. Значения unmanaged переменных инициализируются в созданных классах и глобальных переменных но не в локальных. Оптимизация! (с) Значение s в твоем примере может быть каким угодно. В том числе и nil если повезет и в памяти по ее адресу лежат нули. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.04.2020, 19:41 |
|
||
|
Наполняемость переменной при декларации
|
|||
|---|---|---|---|
|
#18+
rgreat, Неее - у меня DLL-ка писана под 7-ой (версия не помню точно от какой даты) Работала с этой "ошибкой" лет 5 и не сваливалась. Теперь ее переписываю по 64 - bitа С полями дело обстоит аналогично пример ниже может необходимо где-то ДОнастроить среду разработки ? Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. Спасибо ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.04.2020, 19:51 |
|
||
|
Наполняемость переменной при декларации
|
|||
|---|---|---|---|
|
#18+
HOME_X rgreat, Неее - у меня DLL-ка писана под 7-ой (версия не помню точно от какой даты) Работала с этой "ошибкой" лет 5 и не сваливалась. Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. Скомпилировал на Delphi7. Результат: FALSE. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.04.2020, 20:03 |
|
||
|
Наполняемость переменной при декларации
|
|||
|---|---|---|---|
|
#18+
HOME_X С полями дело обстоит аналогично пример ниже Я вижу что у тебя на форме шлепнут TADOConnection, который естессно не nil изначально, а полноценно инициализированный класс. Удали с формы ADOConnection1: TADOConnection; и добавь только эту строчку в раздел Public и будет тебе Form1.ADOConnection1=nil. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.04.2020, 20:06 |
|
||
|
Наполняемость переменной при декларации
|
|||
|---|---|---|---|
|
#18+
HOME_X rgreat, Неее - у меня DLL-ка писана под 7-ой (версия не помню точно от какой даты) Работала с этой "ошибкой" лет 5 и не сваливалась. Неповезло. Вот такая это сволочная штука - ошибки работы с памятью. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.04.2020, 20:15 |
|
||
|
Наполняемость переменной при декларации
|
|||
|---|---|---|---|
|
#18+
rgreat Скомпилировал на Delphi7. Результат: FALSE. А должно быть TRUE. Глобальные переменные инициализируются всегда, вне зависимости от типа. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.04.2020, 20:56 |
|
||
|
Наполняемость переменной при декларации
|
|||
|---|---|---|---|
|
#18+
Kazantsev Alexey, А в случае основного тела консольного приложения оно локальное или глобальное? А то я сначала сделал пример где кроме этого было тоже самое но в процедуре, но одинаковый результат меня удивил, а потому я процедуру из примера вырезал. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.04.2020, 21:00 |
|
||
|
Наполняемость переменной при декларации
|
|||
|---|---|---|---|
|
#18+
rgreat, Всё что декларируется внутри процедур/функций/методов оно локальное, всё что вне - глобальное. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.04.2020, 21:04 |
|
||
|
Наполняемость переменной при декларации
|
|||
|---|---|---|---|
|
#18+
Kazantsev Alexey, Это не ответ. По крайней мере не совпадающий с объективной реальностью ответ. :) Вообще я вижу "begin end." в теле проекта как этакий особый случай процедуры. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.04.2020, 21:08 |
|
||
|
Наполняемость переменной при декларации
|
|||
|---|---|---|---|
|
#18+
rgreat Это не ответ Это почти дословное цитирование бумажной доки от Delphi 5 ;) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.04.2020, 21:11 |
|
||
|
Наполняемость переменной при декларации
|
|||
|---|---|---|---|
|
#18+
Kazantsev Alexey, Ага, при этом переменные в теле проекта считаются глобальными но при этом не инициализируются. Взаимоисключающие параграфы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.04.2020, 21:12 |
|
||
|
Наполняемость переменной при декларации
|
|||
|---|---|---|---|
|
#18+
rgreat Вообще я вижу "begin end." в теле проекта как этакий особый случай процедуры. Можно проще: лежит на стеке - локальная, лежит в сегменте данных - глобальная. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.04.2020, 21:12 |
|
||
|
Наполняемость переменной при декларации
|
|||
|---|---|---|---|
|
#18+
rgreat Ага, при этом переменные в теле проекта считаются глобальными но при этом не инициализируются. Я на 10.3 проверил - TRUE. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.04.2020, 21:13 |
|
||
|
Наполняемость переменной при декларации
|
|||
|---|---|---|---|
|
#18+
Kazantsev Alexey, В 10.3.3 - да. В D7 - нет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.04.2020, 21:22 |
|
||
|
Наполняемость переменной при декларации
|
|||
|---|---|---|---|
|
#18+
Delphi: МИН НЕТ! Не знаю, соберётся-ли на Delphi 7, но проверь: Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.04.2020, 21:34 |
|
||
|
Наполняемость переменной при декларации
|
|||
|---|---|---|---|
|
#18+
Kazantsev Alexey, Только "System." пришлось убить. Код: plaintext 1. 2. 3. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.04.2020, 21:40 |
|
||
|
Наполняемость переменной при декларации
|
|||
|---|---|---|---|
|
#18+
rgreat Только "System." пришлось убить. Логично :) Результат говорит о том, что переменные декларированные в теле основного модуля являются глобальными. А вот почему семёрка их не обнуляет... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.04.2020, 21:44 |
|
||
|
Наполняемость переменной при декларации
|
|||
|---|---|---|---|
|
#18+
Kazantsev Alexey rgreat Только "System." пришлось убить. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.04.2020, 21:47 |
|
||
|
Наполняемость переменной при декларации
|
|||
|---|---|---|---|
|
#18+
... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.04.2020, 21:59 |
|
||
|
Наполняемость переменной при декларации
|
|||
|---|---|---|---|
|
#18+
Попытал я семёрку - глюк оптимизатора. Отключаешь оптимизацию или берёшь адрес от этой переменной и она сразу становится инициализированной :) Порылся в своём старом коде (2003 год): Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.04.2020, 22:15 |
|
||
|
Наполняемость переменной при декларации
|
|||
|---|---|---|---|
|
#18+
Все переменные класса должны быть инициализированы в конструкторе. Все глобальные переменные должны быть инициализированы в главном блоке begin или же секции initialization. Так же, переменные имеющие ручную инициализацию динамических данных, должны быть уничтожены в ручную в destructor классе, или же finalization секции. И не стоит надеяться на удачную случайность мусора в памяти, для значения переменной. Это Кот Шрёдингера . ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.04.2020, 23:04 |
|
||
|
Наполняемость переменной при декларации
|
|||
|---|---|---|---|
|
#18+
ВсеРазумный, Няшка, тебе череп не жмёт? ВсеРазумный Все переменные класса должны быть инициализированы в конструкторе. 1. Переменные класса - это глобальные переменные. Они инициализируются всегда. 2. Но ты то о полях объекта , а они тоже инициализируются всегда. ВсеРазумный Все глобальные переменные должны быть инициализированы в главном блоке begin или же секции initialization. См. выше про глобальные переменные. ВсеРазумный переменные имеющие ручную инициализацию динамических данных Parser error. У меня фсио ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.04.2020, 23:16 |
|
||
|
Наполняемость переменной при декларации
|
|||
|---|---|---|---|
|
#18+
Kazantsev Alexey 1. Переменные класса - это глобальные переменные. Они инициализируются всегда. 2. Но ты то о полях объекта , а они тоже инициализируются всегда. Однако объект сам себя не создаст. И объекту не нужно в будущем "adoSave<>Nil" проверять на создание. Так как автор не контролирует - то, что у него в программе. И следовательно лепит костыли. Kazantsev Alexey Parser error. Код: pascal 1. 2. 3. 4. 5. Да хоть тот же Код: pascal 1. Является ручной инициализацией динамических данных, вложенных в класс (Например конструктор) который в будущем следует удалить. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.04.2020, 23:59 |
|
||
|
Наполняемость переменной при декларации
|
|||
|---|---|---|---|
|
#18+
Kazantsev Alexey Delphi: МИН НЕТ! Не знаю, соберётся-ли на Delphi 7, но проверь: Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. rgreat Kazantsev Alexey, Только "System." пришлось убить. Код: plaintext 1. 2. 3. Kazantsev Alexey rgreat Только "System." пришлось убить. Логично :) Результат говорит о том, что переменные декларированные в теле основного модуля являются глобальными. А вот почему семёрка их не обнуляет... во вы парни угораете на карантин очень интересно зачем вам понадобилось вывести адреса переменных ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.04.2020, 00:03 |
|
||
|
Наполняемость переменной при декларации
|
|||
|---|---|---|---|
|
#18+
ВсеРазумный Однако объект сам себя не создаст. Однако, речь о дефолтной инициализации переменных. kealon(Ruslan) зачем вам понадобилось вывести адреса переменных Ну дык... Наглядная демонстрация, что стековые переменные находятся далеко от сегмента данных, и интересующая нас переменная лежит именно в сегменте данных. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.04.2020, 00:10 |
|
||
|
Наполняемость переменной при декларации
|
|||
|---|---|---|---|
|
#18+
Kazantsev Alexey Однако, речь о дефолтной инициализации переменных. О какой инициализации идёт речь? Это обычный GetMem + FillChar с определённым StorageSize, а в куче процедур у нас стэк обычный. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.04.2020, 00:49 |
|
||
|
Наполняемость переменной при декларации
|
|||
|---|---|---|---|
|
#18+
ВсеРазумный О какой инициализации идёт речь? О дефолтной. В этом топике. Няшик. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.04.2020, 00:52 |
|
||
|
Наполняемость переменной при декларации
|
|||
|---|---|---|---|
|
#18+
Kazantsev Alexey, Мне кажется вы опять тут занимаетесь ерундой, чистой воды. По этому я вам сейчас подкину интересную магию Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 38307908 Call2 1703720 : 45 Call3 1703720 : 45 38307908 Задаём в функции Call2 переменную Test5454 со значением 45 и вызываем Call3 и выводим значение переменной Test0 Ну а дальше получаем по губе мусором ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.04.2020, 00:56 |
|
||
|
Наполняемость переменной при декларации
|
|||
|---|---|---|---|
|
#18+
ВсеРазумный По этому я вам сейчас подкину интересную магию Это не магия, это основы, о которых тут уже писали . ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.04.2020, 01:14 |
|
||
|
Наполняемость переменной при декларации
|
|||
|---|---|---|---|
|
#18+
Kazantsev Alexey, Усложним пример Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. Global 4356316 : 0 Test = 37980228 Self = 1703704 Test0(Call1) = 1703696 : 40 Test1(Call2) = 1703700 : 1 Test2(Call3) = 1703700 : 1 Test = 37980228 Self = 1703704 Test1(Call2) = 1703628 : 568830241 Test2(Call3) = 1703584 : 37922016 Test0(Call1) = 1703696 : 48 Test2(Call3) = 1703700 : 16777216 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.04.2020, 01:22 |
|
||
|
|

start [/forum/topic.php?all=1&fid=58&tid=2038432]: |
0ms |
get settings: |
5ms |
get forum list: |
11ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
42ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
44ms |
get tp. blocked users: |
1ms |
| others: | 219ms |
| total: | 338ms |

| 0 / 0 |
