Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.09.10;
Скачать: CL | DM;

Вниз

Тест для всех!   Найти похожие ветки 

 
Loginov Dmitry ©   (2006-08-12 12:08) [0]

Обладателей голубых значков просьба смотреть на ответы теста со стороны.
Всем остальным просьба поучаствовать!

Тест очень простой.
Есть код:

 
 with TList.Create do
 try
   List[1] := nil;
 finally
   Free;
 end;

 ShowMessage("Hello World!");
 


Нужно определить, будет ли показан текст "Hello World!".

Delphi и литературу использовать нельзя!

Варианты ответов:
- Да
- Нет


 
Loginov Dmitry ©   (2006-08-12 12:10) [1]

> List[1] := nil;


Сорри,
 Items[1] := nil


 
cyborg ©   (2006-08-12 12:11) [2]

да


 
PZ   (2006-08-12 12:11) [3]

Да


 
VirEx ©   (2006-08-12 12:12) [4]

да!

ПС: я оптимист


 
SerJaNT ©   (2006-08-12 12:20) [5]

Нет, мне кажется List[1] не существует. Будет показано что-то вроде List index out of bouds ...


 
DprYg ©   (2006-08-12 12:26) [6]

Да, согласен что новый экземпляр не инициализирован. Поэтому Items[1] нет. Будет исключение, вызовется Free. А сообщения не будет, поскольку эта процедура будет прервана. А вот если бы ShowMessage до try, то было бы.


 
TUser ©   (2006-08-12 12:28) [7]

Нет. Count = 0, поэтому будет сгенерировано исключение, а finally не убивает его.


 
jack128 ©   (2006-08-12 13:02) [8]

Loginov Dmitry ©   (12.08.06 12:10) [1]
Items[1] := nil

ну.. это даже не интересно.

Вот так лудше:

with TList.Create do
try
  Add(nil);
  List[1] := nil;
finally
  Free;
end;

ShowMessage("Hello World!");


 
TUser ©   (2006-08-12 13:19) [9]

> jack128 ©   (12.08.06 13:02) [8]

Тоже нет.


 
Loginov Dmitry ©   (2006-08-12 13:19) [10]

Просьба отвечать только Да или Нет. Пожалуйста, никаких коментариев!


 
Gero ©   (2006-08-12 13:20) [11]

> [9] TUser ©   (12.08.06 13:19)

Почему нет? Теперь Items[1] будет существовать.


 
Gero ©   (2006-08-12 13:21) [12]

> [8] jack128 ©   (12.08.06 13:02)

В общем, думаю, да.


 
Gero ©   (2006-08-12 13:22) [13]

Ну а насчет сабжа — все расписано в [7].


 
jack128 ©   (2006-08-12 13:30) [14]

Gero ©   (12.08.06 13:20) [11]
Теперь Items[1] будет существовать

Да?


 
StriderMan ©   (2006-08-12 13:35) [15]


> Loginov Dmitry ©   [0]
нет


 
StriderMan ©   (2006-08-12 13:37) [16]


> jack128 ©   (12.08.06 13:02) [8]

тоже не будет сообщения


 
TUser ©   (2006-08-12 13:41) [17]

> Почему нет? Теперь Items[1] будет существовать.

Items[0] будет существовать. Какой там будет размер массива, я не помню - то ли 2, то ли 8. Но Count = 1, а дальше по логике должна быть проверка. Что-то типа

procedure TList.SetItem (Value: pointer; Index: integer);
begin
 if (Index < 0) or (Index >= FCount) then
   raise ...
 FItems[Index] := Value;
end;


 
StriderMan ©   (2006-08-12 13:48) [18]

Это тест для начинающих. давай чего-нить посерьезнее!

вот моя задачка (тоже для нач-их):

var
 o: TObject;
 i: integer;
begin
 o := Tobject.Create;
 i := integer(o);
 o := TObject(i);


вопрос: что будет в пер-ой о и вывалится ли ошибка?


 
Loginov Dmitry ©   (2006-08-12 13:49) [19]

TUser, Gero - спасибо вам большое за то, что знаете ответ на тест. Но зачем нужно было писать пояснения?


 
Loginov Dmitry ©   (2006-08-12 14:00) [20]

