Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Наполняемость переменной при декларации / 25 сообщений из 34, страница 1 из 2
03.04.2020, 19:18
    #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
03.04.2020, 19:21
    #39943657
rgreat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Наполняемость переменной при декларации
HOME_X,

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

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

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

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

Значение s в твоем примере может быть каким угодно. В том числе и nil если повезет и в памяти по ее адресу лежат нули.
...
Рейтинг: 0 / 0
03.04.2020, 19:51
    #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
03.04.2020, 20:03
    #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
03.04.2020, 20:06
    #39943671
rgreat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Наполняемость переменной при декларации
HOME_X
С полями дело обстоит аналогично пример ниже
Не знаю что у тебя там за пример ниже и что в нем не так.

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

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

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

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

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

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

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

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

Это не ответ.

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

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

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

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

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

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

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

В 10.3.3 - да. В D7 - нет.
...
Рейтинг: 0 / 0
03.04.2020, 21:34
    #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
03.04.2020, 21:40
    #39943723
rgreat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Наполняемость переменной при декларации
Kazantsev Alexey,

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

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

Логично :)

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

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

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

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

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

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

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

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

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

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

Parser error.

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


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