powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Наполняемость переменной при декларации
25 сообщений из 34, страница 1 из 2
Наполняемость переменной при декларации
    #39943654
HOME_X
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Доброго дня господа !

Delphi 10.3.3 (64-ibt)
Заметил такую ИСТИНУ (!!!!????) хотел бы уточнить может оптический обман зрения

В процедуре объявил переменную типа ADOConnection (пока не создал объект Create) и она уже не равна Nil ,

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
var
    adoSave:  TADOConnection;
begin
    ......................................
    ......................................
    if adoSave<>Nil then begin 
      ShowMessage('Not_Nil');
      adoSave.Close;       -- соответственно здесь ошибка
      FreeAndNil(adoSave);
    end;
end


Это новый прикол компилятора ?

Спасибо
...
Рейтинг: 0 / 0
Наполняемость переменной при декларации
    #39943657
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HOME_X,

Это старый прикол.

Локальные unmanaged переменные компилятор не инициализирует.

Тебе на строке " if adoSave<>Nil then begin " компилятор должен предупреждение выдавать что переменная не инициализирована.
...
Рейтинг: 0 / 0
Наполняемость переменной при декларации
    #39943659
HOME_X
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rgreat
HOME_X,

Это старый прикол.

Локальные unmanaged переменные компилятор не инициализирует.

Тебе на строке " if adoSave<>Nil then begin " компилятор должен предупреждение выдавать что переменная не инициализирована.



Таки "мозг почистил" - ошибка таже
Код: pascal
1.
2.
3.
4.
5.
procedure TForm1.Button4Click(Sender: TObject);
var s: TADOConnection;
begin
  if(S=Nil)then ShowMessage('Nil') else ShowMessage('Not Nil')
end;



Старый ?
В 32-bit 7-ке такого не было...
Это теперь надо отслеживать ВСЕ !!! объекты ?

Локальные unmanaged переменные компилятор не инициализирует.
Если это поле объекта компилятор дейcтвует аналогично ...
...
Рейтинг: 0 / 0
Наполняемость переменной при декларации
    #39943660
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HOME_X,

Это всегда было.
Значения unmanaged переменных инициализируются в созданных классах и глобальных переменных но не в локальных.
Оптимизация! (с)

Значение s в твоем примере может быть каким угодно. В том числе и nil если повезет и в памяти по ее адресу лежат нули.
...
Рейтинг: 0 / 0
Наполняемость переменной при декларации
    #39943661
HOME_X
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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.
type
  TForm1 = class(TForm)
   
    ADOConnection1: TADOConnection;
    procedure Button4Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button4Click(Sender: TObject);
var s: TADOConnection;
begin
  s:=Nil;
  if(ADOConnection1=Nil)then ShowMessage('Nil') else ShowMessage('Not Nil')
end;

end.



Спасибо
...
Рейтинг: 0 / 0
Наполняемость переменной при декларации
    #39943667
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HOME_X
rgreat,

Неее - у меня DLL-ка писана под 7-ой (версия не помню точно от какой даты)
Работала с этой "ошибкой" лет 5 и не сваливалась.


Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
program Project1;

{$APPTYPE CONSOLE}

uses
  SysUtils, classes;

var
  x : TObject;
begin
  Writeln(x=nil);
  readln;
end.


Скомпилировал на Delphi7.

Результат: FALSE.
...
Рейтинг: 0 / 0
Наполняемость переменной при декларации
    #39943671
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HOME_X
С полями дело обстоит аналогично пример ниже
Не знаю что у тебя там за пример ниже и что в нем не так.

Я вижу что у тебя на форме шлепнут TADOConnection, который естессно не nil изначально, а полноценно инициализированный класс.

Удали с формы ADOConnection1: TADOConnection; и добавь только эту строчку в раздел Public и будет тебе Form1.ADOConnection1=nil.
...
Рейтинг: 0 / 0
Наполняемость переменной при декларации
    #39943675
northener
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
HOME_X
rgreat,
Неее - у меня DLL-ка писана под 7-ой (версия не помню точно от какой даты)
Работала с этой "ошибкой" лет 5 и не сваливалась.

Неповезло. Вот такая это сволочная штука - ошибки работы с памятью.
...
Рейтинг: 0 / 0
Наполняемость переменной при декларации
    #39943699
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rgreat
Скомпилировал на Delphi7.

Результат: FALSE.

А должно быть TRUE. Глобальные переменные инициализируются всегда, вне зависимости от типа.
...
Рейтинг: 0 / 0
Наполняемость переменной при декларации
    #39943703
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev Alexey,

А в случае основного тела консольного приложения оно локальное или глобальное?

А то я сначала сделал пример где кроме этого было тоже самое но в процедуре, но одинаковый результат меня удивил, а потому я процедуру из примера вырезал.
...
Рейтинг: 0 / 0
Наполняемость переменной при декларации
    #39943706
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rgreat,