> StriderMan ©   (12.08.06 13:48) [18]
> Это тест для начинающих. давай чего-нить посерьезнее!
>
> вот моя задачка (тоже для нач-их):


Вот это как раз не серьезно.

Про try..finally я завел ветку, потому как подозреваю, что далеко не все умеют им правильно пользоваться. Помните, где-то пару месяцев назад была ветка про то, как избежать warning. Было что-то наподобие:

procedure TForm1.Button1Click(Sender: TObject);
var
 List: TStringList;
begin
 try
   List := TStringList.Create;
   List.Add("aaa");
 finally
   List.Free;
 end;
end;


Я ляпнул чушь, что нужно перед try поставить List := nil, и все будет ОК.
Некоторые меня поддержали, в том числе и из мастеров. Аргументированных доводов, что я был не прав, не было вообще.

Вывод - половина форума просто не знает, как пользоваться try..finally

Если кто-нибудь найдет ту ветку (она была в Основной или в Начинающих), дайте ссылку.


 
@BraIN ©   (2006-08-12 14:10) [21]

Т
> Я ляпнул чушь


Дошло :) Ветка лично у меня не сохранилась, хотя учавствовал. Доводы, кстати, были, ближе к концу.


 
@BraIN ©   (2006-08-12 14:11) [22]

учавствовал = участвовал


 
DiamondShark ©   (2006-08-12 14:51) [23]


> Я ляпнул чушь, что нужно перед try поставить List := nil

Но ведь код

constructor TMyClass.Create;
begin
 FList := TStringList.Create;
end;

destructor TMyClass.Destroy;
begin
 FList.Free;
 inherited;
end;

Вы чушью не считаете, верно?


> Вывод - половина форума просто не знает, как пользоваться
> try..finally

А другая половина не понимает, из каких соображений в TObject существует метод Free
;-)

Конечно, случай частный, и крайне антипедагогичный, но на чушь не тянет
;)))


 
jack128 ©   (2006-08-12 15:01) [24]

StriderMan ©   (12.08.06 13:37) [16]
тоже не будет сообщения

ну проверь ;-)

TUser ©   (12.08.06 13:41) [17]
а дальше по логике должна быть проверка. Что-то типа

procedure TList.SetItem (Value: pointer; Index: integer);


разницу между TList.Items[] и TList.List - понимаем? ;-)

А теперь финальный вопрос:

with TList.Create do
try
 Add(nil);
 Capasity := Count;
 List[1] := nil;
finally
 Free;
end;

ShowMessage("Hello World!");


 
SergP ©   (2006-08-12 15:02) [25]

> [0]


Нет.

> [8] jack128 ©   (12.08.06 13:02)


Тоже нет.


 
guav ©   (2006-08-12 15:05) [26]

> Capasity

не скомпилится :-p


 
DprYg ©   (2006-08-12 15:07) [27]

Capacity


 
SergP ©   (2006-08-12 15:11) [28]

> [18] StriderMan ©   (12.08.06 13:48)
> Это тест для начинающих. давай чего-нить посерьезнее!
>
> вот моя задачка (тоже для нач-их):
>
> var
> o: TObject;
> i: integer;
> begin
> o := Tobject.Create;
> i := integer(o);
> o := TObject(i);
>
> вопрос: что будет в пер-ой о и вывалится ли ошибка?


Не вижу причин чтобы ошибки вываливались...
ну а в o соответственно по идее должен быть указатель на созданный экземпляр TObject"а.

или там какие-то "хитрости" ?


 
SergP ©   (2006-08-12 15:14) [29]

> [24] jack128 ©   (12.08.06 15:01)


А что такое  Capasity ? Что-то не припоминаю...


 
guav ©   (2006-08-12 15:17) [30]

capacity - длина массива под список.
[24]  будет мессага Hello World!


 
jack128 ©   (2006-08-12 15:22) [31]

Емкость списка.
with TList.Create do
try
 Capacity := 10; // выделется память под 10 элементов
 //  Теперь ты можешь добавить в список 10 элементов не вызывая при этом перераспределения памяти
 for I := 0 to 9 do
   Add(nil);
 // * а вот сдесь TList вызовит ReallocMem чтобы иметь возможность добавлять новые элементы
 Add(nil);
