Форум: "Потрепаться";
Текущий архив: 2004.12.12;
Скачать: [xml.tar.bz2];
ВнизИнтересный пример кода в Тейксера и Пачеко Найти похожие ветки
← →
Piter © (2004-11-23 22:19) [0]Вот раньше не замечал, а тут заметил. "Delphi 6 для разработчиков", русское издание, стр. 290:
GlobalData^.S := "ShareLib";
GlobalData^.I := 1;
if GlobalData = nil then begin
CloseHandle(MapHandle);
RaiseWin32Error;
end;
Все именно в таком порядке, как я написал. Может, тоже написать "за что я не люблю Тейксера и Пачеко" по примеру некоторых уважаемых людей? :)
P.S. Думаю, валить на неграмотный перевод не стоит... Неужели переводчики код изменили?
← →
app © (2004-11-23 22:29) [1]Здесь переводчики не причем. Ну напиши, но только разбей на две части, ошибки в коде и концептуальные ошибки.
← →
Гаврила © (2004-11-23 22:31) [2]Бывает.
Я вот в Тенцере нашел такой шедевр :
MyObject:=TMyObject.Create;
if MyObject = nil then .....
← →
Agent13 © (2004-11-23 22:36) [3]Да уж, переводчики точно ни причём. В английском варианте на с. 281 точно такой же код :)
← →
Игорь Шевченко © (2004-11-23 22:36) [4]Piter © (23.11.04 22:19)
Раздел и главу скажи (по темам, а не по номеру), я в D5 посмотрю, у меня под рукой
← →
Anatoly Podgoretsky © (2004-11-23 22:39) [5]6 глава, можешь не проверять я проверил код на СД, это просто не отлаженый пример, ясно, что эти две строки должны быть после end;
← →
Anatoly Podgoretsky © (2004-11-23 22:44) [6]Игорь Шевченко © (23.11.04 22:36) [4]
В D5 это 9 глава там тоже самое. Пример ShareLib
← →
Юрий Зотов © (2004-11-23 23:36) [7]Если приложение многопоточное и переменная GlobalData доступна нескольким потокам, то все нормально. Поскольку после исполнения оператора GlobalData^.I := 1 ничто не мешает другому потоку асинхронно уничтожить данные по адресу GlobalData и очистить сам указатель.
← →
Piter © (2004-11-23 23:59) [8]Гаврила © (23.11.04 22:31) [2]
Я вот в Тенцере нашел такой шедевр :
MyObject:=TMyObject.Create;
if MyObject = nil then .....
и что здесь неправильного? Или после then что-то следует, что обращается к MyObject?
Юрий Зотов © (23.11.04 23:36) [7]
Уничтожить данные по адресу GlobalData - ЭТО КАК? Очистить переменные совсем? :)
И более того - ОЧИСТИТЬ УКАЗАТЕЛЬ GlobalData?! Каким образом?
← →
Гаврила © (2004-11-24 00:04) [9]
> [8] Piter
> и что здесь неправильного?
Неправильно то, что
1. либо конструктор прошел без исключений, и переменная инициализирована нормально
2. либо в конструкторе произогло исключение, и переменная не инициализирована(автоматом был вызван деструктор). Но в этом случае мы никогда не попадем на след. после вызова конструктора строку кода.
то есть не может быть ситуации, когда MyObject = nil после конструктора, и когда мы попали на эту строку
← →
GuAV © (2004-11-24 00:09) [10]Гаврила © (24.11.04 0:04) [9]
А тут тоже [7] - потоки :-)
← →
Piter © (2004-11-24 02:43) [11]Игорь Шевченко © (23.11.04 22:36) [4]
как прокомментируете? Я ведь говорил, что ошибки в книгах - это просто по невнимательности и не могут однозначно говорить об уровне автора...
← →
Ega23 © (2004-11-24 11:16) [12]то есть не может быть ситуации, когда MyObject = nil после конструктора, и когда мы попали на эту строку
AFAIK, если MyObject был равен nil ДО вызова конструктора, то он останется nil после ошибки в конструкторе.
← →
Sandman25 © (2004-11-24 11:22) [13][12] Ega23 © (24.11.04 11:16)
Но на строку с проверкой тогда не попадем.
← →
Ega23 © (2004-11-24 11:28) [14]А, ну да... Там же без try...
← →
KSergey © (2004-11-24 11:35) [15]> [12] Ega23 © (24.11.04 11:16)
> AFAIK, если MyObject был равен nil ДО вызова конструктора,
> то он останется nil после ошибки в конструкторе.
Ошибок в конструкторе не бывает. Бывают только исключения. А при их наличии до строки с проверкой дело не дойдет.
← →
Юрий Зотов © (2004-11-24 12:20) [16]> Piter © (23.11.04 23:59) [8]
> Уничтожить данные по адресу GlobalData - ЭТО КАК? Очистить
> переменные совсем? :)
Это вызвать Dispose или FreeMem - в зависимости от того, чем память под эти данные ранее выделялась (New или GetMem).
> И более того - ОЧИСТИТЬ УКАЗАТЕЛЬ GlobalData?! Каким образом?
GlobalData := nil
← →
Игорь Шевченко © (2004-11-24 12:34) [17]Piter © (24.11.04 02:43) [11]
Я уже прокомментировал. На "Королевстве Delphi"
http://www.delphikingdom.com/asp/viewitem.asp?catalogid=1082
← →
Alx2 © (2004-11-24 12:36) [18]>Юрий Зотов © (24.11.04 12:20)
А разве так безопасно?
← →
Rem © (2004-11-24 13:10) [19]>>Если приложение многопоточное и переменная GlobalData доступна нескольким потокам, то все нормально... ничто не мешает другому потоку асинхронно уничтожить данные по адресу GlobalData и очистить сам указатель.
Вряд ли проверка сделана с учетом многопоточности приложения. Такие участки в многопоточном приложении защищаются критическими секциями, как минимум. Иначе первые две строки в приведенном примере будут явно небезопасными.
Мое мнение - простая опечатка. Хотя, если судить строго, в изданиях подобного уровня опечаток быть не должно.
← →
Agent13 © (2004-11-24 13:54) [20]
> Мое мнение - простая опечатка. Хотя, если судить строго,
> в изданиях подобного уровня опечаток быть не должно.
Ну почему? Все мы люди :) И опечатки могут быть где угодно. Другой дело, что это уже было в 5 версии, а в 6 не исправили. Вот этого то уже допускаться не должно.
← →
Юрий Зотов © (2004-11-24 13:59) [21]> Alx2 © (24.11.04 12:36) [18]
Нет, конечно. Скорее всего, Rem [19] прав.
← →
Piter (ne doma) (2004-11-24 15:53) [22]
> Это вызвать Dispose или FreeMem - в зависимости от того,
> чем память под эти данные ранее выделялась (New или GetMem).
там был проецируемый в память файл...
> > И более того - ОЧИСТИТЬ УКАЗАТЕЛЬ GlobalData?! Каким образом?
>
> GlobalData := nil
это где сделать? В другом потоке что ли?!
Вот вырезка:
GlobalData^.S := "ShareLib";
GlobalData^.I := 1;
if GlobalData = nil then begin
CloseHandle(MapHandle);
RaiseWin32Error;
end;
то есть, когда присваивали значения структуре, находящейся по указателю - НИЧЕГО НЕ ПРОВЕРЯЛИ. А ПОТОМ вдруг решили проверить, ожидая что между этими командами другой поток изменит GlobalData? :)))
← →
Piter © (2004-11-24 17:59) [23]Гаврила © (24.11.04 0:04) [9]
class function TMyObject.Create: TMyObject;
begin
Result := nil;
end;
:))))
← →
Kerk © (2004-11-24 18:11) [24]Ну ведь это просто ошибка в коде! Чего все так возбудились?
← →
Piter © (2004-11-24 19:33) [25]Игорь Шевченко © (24.11.04 12:34) [17]
Я уже прокомментировал. На "Королевстве Delphi"
нигде не вижу, чтобы вы говорили о Тейксере и Пачеко...
Страницы: 1 вся ветка
Форум: "Потрепаться";
Текущий архив: 2004.12.12;
Скачать: [xml.tar.bz2];
Память: 0.5 MB
Время: 0.042 c