Форум: "Прочее";
Текущий архив: 2006.09.10;
Скачать: [xml.tar.bz2];
ВнизТест для всех! Найти похожие ветки
← →
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]
> Заголовок топика неверен. Этот тест - не для всех.
Точно. Надо было назвать: "Тест не для всех"
Страницы: 1 2 вся ветка
Форум: "Прочее";
Текущий архив: 2006.09.10;
Скачать: [xml.tar.bz2];
Память: 0.54 MB
Время: 0.039 c