finally
 Free;
end;


 
Gero ©   (2006-08-12 15:31) [32]

> [14] jack128 ©   (12.08.06 13:30)

Я виноват, я был невнимателен. Сорри.


 
TUser ©   (2006-08-12 16:25) [33]

> jack128 ©   (12.08.06 15:01) [24]

догнал :)


 
Loginov Dmitry ©   (2006-08-12 16:59) [34]

> DiamondShark ©   (12.08.06 14:51) [23]
>
> > Я ляпнул чушь, что нужно перед try поставить List := nil
>
> Но ведь код
>
> constructor TMyClass.Create;
> begin
> FList := TStringList.Create;
> end;
>
> destructor TMyClass.Destroy;
> begin
> FList.Free;
> inherited;
> end;
>
> Вы чушью не считаете, верно?


Не понял, к чему тут это? Единственное, что inherited в Create нет, а в остальном - приличный код.


 
Marser ©   (2006-08-12 19:21) [35]

Да.


 
StriderMan ©   (2006-08-12 20:28) [36]


> jack128 ©   (12.08.06 15:22) [31]

че-т не догнал.

Add(nil) выделит память под один элемент с индексом 0. Items[1]  будет ведь уже за границей массива


 
Юрий Зотов ©   (2006-08-12 20:29) [37]

Заголовок топика неверен. Этот тест - не для всех.


 
StriderMan ©   (2006-08-12 20:35) [38]

А все, понял разницу между .List и .Items


 
Loginov Dmitry ©   (2006-08-12 21:47) [39]

> @BraIN ©   (12.08.06 14:10) [21]

> Дошло :) Ветка лично у меня не сохранилась, хотя учавствовал.
> Доводы, кстати, были, ближе к концу.


Я "воссоздал" ту ветку:
http://matrix.kladovka.net.ru/temp.html

Внушительных доводов я не увидел тогда, я не вижу и сегодня.


 
Loginov Dmitry ©   (2006-08-12 21:49) [40]

> Юрий Зотов ©   (12.08.06 20:29) [37]

> Заголовок топика неверен. Этот тест - не для всех.


Точно. Надо было назвать: "Тест не для всех"


 
DiamondShark ©   (2006-08-12 22:09) [41]

Что-то я запутался совсем. Доводов к чему?
Нормальные там доводы.
Стандартный шаблон:

ЗахватитьРесурс;
try
 ИспользоватьРесурс;
finally
 ОсвободитьРесурс;
end;

Но есть частные случаи. Если отдавать себе отчёт в том, что происходит, то никаких проблем.
Об чём ломание копий?


 
Sistr   (2006-08-12 23:04) [42]

дак эксепшен, соответсвенно код прервется, но потом должен все таки показать, или нет..


 
ssk ©   (2006-08-12 23:10) [43]

>>>Loginov Dmitry
и в чем прикол приведенного кода в [0], собственно?
ну появилось AV у меня после выполнения такого куска

procedure TForm1.Button1Click(Sender: TObject);
begin
 with TList.Create do
   try
     List[1] := nil;
   finally
     Free;
   end;
 ShowMessage("Hello World!");
end;


а дальше-то что? лично я всегда предпочитал писать нормально работающий код без всяких премудростей

З.Ы. в чем смысл топика так и не понял. или тупой (я), или выпитых 3 литра пива мешает думать


 
SergP ©   (2006-08-12 23:11) [44]

>
> ... или выпитых 3 литра пива мешает думать


Да.


 
Ketmar ©   (2006-08-12 23:13) [45]

> [42] Sistr   (12.08.06 23:04)
покажет. но не то. %-)


 
Loginov Dmitry ©   (2006-08-12 23:36) [46]

> ssk ©   (12.08.06 23:10) [43]
>
> З.Ы. в чем смысл топика так и не понял. или тупой (я), или
> выпитых 3 литра пива мешает думать


Смысл в том, чтобы ответить на поставленный вопрос :))


 
Loginov Dmitry_   (2006-08-16 09:23) [47]

