Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Потрепаться";
Текущий архив: 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.037 c
3-1100089389
Term
2004-11-10 15:23
2004.12.12
QReport как сделать в отчёте промежуточные итоги


14-1101125952
WondeRu
2004-11-22 15:19
2004.12.12
Прехват функций COM-интерфейсов


1-1101608873
noob
2004-11-28 05:27
2004.12.12
Event


14-1101056005
K@M
2004-11-21 19:53
2004.12.12
Широковещание


3-1100224787
kostan
2004-11-12 04:59
2004.12.12
Отлов в InterBase DeadLock через OnUpdateError не помогает





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский