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

Вниз

Интересный пример кода в Тейксера и Пачеко   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.031 c
1-1101724057
Bobby Digital
2004-11-29 13:27
2004.12.12
Panel


8-1094651546
SNV888
2004-09-08 17:52
2004.12.12
проигрывание MOD файлов


1-1101751486
Elast
2004-11-29 21:04
2004.12.12
Класс с TList


1-1101551535
Артем Владимирович
2004-11-27 13:32
2004.12.12
Как стереть самого себя


14-1101187794
Tramadol
2004-11-23 08:29
2004.12.12
Лесь Подеревлянский