Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Чтобы локальные переменные в функциях


Страницы:   1 2 3

Бездомный ©   (2011-10-06 13:35:00) 

обнулялись автоматически перед выполнением, есть такая директивка?

Если нет, можно ли как-нибудь написать такую процедурку LocalNullify:

function foo (param1, param2, ... paramN: AnyType1, ...): AnyType;
var
 ... тут неопределенное количество переменных, неопределенного размера ...
begin
 LocalNullify;
 //-- все локальные переменные обнулились, можно работать.
end;


Компилятор же некоторые типы (интерфейсы, динамические массивы) все-таки инициализирует.

P.S. Delphi 7, Delphi XE,XE2


Dennis I. Komarov   (2011-10-06 15:43:00) [41]


> Ega23 ©   (06.10.11 14:28) [16]
> Есть мнение

+1


Ega23   (2011-10-06 14:28:00) [42]


> Да это понятно, но даже с 4 объектами уже будет громоздко.

Есть мнение, что если приходится регулярнопо 4 и более локальных объектов внутри функции-метода создавать то имеет смысл пересмотреть архитектуру.


Ega23   (2011-10-06 14:26:00) [43]


> В новых версиях можно както-то так сделать


Можно. А нафига? С времени создания [0] прошёл почти час, у меня эти нестчастные

Errors := TStringList.Create;
try
 Output := TStringList.Create;
 try
   ProgressForm := TProgressForm.Create;
   try
     Query := TAdoQuery.Create;
     try
        // Do work here
     finally
       Query.Free;
     end;
   finally
     ProgressForm.Free;  
   end;  
 finally
   Output.Free;
 end;
finally
 Errors.Free;
end;


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


Бездомный   (2011-10-06 14:22:00) [44]


> только это всё равно говнокод, в [3] Денис уже написал,
> как надо

Да это понятно, но даже с 4 объектами уже будет громоздко.


Бездомный   (2011-10-06 14:20:00) [45]

В новых версиях можно както-то так сделать, все меньше писать:


with Objects(procedure
 Add(@Errors, TStringList.Create);
 Add(@Output, TStringList.Create);
 ...
end) do
try
 ...
finally
FreeAll;
end;


Ega23   (2011-10-06 14:17:00) [46]


> Бездомный   (06.10.11 14:10) [9]

try
Errors := TStringList.Create;
Output := TStringList.Create;
ProgressForm := TProgressForm.Create; // <- тут исключение
Query := TAdoQuery.Create;
finally
Errors.Free;
Output.Free;
ProgressForm.Free;
Query.Free;  // <- Query остался неизвестно чем из стека.
end;


А нехер конструктор внутри try вызывать.

Errors := TStringList.Create;
Output := TStringList.Create;
ProgressForm := TProgressForm.Create; // <- тут исключение
Query := TAdoQuery.Create;
try
 .....
finally
// В обратном порядке
Query.Free;
ProgressForm.Free;
Output.Free;
Errors.Free;
end;

только это всё равно говнокод, в [3] Денис уже написал, как надо


RWolf   (2011-10-06 14:17:00) [47]

да, надо обнулять.


Бездомный   (2011-10-06 14:11:00) [48]


> RWolf ©   (06.10.11 14:10) [8]

Речь идет о создании нескольких объектов сразу. Если исключение произойдет в TProgressForm.Create, то Errors и Output автоматически не освободятся.


Бездомный   (2011-10-06 14:10:00) [49]


{Errors := nil;
Output:= nil;
ProgressForm := nil;
Query:=nil; -- убрали обнуление}
try
 Errors := TStringList.Create;
 Output := TStringList.Create;
 ProgressForm := TProgressForm.Create; // <- тут исключение
 Query := TAdoQuery.Create;
finally
 Errors.Free;
 Output.Free;
 ProgressForm.Free;
 Query.Free;  // <- Query остался неизвестно чем из стека.
end;


RWolf   (2011-10-06 14:10:00) [50]

Если в конструкторе присходит исключение, автоматически вызывается деструктор.
Зачем все эти try/finally?


Бездомный   (2011-10-06 14:10:00) [51]


> Ega23 ©   (06.10.11 14:04) [6]




{Errors := nil;
Output:= nil;
ProgressForm := nil;
Query:=nil; -- убрали обнуление}
try
Errors := TStringList.Create;
Output := TStringList.Create;
ProgressForm := TProgressForm.Create; // <- тут исключение
Query := TAdoQuery.Create;
finally
Errors.Free;
Output.Free;
ProgressForm.Free;
Query.Free;  // <- Query остался неизвестно чем из стека.
end;


Ega23   (2011-10-06 14:04:00) [52]

Чтобы не писать:

Errors := nil;
Output:= nil;
ProgressForm := nil;
Query:=nil;

А их и не надо писать.


Бездомный   (2011-10-06 13:55:00) [53]


> Dennis I. Komarov ©   (06.10.11 13:54) [3]

Это еще больший ппц, на самом деле =(


Dennis I. Komarov   (2011-10-06 13:55:00) [54]

только finally наоборот :-[


Dennis I. Komarov   (2011-10-06 13:54:00) [55]

Errors := TStringList.Create; try
 Output := TStringList.Create; try
   ProgressForm := TProgressForm.Create; try
     Query := TAdoQuery.Create; try
...
     finally
       Errors.Free;
     end;
   finally
     Output.Free;
   end;
 finally
   ProgressForm.Free;
 end;
finally
Query.Free;
end;


Бездомный   (2011-10-06 13:45:00) [56]


> Ega23 ©   (06.10.11 13:40) [1]

Чтобы не писать:

Errors := nil;
Output:= nil;
ProgressForm := nil;
Query:=nil;
try
 Errors := TStringList.Create;
 Output := TStringList.Create;
 ProgressForm := TProgressForm.Create;
 Query := TAdoQuery.Create;
finally
 Errors.Free;
 Output.Free;
 ProgressForm.Free;
 Query.Free;
end;


Ega23   (2011-10-06 13:40:00) [57]


>  есть такая директивка?


Нет.


> можно ли как-нибудь написать такую процедурку LocalNullify:


А нафига?


Страницы:   1 2 3

Наверх

Титульная страница Поиск, карта сайта Написать письмо