Головна сторінка
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;

Все саме в такому порядку, як я написав. Може, теж написати "за що я не люблю Тейксера і Пачеко" за прикладом деяких шанованих людей? :)

PS Думаю, валити на неграмотний переклад не варто ... Невже перекладачі код змінили?



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.91 MB
Час: 0.094 c
4-1098815215
antonioxxx
2004-10-26 22:26
2004.12.12
Дві миші в системі


9-1092393665
kas-t
2004-08-13 14:41
2004.12.12
[GLScene]: Проблеми з GLFullScreenViewer


4-1099122248
Сигізмунд
2004-10-30 11:44
2004.12.12
Як нйті мітку диска?


1-1101704042
Dreamse
2004-11-29 07:54
2004.12.12
Проблема з TreeView


14-1100769647
ІМХО
2004-11-18 12:20
2004.12.12
Гіркий життєвий досвід ...





африкаанс албанський арабська вірменин азербайджанець баскський білоруський болгарська каталонський Китайська (спрощене письмо) Китайський традиційний) хорватський чеська данську мову нідерландський Ukranian естонець Філіппінська фінську мову французький
галісійська грузинський німецький грецький гаїтянський креольський давньоєврейську хінді угорський ісландський індонезієць ірландський італійський японський корейський латиська литовець македонець малайський мальтійський норвежець
перс полірування португальська румунський російська сербський словацький словенський іспанська суахілі шведську мову тайський турецька український урду в'єтнамський валлійський ідиш бенгальський боснійський
кебуано есперанто гуджараті хауса хмонг ігбо яванський каннада кхмерская Лао латинь маорі маратхі монгольський непальська панджабі сомалійський тамільська телугу йоруба
зулуський
Англійська Французький Німецький Італійський Португальська Русский Іспанська