Всё что декларируется внутри процедур/функций/методов оно локальное, всё что вне - глобальное.
...
Рейтинг: 0 / 0
Наполняемость переменной при декларации
    #39943708
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev Alexey,

Это не ответ.

По крайней мере не совпадающий с объективной реальностью ответ. :)

Вообще я вижу "begin end." в теле проекта как этакий особый случай процедуры.
...
Рейтинг: 0 / 0
Наполняемость переменной при декларации
    #39943709
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rgreat
Это не ответ

Это почти дословное цитирование бумажной доки от Delphi 5 ;)
...
Рейтинг: 0 / 0
Наполняемость переменной при декларации
    #39943711
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev Alexey,

Ага, при этом переменные в теле проекта считаются глобальными но при этом не инициализируются.

Взаимоисключающие параграфы.
...
Рейтинг: 0 / 0
Наполняемость переменной при декларации
    #39943712
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rgreat
Вообще я вижу "begin end." в теле проекта как этакий особый случай процедуры.

Можно проще: лежит на стеке - локальная, лежит в сегменте данных - глобальная.
...
Рейтинг: 0 / 0
Наполняемость переменной при декларации
    #39943714
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rgreat
Ага, при этом переменные в теле проекта считаются глобальными но при этом не инициализируются.

Я на 10.3 проверил - TRUE.
...
Рейтинг: 0 / 0
Наполняемость переменной при декларации
    #39943716
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev Alexey,

В 10.3.3 - да. В D7 - нет.
...
Рейтинг: 0 / 0
Наполняемость переменной при декларации
    #39943719
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.
program Project1;

{$APPTYPE CONSOLE}

{$R *.res}

uses
  System.SysUtils;

procedure test2;
var
 i : Integer;
begin
 writeln(Integer(@i));
end;
procedure test;
var
 i : Integer;
begin
 test2;
 writeln(Integer(@i));
end;
var
t : Integer;
begin

 writeln(Integer(@datamark));
 writeln(Integer(@t));
 test;
 readln;

end.
...
Рейтинг: 0 / 0
Наполняемость переменной при декларации
    #39943723
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev Alexey,

Только "System." пришлось убить.

Код: plaintext
1.
2.
3.
4231316
4237208
1703760
1703768
...
Рейтинг: 0 / 0
Наполняемость переменной при декларации
    #39943725
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rgreat
Только "System." пришлось убить.

Логично :)

Результат говорит о том, что переменные декларированные в теле основного модуля являются глобальными. А вот почему семёрка их не обнуляет...
...
Рейтинг: 0 / 0
Наполняемость переменной при декларации
    #39943726
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev Alexey
rgreat
Только "System." пришлось убить.
А вот почему семёрка их не обнуляет...
20 лет не прошло даром.
...
Рейтинг: 0 / 0
Наполняемость переменной при декларации
    #39943728
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rgreat,

Учитывая это https://stackoverflow.com/a/134191, ситуация выглядит очень странной.
...
Рейтинг: 0 / 0
Наполняемость переменной при декларации
    #39943736
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Попытал я семёрку - глюк оптимизатора. Отключаешь оптимизацию или берёшь адрес от этой переменной и она сразу становится инициализированной :) Порылся в своём старом коде (2003 год):
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
{$OPTIMIZATION OFF}

//
// Оптимизация должна быть выключена, иначе процедура EnumWndProc
// будет работать неправильно. Вероятно, глюк компилятора Delphi 7
//
// P.S.
// Эта ошибка много крови мне попортила...
//
...
Рейтинг: 0 / 0
Наполняемость переменной при декларации
    #39943749
Все переменные класса должны быть инициализированы в конструкторе. Все глобальные переменные должны быть инициализированы в главном блоке begin или же секции initialization. Так же, переменные имеющие ручную инициализацию динамических данных, должны быть уничтожены в ручную в destructor классе, или же finalization секции.

И не стоит надеяться на удачную случайность мусора в памяти, для значения переменной. Это Кот Шрёдингера .
...
Рейтинг: 0 / 0
Наполняемость переменной при декларации
    #39943751
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВсеРазумный,

Няшка, тебе череп не жмёт?

ВсеРазумный
Все переменные класса должны быть инициализированы в конструкторе.

1. Переменные класса - это глобальные переменные. Они инициализируются всегда.
2. Но ты то о полях объекта , а они тоже инициализируются всегда.

ВсеРазумный
Все глобальные переменные должны быть инициализированы в главном блоке begin или же секции initialization.

См. выше про глобальные переменные.

ВсеРазумный
переменные имеющие ручную инициализацию динамических данных

Parser error.

У меня фсио
...
Рейтинг: 0 / 0
25 сообщений из 34, страница 1 из 2
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Наполняемость переменной при декларации
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]