Up!

Продолжение :)


with TList.Create do
try
  Items[1] := nil;
  Exit;
finally
  Free;
  ShowMessage("Hello World!");
end;


Вопрос в том же: будет ли показан Hello World!


 
Furyz ©   (2006-08-16 09:26) [48]

> with TList.Create do
> try
>  Items[1] := nil;
>  Exit;
> finally
>  Free;
>  ShowMessage("Hello World!");
> end;

нет


 
Gero ©   (2006-08-16 09:27) [49]

> [47] Loginov Dmitry_   (16.08.06 09:23)

Да.


 
vidiv ©   (2006-08-16 09:31) [50]

Будет... хватит голову морочить!


 
Loginov Dmitry_   (2006-08-16 09:45) [51]

На строку
Items[1] := nil;
внимание не обращайте :)


 
Marser ©   (2006-08-16 12:02) [52]

AFAIR, exit в блоках try..finally не канает. Такшта да.

А с сабжем интересно получается. Отлов в главном трай-экзепт и выход в космос. Не учтено...


 
Romkin ©   (2006-08-16 12:46) [53]

Marser ©   (16.08.06 12:02) [52] Канает. По exit войдет в finally


 
KilkennyCat ©   (2006-08-16 12:47) [54]

> Тест для всех!


и для меня тоже?


 
Marser ©   (2006-08-16 12:57) [55]

> [53] Romkin ©   (16.08.06 12:46)
> Marser ©   (16.08.06 12:02) [52] Канает. По exit войдет
> в finally

Прямое назначение Exit - выход из блока. Из блока try..finally таки не канает - все равно finally выполнится.


 
Loginov Dmitry ©   (2006-08-16 19:40) [56]

> и для меня тоже?


Нет, только для "ВСЕХ". А ты не все, так что можешь ничего не отвечать :))


 
Loginov Dmitry ©   (2006-08-16 19:48) [57]

> Прямое назначение Exit - выход из блока. Из блока try..finally
> таки не канает - все равно finally выполнится.


В том-то и фишка, что секция finally выполняется всегда, причем неважно, чем был прерван блок try (Abort, raise Exception, Exit). Удобно. Не нужно самому заботиться, чтобы объекты были уничтожены до Exit.


 
Loginov Dmitry ©   (2006-08-16 19:51) [58]

Тоесть, если сделать так


procedure TForm1.Button1Click(Sender: TObject);
begin
 with TList.Create do
 try
   Exit;
 finally
   Free;
   ShowMessage("Hello World 1");
 end;

 ShowMessage("Hello World 2");
end;


то показан будет только текст Hello World 1


 
tButton ©   (2006-08-16 19:56) [59]

может быть =)


 
Leonid Troyanovsky ©   (2006-08-16 20:37) [60]


> Loginov Dmitry ©   (16.08.06 19:40) [56]

> > и для меня тоже?

> Нет, только для "ВСЕХ". А ты не все, так что можешь ничего
> не отвечать :))


Да-с, и снова дискриминация. По этим, как их там .. признакам.
Т.е., не для всех, не для голубых(штанов), и т.д.

Хотели как лучше - получили, как обычно-с.

--
Regards, LVT.


 
Loginov Dmitry ©   (2006-08-16 22:18) [61]

> не для всех, не для голубых(штанов), и т.д.


Я думаю, что для многих информация, которую можно почерпнуть из данной ветки просто не представляет ценности (это люди, которым данная информация не нова, и те, которым она не нужна).



Страницы: 1 2 вся ветка

Текущий архив: 2006.09.10;
Скачать: CL | DM;

Наверх




Память: 0.62 MB
Время: 0.053 c
15-1155804379
memo
2006-08-17 12:46
2006.09.10
O... Задача.....


2-1155809951
Alral
2006-08-17 14:19
2006.09.10
Razmer Memo.


8-1140896343
Юра
2006-02-25 22:39
2006.09.10
Проблемы с установкой DSPack


2-1156145493
redlord
2006-08-21 11:31
2006.09.10
hwnd окна из application


2-1156270047
Chort
2006-08-22 22:07
2006.09.10
ProgressBar1