Форум: "Потрепаться";
Текущий архив: 2004.08.22;
Скачать: [xml.tar.bz2];
Вниз
Delphi + pointer = ? Найти похожие ветки
← →
Kurtevich (2004-08-03 12:38) [0]Вымораживает то, как Дельфя обращается с указателями: когда вызываешь хваленый TObject.Free, он обьект-то освобождает, но переменная все еще на что-то указывает, и проверка obj<>nil возвращает true, со всеми вытекающими отсюда Access Violations... Поэтому приходится всякий раз писать obj.Free; obj := nil;, а это напряжно... Больше всего бесит, что когда вызываешь Obj.Free, который нахваливают за то, что он проверяет obj на nil, он все равно дает AccessViolation если obj=nil, поэтому приходится писать if obj<>nil then obj.Free;
Вобщем, мой вопрос короткий: WHY!?!?! И что вы обо всем этом думаете?
← →
TUser © (2004-08-03 12:40) [1]FreeAndNil
или
.Free;
:=nil;
← →
Kurtevich (2004-08-03 12:41) [2]Удалено модератором
Примечание: Не ругаться
← →
Sergey_Masloff (2004-08-03 12:42) [3]>поэтому приходится писать if obj<>nil then obj.Free;
слабо глянуть в текст Free()?
Есть метод FreeAndNil() если так уж лень писать myVar := nil;
← →
KSergey © (2004-08-03 12:44) [4]> [2] Kurtevich (03.08.04 12:41)
> > FreeAndNil
> п...ц! а это не то, что я уже написал в вопросе?
Нет, про ф-цию FreeAndNil ты не упоминал.
> Больше всего бесит, что когда вызываешь Obj.Free, который
> нахваливают за то, что он проверяет obj на nil, он все равно
> дает AccessViolation если obj=nil
Вранье наглое.
← →
Sergey_Masloff (2004-08-03 12:45) [5]Кстати объяснение весьма прозаичное - откуда объект может знать что там на него указывает? Он знает какую память занимает он и высвобождает ее по команде. То есть делает что в его силах.
← →
TUser © (2004-08-03 12:45) [6]Удалено модератором
← →
KSergey © (2004-08-03 12:46) [7]> Kurtevich (03.08.04 12:38)
> но переменная все еще на что-то указывает
Разумеется! А разве ее кто-то чистил?? Или как всегда на всемогущего Пушкина надежда?
← →
ламер © (2004-08-03 12:46) [8]я думаю, что надо просто хорошо продумывать алгоритм. и не будет тогда таких глупых проблем.
создание объекта - работа с ним - уничтожение. и всё. если ПРАВИЛЬНО пользоваться механизмом обработки исключительных ситуаций, то никаких проверок на nil даже не надо производить.
← →
Kurtevich (2004-08-03 12:47) [9]
> слабо глянуть в текст Free()?
а смысл туда смотреть? и так понятно, что там написаноif self<>nil then free();
только вот если self=nil то до проверки внутри этой процедуры дело не доходит... Error! Access violation at address 0x000! Would you like to send report to microsoft corp.?!
← →
TUser © (2004-08-03 12:48) [10]А гляньте в втеку про логи. Если объекты создаются, уничтожаются, потом опять создаются и так много раз - то надо проверять.
← →
Kurtevich (2004-08-03 12:48) [11]
> если ПРАВИЛЬНО пользоваться механизмом обработки исключительных
> ситуаций, то никаких проверок на nil даже не надо производить.
интересно... а можно конкретизировать?
← →
KSergey © (2004-08-03 12:49) [12]> [9] Kurtevich (03.08.04 12:47)
> а смысл туда смотреть? и так понятно, что там написано
> if self<>nil then free();
А вот посмотрел бы - и увидел, что все не так :) Впрочем, можно не смотреть - и так понятно, что не так.
А ошибка у тебя в другом совсем месте, уверяю.
← →
Игорь Шевченко © (2004-08-03 12:52) [13]
> Вымораживает то
Греться надо.
> когда вызываешь хваленый TObject.Free, он обьект-то освобождает,
> но переменная все еще на что-то указывает, и проверка obj<>nil
> возвращает true, со всеми вытекающими отсюда Access Violations...
>
Так и задумано
> Больше всего бесит, что когда вызываешь Obj.Free, который
> нахваливают за то, что он проверяет obj на nil, он все равно
> дает AccessViolation если obj=nil
Руки выпрями. Помогает.
← →
Kurtevich (2004-08-03 12:52) [14]
> А вот посмотрел бы - и увидел, что все не так
вот странно - посмотрел, а все оказалось именно так! правда вместо free destroy - я конечно это и имел ввиду, просто привычка на автопилоте всегда писать Free... суть от этого не меняется
> А ошибка у тебя в другом совсем месте, уверяю.
да нет у меня вобще никакой ошибке ни в каком месте... просто я не понимаю на хрена рекомендовать этот free как совершенно безопасный, если он ни хрена не работает?!
← →
ламер © (2004-08-03 12:58) [15]> Kurtevich (03.08.04 12:48) [11]
> интересно... а можно конкретизировать?
например:
try
MyObj := TMyObj.Create;
try
// если дошли до этого места, то объект создан.
MyObj.DoSomeWork;
// ...
finally
// были какие-либо исключения при работе или нет - объект
// будет уничтожен.
MyObj.Free;
end;
except
// ошибка создания объекта. память освобождается автоматически
// и ничего уничтожать не надо.
end;
а теперь моё большое имхо. если в процессе работы, приходится проверять, создан объект или нет, значит сам алгоритм написан неверно.
← →
KSergey © (2004-08-03 13:03) [16]> [14] Kurtevich (03.08.04 12:52)
> правда
> вместо free destroy ... суть от этого
> не меняется
Ага, конечно, не меняется
Толи работаем дальше, толи циклимся по полной :)
> я не понимаю на хрена рекомендовать этот free как совершенно
> безопасный, если он ни хрена не работает?!
Это кто, интересно, такое сказал? Покажите пальцем, плиз.
А вообще - есть правила работы с инструметном (дельфи). Работайте в рамках этих правил - и все будет здорово. Инструмент, увы, для другого просто не предназначен. С этим придется мириться.
> [15] ламер © (03.08.04 12:58)
А внешний try/except зачем? Для комментария? Или просто привычка все сообщения об ошибках давить? :)
← →
ламер © (2004-08-03 13:06) [17]> KSergey © (03.08.04 13:03)
> А внешний try/except зачем? Для комментария? Или просто
> привычка все сообщения об ошибках давить? :)
для комментария, т.к. это общий пример.
← →
KSergey © (2004-08-03 13:08) [18]Мне почему-то кажется, что в общем примере это как раз лишнее...
А вообще мне наиболее нравится такой общий пример (хотя и не всегда реализуемо по причине совпадения имен методов/свойств)with TMyObj.Create do
try
...
finally
Free;
end;
← →
Digitman © (2004-08-03 13:09) [19]
> не понимаю на хрена рекомендовать этот free как совершенно
> безопасный, если он ни хрена не работает?!
все прекрасно работает
и рекомендация эта относится к методу объекта, который знать ничего не знает и знать не может и не должен о том, сколько переменных, ссылающихся на него, ты сподобился наплодить в своей программе ! Этот метод НЕ ОБЯЗАН вычищать за тобой то, что ты САМ обязан делать, если это требуется по твоей логике
← →
TUser © (2004-08-03 13:12) [20]Внешний - для обработок ошибок в конструкторе.
← →
ламер © (2004-08-03 13:12) [21]> KSergey © (03.08.04 13:08) [18]
просто бывают такие случаи, что работа должна продолжиться, невзирая на то, было ли исключение при создании объекта. да и вывести сообщение понятным для пользователя языком тоже не помешает.
← →
Kurtevich (2004-08-03 13:19) [22]
> try
> MyObj := TMyObj.Create;
> try
> // если дошли до этого места, то объект создан.
> MyObj.DoSomeWork;
неужели?.. непонятны всего несколько моментов:
а) какое исключение может сгенерироваться в конструкторе обьекта? то есть я не спорю, теоретически-то может (смотря у кого какие конструкторы), хотя в таком случае я и без всяких двойных try пойму что что-то не так :)
б) а если (и это более естественный случай) создание обьекта и его использование расположены по разным процедурам, а не в одном try... except statement?
в) на кой ... мне вобще какя-то проверка в данном случае?
вобщем, утверждение
> если в процессе работы, приходится проверять, создан объект
> или нет, значит сам алгоритм написан неверно
не доказано
← →
Kurtevich (2004-08-03 13:23) [23]
> Ага, конечно, не меняется
> Толи работаем дальше, толи циклимся по полной :)
как я уже сказал, насчет free я просто обшибся, смысл был в том, что надо обьект уничтожается если Self<>nil, поэтому суть не меняется.
при чем здесь сколько переменных я наплодил? зачем проверять self, если раз уж мы добрались внутрь процедуры, то self есть? ... его не может не быть :)
← →
Anatoly Podgoretsky © (2004-08-03 13:23) [24]Проверка переменной на нил говорит о попытке повторного использования этой переменной, в правильно написаной программе этого быть не должно, говорит о недостатках дизайна, подлежит переписыванию.
← →
Sergey_Masloff (2004-08-03 13:24) [25]Kurtevich (03.08.04 13:19) [22]
>а) какое исключение может сгенерироваться в конструкторе >обьекта? то есть я не спорю, теоретически-то может (смотря у >кого какие конструкторы), хотя в таком случае я и без всяких >двойных try пойму что что-то не так :)
Невозможность выделения какого-либо ресурса по причине отсутствия самого ресурса или прав на его использование
>б) а если (и это более естественный случай) создание обьекта и >его использование расположены по разным процедурам, а не в >одном try... except statement?
Что. Создал и отдал значение указателя. Тот кто взял отвечает за его высвобождение. Твоя задача - если то что собираешься отдавать не создал по тем или иным причинам - корректно верни nil
в) на кой ... мне вобще какя-то проверка в данном случае?
← →
Digitman © (2004-08-03 13:28) [26]
> раз уж мы добрались внутрь процедуры, то self есть? ...
> его не может не быть
может !! считывается значение "битой" ссылки из переменной и прямой ссылкой передается как неявный параметр Self
← →
ламер © (2004-08-03 13:31) [27]> Kurtevich (03.08.04 13:19) [22]
а) любое. EInOutError, EOutOfMemory, EOutOfResources и т.д. и т.п.
б) значит либо: 1) у вас жутко нетривиальный случай, 2) неверный алгоритм.
в) для нормального продолжения работы.
> вобщем, утверждение не доказано
ой, да я и не собираюсь никому ничего доказывать. это просто моё имхо. за всё время моей работы с дельфи такие случаи (с созданием/уничтожением в разных местах) возникали всего пару раз в результате выбора неверной стратегии. и при удачной перепланировке я всегда получал более интуитивно понятный и надёжный алгоритм.
← →
Kurtevich (2004-08-03 13:32) [28]jesus... недостатки дизайна, подлежит переписыванию... что за гониво?
а если у меня есть процедура, в которую как параметр передается указатель на обьект, разве это плохой стиль программирования - прежде всего проверить, что бы он был valid?! откуда я знаю что происходило вовне этой процедуры - может система упала и забрала всю память с собой, а осталась висеть только моя прога на обугленных останках монитора... всякое бывает!
и что, повторное использование переменных - это плохо?! я не сомневаюсь что проффессиональные программисты обьявляют новую переменную каждый раз, когда им че-то надо... но это ж заманаться можно! :)
← →
Digitman © (2004-08-03 13:35) [29]
> система упала и забрала всю память с собой
бред сивой кобылы
> не сомневаюсь что проффессиональные программисты обьявляют
> новую переменную каждый раз, когда им че-то надо
тоже чушь
← →
ламер © (2004-08-03 13:35) [30]> Kurtevich (03.08.04 13:32) [28]
да, параметр в процедуре - это вариант, в котором действительно иногда бывает необходима проверка. чаще всего можно просто избежать вызова процедуры с указателем на несозданный объект.
← →
Anatoly Podgoretsky © (2004-08-03 13:36) [31]Ну если тебе тяжело, то переквалифицируйся в дворники, но и они сейчас работают со сложной техникой.
← →
ламер © (2004-08-03 13:38) [32]>если раз уж мы добрались внутрь процедуры, то self есть? его не может не быть :)
Self используется только для вызова виртуальных методов. т.к. Free - невиртуальный, то для его можно вызвать даже так:
TObject(nil).Free;
причём никаких исключений данный вызов не породит :)
← →
Kurtevich (2004-08-03 13:43) [33]
> бред сивой кобылы
согласен. так и замышлялось :)
> TObject(nil).Free;
а вот это я попробую!
> Self используется только для вызова виртуальных методов
то есть, если я правильно понял, я могу вызывать методы несозданного обьекта?! типаTMYObject(nil).ConnectToMicrosoftComAndDeleteAllData
???
весело... или эттот прикол распространяется только на TObject? вобще дельфя конечно умеет повеселить своими скрытыми возможностями :)
← →
Kurtevich (2004-08-03 13:44) [34]i wonder, на фиг вобще создавать обькты, когда дельфя открывает такие горизонты в ООП!?!
← →
Anatoly Podgoretsky © (2004-08-03 13:45) [35]Есди это классовый метод (класса) то можешь, а если это метод объекта то нет, поскольку нет объекта.
← →
Sergey Kaminski © (2004-08-03 13:49) [36]Kurtevich (03.08.04 13:32) [28]
> а если у меня есть процедура, в которую как параметр передается
> указатель на обьект, разве это плохой стиль программирования -
> прежде всего проверить, что бы он был valid?! откуда я знаю что
>происходило вовне этой процедуры
Да, в общем случае, это неважный стиль программирования. И вот почему.
Передача неверного параметра в процедуру ДОЛЖНА вызывать исключение внутри этой процедуры. При этом желательно, чтобы там даже не было подавления Exception. Тогда внешняя процедура легко может отследить (по возникшему эксепшену), что что-то пошло не так.
← →
Kurtevich (2004-08-03 13:51) [37]я понял, люди, в чем источник нашего взаимонедопонимания!!!
вы слишком обращаете внимание на мелочи вроде того, что я написал free вместо destroy, спровоцировав тем самым рекурсивно бесконечную дисфункцию %(, или на то, что система якобы может забрать у меня всю память (ah jesus it"s a monstrous system from outer space!!!), хотя все это не важно в контексте смысла проблемы.
а теперь более конкретный вопрос: если я напишуdestructor TMyObject.Destroy();
begin
inherited;
Self := nil;
end;
чё будет?!... только не надо, пожалуйста писать "запусти, увидишь сам", или "хочешь фокус: я запускаю этот код на твоей машине и смотрю как плавится клавиатура..."... вопрос на самом деле серьезный :)
← →
ламер © (2004-08-03 13:52) [38]>Anatoly Podgoretsky © (03.08.04 13:45) [35]
> Есди это классовый метод (класса) то можешь, а если это метод
> объекта то нет, поскольку нет объекта.
не совсем так. я, например, для создания форм в ран-тайм использую:
type
TfrmOption = class (TForm)
...
public
procedure Call;
end;
...
procedure TfrmOption.Call;
begin
Application.CreateForm(TfrmOption, frmOption);
try
frmOption.ShowModal;
finally
frmOption.Release;
end;
end;
← →
Kurtevich (2004-08-03 13:54) [39]
> Есди это классовый метод (класса) то можешь, а если это
> метод объекта то нет, поскольку нет объекта.
%-( ооо, раздуплите меня пожалуйста.... я ни черта не понял в вышесказанном!
если я правильно понимаю ООП, то обект - это инициализированная переменная типа класс...
если предположить, что здесь имеется в виду, что метод класса - это когда обьект не создан, то в данном случае никаккого "если" быть не должно!
← →
Sergey_Masloff (2004-08-03 13:56) [40]Kurtevich (03.08.04 13:51) [37]
Ты считаешь ЭТО
destructor TMyObject.Destroy();
begin
inherited;
Self := nil;
end;
мелочи?!
Что ты вообще этим кодом хотел сделать?
← →
Sergey Kaminski © (2004-08-03 13:57) [41]Он предполагает, что после этого все переменные, в которых есть ссылка на объект будут равны nil. :)
← →
ламер © (2004-08-03 13:57) [42]> Kurtevich (03.08.04 13:51) [37]
> destructor TMyObject.Destroy();
> begin
> inherited;
> Self := nil;
> end;
да ничего не будет. ты присвоишь параметру Self значение nil. область видимости Self - лишь текущий метод (в данном случае деструктор).
← →
Digitman © (2004-08-03 14:00) [43]
> если я правильно понимаю ООП, то обект - это инициализированная
> переменная типа класс
неправильно понимаешь
объект - это структурированная запись
переменная же объектного типа - это именованая область данных, предназначенная для хранения ссылки на объект
> Self := nil;
> end;
> чё будет?!... вопрос
> на самом деле серьезный :)
ничё не будет... глупость просто будет ... значение Self в контексте исполняющегося метода некоего объекта используется для получения ссылки на самого себя, не более того
← →
Sergey_Masloff (2004-08-03 14:01) [44]ламер © (03.08.04 13:57) [42]
Не надо говорить если не знаешь
← →
Kurtevich (2004-08-03 14:01) [45]хорошо. ладно. насчет self я прогнал. не подумавши.
только вот все-таки насчет этих самых методов, которые можно вызывать без создания обьекта... если позволите так выразиться, как отличить метод класса от метода обьекта?
← →
ламер © (2004-08-03 14:03) [46]> Sergey_Masloff (03.08.04 14:01) [44]
> ламер © (03.08.04 13:57) [42]
> Не надо говорить если не знаешь
ну так просветите меня. в чём я неправ?
← →
Digitman © (2004-08-03 14:06) [47]
> как отличить метод класса от метода обьекта?
посмотреть как декларирован этот метод в декларации класса, которому метод принадлежит
> насчет этих самых методов, которые можно вызывать без создания
> обьекта
любой статический метод класса можно вызвать без создания экз-ра этого класса ... другое дело, что если в теле метода осущ-ся обращение к полям тек.экз-ра, то AV неминуем
← →
Kurtevich (2004-08-03 14:06) [48]Удалено модератором
← →
Kurtevich (2004-08-03 14:08) [49]
> посмотреть как декларирован этот метод в декларации класса,
> которому метод принадлежит
ну-ну, и... продолжайте-с, пожалуйста... :)
← →
Sergey Kaminski © (2004-08-03 14:12) [50]class procedure X;
class function Y: Byte;
← →
Игорь Шевченко © (2004-08-03 14:13) [51]
> как отличить метод класса от метода обьекта?
по слову class перед объявлением, не так ли ?
← →
Anatoly Podgoretsky © (2004-08-03 14:16) [52]ламер © (03.08.04 13:52) [38]
Хоть у тебя и не объявлено методом класса, но по сути таким является. Создание объекта не требуется.
← →
Kurtevich (2004-08-03 14:18) [53]
> по слову class перед объявлением, не так ли ?
ого, ни фига себе... кто бы мог подумать... только вот TObject.Free без такой фишки обьявлен! - а веть речь шла об этом!
то есть все еще получается, что я могу вызвать любой статический метод класса без создания обьекта?TMyObject(NIL).KissTheSystem();
← →
Digitman © (2004-08-03 14:18) [54]
> какого ... это вобще может значить???
то и значит, что экз-р класса представляет собой не что иное как запись, структуру ... разницы между тем что из себя изнутри представляют собой экз-ры TMyType = class и TMyType = record фактически нет
> именованная область данных
да, представь себе ! переменная - это (по определению) именованая (!) область данных
> jesus my ass
просто-таки блеск остроумия ! ... ты бы лучше прислушался к тому, что тебе говорят, чем "щеголять" никчемным набором слов
← →
Anatoly Podgoretsky © (2004-08-03 14:19) [55]Суть твоих претензий, что тебе на нравится как реалихован язык, это легко поправимо, переходишь на другой язык, но что то мне подсказывает, что и там подобное будет.
← →
Kurtevich (2004-08-03 14:20) [56]на самом деле всё это совершенно неправильно, и если бы Страусструп был здесь, он бы такого бы не допустил!!! :)
нельзя вызывать методы класса без создания обьекта, это очень WRONG! это уже получается не метод, а просто глобальная процедура, которую зачем-то запихнули в обьвление класса!
← →
Sergey_Masloff (2004-08-03 14:21) [57]ламер © (03.08.04 14:03) [46]
>ну так просветите меня. в чём я неправ?
Я похож на адепта храма просвящения? Пишется код из трех строк ставится брейкпойнт и View->DebugVindow->CPU
посмотри как в @ClassDestroy
mov edx,[eax]
call dword ptr [edx-$08]
и вспомни как пару шагов назад ты сделал (Self := nil)
xor eax,eax
any comment?
← →
ламер © (2004-08-03 14:21) [58]> Anatoly Podgoretsky © (03.08.04 14:16) [52]
> ламер © (03.08.04 13:52) [38]
> Хоть у тебя и не объявлено методом класса, но по сути таким
> является. Создание объекта не требуется.
возможно, я и ошибаюсь, но в классовые методы параметром Self передаётся не ссылка на объект, а ссылка на класс. в данном же случае будет передаваться ссылка именно на объект (nil, если объект не создан).
← →
Kurtevich (2004-08-03 14:23) [59]
> то и значит, что экз-р класса представляет собой не что
> иное как запись, структуру ... разницы между тем что из
> себя изнутри представляют собой экз-ры TMyType = class и
> TMyType = record фактически нет
ну, это еже звучит гораздо лучше, чем
> объект - это структурированная запись
> просто-таки блеск остроумия !
спасибо :) стараюсь :))
← →
Anatoly Podgoretsky © (2004-08-03 14:23) [60]ламер © (03.08.04 14:21) [58]
А какая тебе разница, раз ты ей не пользуешься?
← →
KSergey © (2004-08-03 14:27) [61]>Kurtevich
ООП в дельфи и Си++ несколько отличается. В том числе вот этими моментами. В Си++ нет классовых ф-ций и проч. Даи само понятие класса трактуется несколько иначе
В дельфи же можно даже ссылку на класс забабахать. В С++ - нельзя (непосредственнно в языке), из-за чего в С++ нет (не имеют смысла) виртуальных конструкторов.
← →
Kurtevich (2004-08-03 14:30) [62]
> KSergey © (03.08.04 14:27) [61]
дык я ж и говорю, что Дельфи изнасиловала ООП и даже не поцеловала :)
а насчет ссылки на класс - в C++ есть метаклассы, если мне не изменяет память.... хотя может йих добрый дядя Борланд придумал?
← →
Sergey_Masloff (2004-08-03 14:32) [63]Kurtevich (03.08.04 14:30) [62]
>что Дельфи изнасиловала ООП и
чушь. ООП <> С++ (или OOP != Cpp - как угодно)
← →
Kurtevich (2004-08-03 14:34) [64]
> ООП <> С++ (или OOP != Cpp - как угодно)
:) круто... только я не понял, причем здесь это? я и не говорил что ООП=С++ или что Дельфи изнасиловала С++...
← →
Digitman © (2004-08-03 14:34) [65]
> нельзя вызывать методы класса без создания обьекта, это
> очень WRONG!
можно ... именно методы класса - можно ... методы же объекта некоего класса - можно, но осторожно
и Борланд, дав нам такую замечательную гибкость, вовсе не обязан был действовать с оглядкой на какого-то там Kurtevich"а, который, видите ли, трясется от одной только мысли, что не сможет из-за Борланда контролировать времена жизни объектов, им же, Kurtevich"ем, потенциально создаваемых
← →
Anatoly Podgoretsky © (2004-08-03 14:37) [66]Digitman © (03.08.04 14:34) [65]
Вот только какой-то там Kurtevich"а, с этим не согласен, но продолжается пользоваться этим языком.
Ежики плакали, кололись, но продолжали есть кактус.
← →
Kurtevich (2004-08-03 14:39) [67]
> можно ... именно методы класса - можно ... методы же объекта
> некоего класса - можно, но осторожно
:) я говорю нельзя не в смысле что невозможно, а в смысле что это неправильно, некрасиво, пошло в конце концов! и дело не в том, что я "трясусь", а как раз в том, что так просто неправильно!
насчет "замечательной гибкости"... эх, лучше бы дядя Борланд дал нам гибкость иметь конструкторы по умолчанию и возможность иметь статические обьекты, а не только указатели, или inline процедуры, или... много чего еще... гибкость... %(
← →
Kurtevich (2004-08-03 14:45) [68]
> какой-то там Kurtevich"а, с этим не согласен, но продолжается
> пользоваться этим языком
эх, я ждал, когда же наконец кто-то это скажет! да, каюсь, я очень недоволен Дельфи, но продолжаю им пользоваться.. почему? а почему многие недовольны Виндой, но пользуются ею? или почему многие не любят холод и снег, но зачем-то даже зимой в метель выходят на улицу? или кого-то бесит, что автомобиль приходится заправлять бензином, но он все равно упорно на нем ездит? да потому что НАДО ТАК! и никуда от этого не денешься, но это не значит, что если ты чем-то пользуешься, то ты должен сидеть и радоваться "ах, какая хорошая вещь! она идеальна!"... неужели вам, о великие мастера, ВСЁ нравится в Дельфи? если так, то может вы мало с ней работали? (прошу не рассматривать последнюю фразу как намек на чей-либо непрофессионализм)
← →
Algol (2004-08-03 14:46) [69]
> Kurtevich (03.08.04 14:30) [62]
> дык я ж и говорю, что Дельфи изнасиловала ООП и даже не
> поцеловала :)
Чего-то я не пойму. Вы хотите сказать что статические методы класса это отход от ООП ??
Да вы посмотрите на современный framework от майкрософта, там статические методы используются на каждом шагу, и гораздо шире чем в Делфе...
← →
Думкин © (2004-08-03 14:48) [70]> [56] Kurtevich (03.08.04 14:20)
> на самом деле всё это совершенно неправильно, и если бы
> Страусструп был здесь, он бы такого бы не допустил!!! :)
Ну вот. Как всегда кривостьв одном ищется в другом. И в фидо также. Еслия пишу криво, то надо переписать Дельфи нафик, полностью.
← →
Kurtevich (2004-08-03 14:49) [71]
> Algol (03.08.04 14:46) [69]
не знаю, что вы подразумеваете под статическими методами класса, но если то же, что и я, то я совсем не об этом говорил, а об том, что в Дельфи типа можно вызывать методы класса без создания обьекта. а что такое framework я все рано не знаю (ах, несчастныя я ламер! :"-( )
← →
Digitman © (2004-08-03 14:52) [72]
> это неправильно, некрасиво, пошло
ты вообще чего в Паскаль-то приехал ? в Паскале (неважно в каком !) неоднозначности и неопределенности не допускаются в принципе ! Ну и пиши себе на СРР, коль тебе так нравится ! Что ты здесь "разсиплюплювался"-то ?
Паскаль-компилятор работает по однопроходной схеме, многие фичи иных языков в нем попросту нереализуемы (да и за ненадобностью они зачастую) или чрезвычайно сложно реализуемы, но зато Паскаль-компилятор дает несравнимый выигрыш и по производительности компиляции и по предсказуемости поведения скомпилированного кода в ран-тайм
> inline процедуры
таких - полна котомка в system.pas, и этого вполне предостаточно для подавляющего большинства "нужд"
> конструкторы по умолчанию
> статические обьекты
да мало ли чего еще нет ! зато есть многое другое
← →
Kurtevich (2004-08-03 14:52) [73]
> Ну вот. Как всегда кривостьв одном ищется в другом. И в
> фидо также. Еслия пишу криво, то надо переписать Дельфи
> нафик, полностью.
блин, ну причем тут что я криво пишу?... мне от этих "методов класса" или как вы их там называете ни холодно ни жарко в процессе программирования... блин, вы хоть думайте, что пишете! я ж ругаюсь не потому, что уменя что-то не работает! прочитайте все эти посты от начала, я ХОТЬ РАЗ сказал, что из-за нехорошей дельфи у меня прога не компилируется, БЛИН!!!??
← →
Думкин © (2004-08-03 14:54) [74]> [73] Kurtevich (03.08.04 14:52)
Я понимаю, и чел в фидо писал также. Но если проблем нет, то в чем они есть?
← →
Kurtevich (2004-08-03 14:55) [75]
> Паскаль-компилятор работает по однопроходной схеме, многие
> фичи иных языков в нем попросту нереализуемы
дык в данном случае это как раз фича ПАСКАЛЯ, которой НЕТ в других языках!
← →
KSergey © (2004-08-03 14:57) [76]Жаловался, что работает не так, как ожидал, а так, как ее скомпилировал поганый компилятор.
> конструкторы по умолчанию
А зачем они, если объякты всегда явно создаются в коде программы, в отличии от С++???
Вообще, надо понять важное отличие: в дельфи нет переменный-объектов. Есть только ссылки на объекты (читай - указатели).
← →
Digitman © (2004-08-03 14:58) [77]
> Kurtevich (03.08.04 14:55) [75]
> это как раз фича ПАСКАЛЯ
фича-то эта не на пустом месте растет !
фича эта накладывает определенные ограничения, которых не имеют некие иные языки и многопроходные компиляторы этих языков
← →
Kurtevich (2004-08-03 14:58) [78]
> Думкин © (03.08.04 14:54) [74]
я не чел в фидо, а если бы вы разобрались, о чем тут идет речь, то стало бы ясно: проблема всего-навсего в том, что я начал ругаться на дельфи за то, что она позволяет такую ФИЧУ, которую как типа-ООП-шная среда не должна бы позволять... и дело не в том, что от этого у меня винда глючит или кофе остывает, просто это... ну некрасиво, и всё тут! это все равно что трансвестит, когда ты думаешь что он девушка, а он на самом деле нет! :)
← →
Anatoly Podgoretsky © (2004-08-03 15:00) [79]Сказал, начиная с самого первого сообщения.
Типичный засланец.
← →
Digitman © (2004-08-03 15:03) [80]
> позволяет такую ФИЧУ, которую как типа-ООП-шная среда не
> должна бы позволять
где ? где это регламентировано ? какими документами ?
твои собственные вокруг-да-около инсинуации - это не регламентирующий документ
← →
Kurtevich (2004-08-03 15:03) [81]
> KSergey © (03.08.04 14:57) [76]
важное отличие я прекрасно понимаю, и как раз им и недоволен!
зачем конструкторы по умолчанию?... щаз расскажу!
предположим я хочу создать класс TString, который бы инкапсулировал все возможности стринга, только работал бы скажем... с массивами чар. понятно, мне было бы неудобно постоянно вызывать конструкторы и деструкторы когда мне надо пользоваться переменными этого типа, и именно поэтому я и не могу так сделать в Дельфи! потому что она не вызывает автоматически конструкторы по умолчанию, и в ней нельзя иметь статические переменные типа класс - т.е. именно то, что в ООП называется обьектом. вот...
← →
KSergey © (2004-08-03 15:05) [82]> [81] Kurtevich (03.08.04 15:03)
Еще раз объясняю: этого просто не предусмотрено. Однако функциональности это не ущемляет никоим образом.
← →
Kurtevich (2004-08-03 15:05) [83]что это я
> Сказал, начиная с самого первого сообщения.
???? процитируй!
ругаться совсем необязательно, и обижаться тоже - мы не маленькие дети! (во всяком случае я надеюсь :))
← →
Sandman25 © (2004-08-03 15:05) [84]Мне все это напоминает ветку про
Button: TButton;
Button := TButton(TEdit.Create(nil));
if Button is TButton
Тоже жаловались, что компилятор слишком умный и некрасиво делает
← →
Sergey Kaminski © (2004-08-03 15:06) [85]Добрый дядя Борланд... Произносится с шутливым ужасом. Вроде: Добрый дяди Билл.... Что поделаешь:
-- Жиды-с.
Kurtevich (03.08.04 14:52) [73]
> мне от этих "методов класса" или как вы их там называете ни холодно ни жарко в процессе программирования...
В этом тоже ДЯДЯ виноват?
Насоздаете объектов в одном месте, уничтожаете в другом, называете это тривиальным случаем... А потом дядя виноват, не важно в чем, в том, что Free "кривое" или в другом.
← →
Sergey Kaminski © (2004-08-03 15:07) [86]> Sandman25 © (03.08.04 15:05) [84]
Один к одному, точно :))
← →
Kurtevich (2004-08-03 15:08) [87]
> Еще раз объясняю: этого просто не предусмотрено. Однако
> функциональности это не ущемляет никоим образом
интересно, а тот самый пример, который я привел - это не ущемление функциональности? если в ООП-языке можно обьявить класс, а потом обращаться с ним как с простым типом данных, не думая ни о каких конструкторах - это ли не функциональность?
← →
Digitman © (2004-08-03 15:08) [88]
> статические переменные типа класс .. в ООП называется обьектом
бред сивой кобылы
← →
Kurtevich (2004-08-03 15:10) [89]
> Kurtevich (03.08.04 14:52) [73]
> > мне от этих "методов класса" или как вы их там называете
> ни холодно ни жарко в процессе программирования...
>
> В этом тоже ДЯДЯ виноват?
а это что было? женская логика? обьясняю на пальцах: "ни холодно ни жарко" = "все равно"; кто здесь в чем виноват?
← →
Digitman © (2004-08-03 15:11) [90]
> Kurtevich
дальнейшие прения по сабжу бессмысленны, пока ты не приведешь свое определение и понимание "статической переменной"
← →
Sergey Kaminski © (2004-08-03 15:13) [91]> Kurtevich (03.08.04 15:10) [89]
Объясняю на пальцах:
Дядя не виноват, что вы не используете методы класса.
← →
Sergey Kaminski © (2004-08-03 15:14) [92]> Kurtevich (03.08.04 15:10) [89]
А то, что именно вы используете, вы уже показали.
← →
Игорь Шевченко © (2004-08-03 15:14) [93]
> это уже получается не метод, а просто глобальная
> процедура, которую зачем-то запихнули в обьвление класса!
Для статических и классовых методов - абсолютно верно.
← →
Kurtevich (2004-08-03 15:15) [94]
> Digitman © (03.08.04 15:08) [88]
где здесь бред сивой кобилы??? в том, что вы, ув. Digitman, не знаете что такое обьект??? обьсняю на пальцах основы ООП абстрагируясь от каких-бы-то-ни-было языков и средств:
КЛАСС = структурированный ТИП данных
ОБЪЕКТ = переменная типа КЛАСС
где здесь бред??? уже даже борланд отошол от object pascal и принял эту терминологию, за тем лишь исключением, что у них
ОБЪЕКТ = УКАЗАТЕЛЬ на переменную типа КЛАСС
блин, сколько можно гнать?... на фиг придираться к ками-то мелким словам? больше придраться не к чему?
← →
Игорь Шевченко © (2004-08-03 15:18) [95]В потрепаловку пора :)
Delphi - отстой и насилие над ООП.
← →
Sergey Kaminski © (2004-08-03 15:19) [96]
> обьсняю на пальцах основы ООП
Это лучше Борланду "на пальцах" объясните, может он чего не понял
← →
Игорь Шевченко © (2004-08-03 15:22) [97]
> если в ООП-языке можно обьявить класс, а потом обращаться
> с ним как с простым типом данных, не думая ни о каких конструкторах
> - это ли не функциональность?
Эт язык надо менять.
Я же не удивляюсь тому, что Delphi мне прогноз погоды не выдает при запуске, хотя не мешало бы...
Или препроцессора не имеет...
← →
Sergey_Masloff (2004-08-03 15:27) [98]Игорь Шевченко © (03.08.04 15:18) [95]
>Delphi - отстой и насилие над ООП.
Не то слово. Я бы даже сказал аЦтой ;-)
← →
Игорь Шевченко © (2004-08-03 15:30) [99]Sergey_Masloff (03.08.04 15:27) [98]
Я кажется понял - это такая форма агитации за C#. Охаивать другие языки.
← →
Digitman © (2004-08-03 15:31) [100]
> Kurtevich (03.08.04 15:15) [94]
бред конечно !
ООП как концепция вообще не дает никаких определений, как и где хранится реальный объект и какова его связь с какими-то там "переменными"
то что ты в CPP написал где-то строчку MYCLASS myobj, вовсе не означает, что obj - это именно статическая переменная и что размер этой переменной в памяти совпадает с размером структуры, определенной структурой класса MYCLASS
поэтому я и задал тебе вопрос - ЧТО есть, по твоему, статическая переменная типа КЛАСС ?
← →
Kurtevich (2004-08-03 15:33) [101]ничего я не охиваю, ёпрст! да что вы все такие обидчивые? для вас Дельфи, это что - святыня какая-то? стоит только указать на какой-нибудь недостаток, тут же охаивать, агитация... вы меня еще вражеским агентом или террористом-маньяком назовите! никто вобще даже не понимает о чем речь идет, только плачутся, что их любимую дельфу аскарбили, аЦтоем обозвали!... короче, i"m outta here... всем спасибо за интересно убитый рабочий день :))
← →
Digitman © (2004-08-03 15:36) [102]
> Kurtevich
ну что ж ты так позорно ретируешься-то ?
ответь уж на вопрос мой последний) .. он вовсе не про Делфи)
← →
Игорь Шевченко © (2004-08-03 15:37) [103]
> никто вобще даже не понимает о чем речь идет
Ну почему же никто ? Все понятно, не первый случай на этом сайте :)
← →
вразлет © (2004-08-03 15:39) [104]Что -то снобов тут развелось...В реале за такой тон разговора вообще -то яйца отрывают. Сами себе не противны?
← →
Игорь Шевченко © (2004-08-03 15:45) [105]вразлет © (03.08.04 15:39) [104]
http://ln.com.ua/~openxs/articles/smart-questions-ru.html
> В реале за такой тон разговора вообще
Оторви себе и успокойся
← →
вразлет © (2004-08-03 15:45) [106]Игорь Шевченко ©
От локтя.
← →
Kurtevich (2004-08-03 15:46) [107]
> Digitman © (03.08.04 15:36) [102]
хм... на последний вопрос? ну разве что на последний... это на этот?
> ЧТО есть, по твоему, статическая переменная типа КЛАСС ?
что ж, признаюсь, я понятия не имею, что она реально из себя представляет, какой ее размер и так далее.... мне важно только то, что, как и любая другая статическая переменная, она автоматически создается и уничтожается в сфере своей видимости, и поэтому я могу использовать ее как переменную любого другого типа, хоть бы интеджер, совершенно не думая и может даже не ЗНАЯ, что это обьект! - а это и есть настоящее ООП! и дело не в том, что я трясусь, или у меня что-то не работает, просто это оччень удобно! вот и все!
особо оскорбленным желающим оторвать мне яйца большой привет! :) если бы я откладывал по рублю каждый раз, когда слышал подобное... :) whatever, всем удачи! :)
← →
KSergey © (2004-08-03 15:49) [108]> [101] Kurtevich (03.08.04 15:33)
> стоит только
> указать на какой-нибудь недостаток,
Вы указываете не на недостатки.
Вы указываете на отсутствие тех приемов, к которым привыкли в других языках.
Что никак не связано с дельфи. НИКАК.
Да, вначале было некоторое недопонимание, вам разъяснили. Чего еще говорить-то?
Но если вы изучите Delphi Language нормально - то, поверьте, потом ьудете говорить "Эх, вот в дельфи это было так удобно...".
Так что немного лучше помолчите, обдумайте.
Вот и все. Говорить, вообще-то, уже не о чем.
← →
Игорь Шевченко © (2004-08-03 15:55) [109]
> мне важно только то, что, как и любая другая статическая
> переменная, она автоматически создается и уничтожается в
> сфере своей видимости, и поэтому я могу использовать ее
> как переменную любого другого типа
В Delphi все объекты динамические. Хорошо это или плохо - судить не берусь, но это свойство языка. Не нравится - можно всегда перейти на другой язык.
Например, в Delphi нету множественного наследования, что тоже не всегда удобно, но это не повод говорить что Delphi изнасиловало ООП. Просто нету его, такого наследования. Ведь не удивляет тот факт, что в микроскоп неудобно на звезды смотреть, правда ?
← →
DiamondShark © (2004-08-03 15:57) [110]Это сериал? "IS возвращается"?
← →
KSergey © (2004-08-03 15:57) [111]> [109] Игорь Шевченко © (03.08.04 15:55)
> Ведь не удивляет тот факт, что в микроскоп неудобно на звезды
> смотреть, правда ?
Но возмущает!
← →
Sergey Kaminski © (2004-08-03 16:02) [112]> Это сериал? "IS возвращается"?
Однозначно. Только там яйца не рвали.
← →
KSergey © (2004-08-03 16:03) [113]> [112] Sergey Kaminski © (03.08.04 16:02)
> > Это сериал? "IS возвращается"?
>
> Однозначно. Только там яйца не рвали.
Ужас.. Что же будет в следующий раз??!!
Куда мир катится.. :((
← →
Digitman © (2004-08-03 16:11) [114]
> Kurtevich (03.08.04 15:46) [107]
вот теперь наконец-то видно, что ты откровенно плаваешь в понятиях статики и динамики ... и ни ООП ни языки здесь ни при чем .. ты попросту не представляешь себе действия компилятора/линкера, когда речь идет о статике или динамике
то что ты объявил где-то в подпрограмме идентификатор MYCLASS myobj, совершенно не означает, что переменная myobj есть статическая переменная
статической переменной является та переменная, память под которую выделяется статически, в секции данных, на этапе иниц-ции процесса.. время жизни статической переменной равно времени жизни процесса ..
память же под все прочие переменные выделяется уже в ран-тайм, в куче или в стеке (в зависимости от контекста объявления), поэтому такие переменные статическими НЕ являются, ВНЕ зависимости от того, какого они типа
← →
noname_ (2004-08-03 16:20) [115]Вопрос к Kurtevich как к ценителю и знатоку c++
есть c++ код
MyObject* a;
MyObject* b;
a = new MyObject;
b = a;
delete a;
test_exists(b);
что мне написать в функции test_exists чтобы узнать - существует передаваемый в нее объект или нет?
← →
iZEN © (2004-08-03 22:58) [116]/**Kurtevich (03.08.04 14:20) [56]
на самом деле всё это совершенно неправильно, и если бы Страусструп был здесь, он бы такого бы не допустил!!! :)
нельзя вызывать методы класса без создания обьекта, это очень WRONG! это уже получается не метод, а просто глобальная процедура, которую зачем-то запихнули в обьвление класса!
*/
Тогда уж имеет смысл намекнуть создателям языка Java об их неправоте относительно одного из ключевых классов пакета java.lang
public final class Math extends Object,
в котором все методы - СТАТИЧЕСКИЕ, то есть методы класса, выражаясь терминами ObjectPascal.
Но только делайте это в мягкой форме, иначе пошлют...
← →
iZEN © (2004-08-03 23:15) [117]Похоже автор топика путает ссылки и объект.
← →
Некрофил-затейник__ (2004-08-04 06:54) [118]noname_
Delete высвобождает обьект
MyObject;<---Это то массив, класс, структура, void*,целое так обозвали?
конкретнее можно?
а еще лучше обьясни что делает эта функция в Дельфи?
var
return:boolean;
begin
if(NoError)then
begin
Make;
Fill;
Clear;
SetTransactions;
Repaint;
return := true;
end
else
begin
MakeKorection(x);
return := false;
MessageBox("error","Change user",0,0);
end;
Result := return;
end;
← →
Некрофил-затейник__ (2004-08-04 07:01) [119]Kurtevich
imho
Дельфи это священная корова/*на этом форуме во всяком случае*/
по мойму это еще с 199х годов пошло когда еще на дельфе ничего
особо не делалось все делалось на с но дельфины в столь юном
возврасте во всю пытались доказать что с отстой у них получилось
навязать стереотип и любой выпад в сторону дельфи считают
личным оскорблением вот и матерятся ....
noname_
Кстати MyObject опиши конструктор и деструктор если это класс
← →
noname_ (2004-08-04 09:30) [120]2 Некрофил-затейник__
MyObject это класс.
Компилирующийся пример:
class MyObject
{
int f;
};
bool test_exists(MyObject* t)
{
return false;
}
int main()
{
MyObject* a;
MyObject* b;
bool e;
a = new MyObject;
b = a;
delete a;
e = test_exists(b);
}
Что нужно написать в test_exists вместо "return false" чтобы функция возвращала true если объект t существует и false если он разрушен?
← →
Мастер © (2004-08-04 09:34) [121]Вот погодите, Куртевич вернется, он вам всем покажет, где раки зимуют.
← →
Некрофил-затейник__ (2004-08-04 09:35) [122]noname_
что нужно вписать в обьявление класа что бы он уничтожался?
ДЕСТРУКТОР ГДЕ?
← →
Игорь Шевченко © (2004-08-04 10:07) [123]
> ДЕСТРУКТОР ГДЕ?
В книжках по программированию. Читай и воздастся тебе.
← →
Юрий Зотов © (2004-08-04 10:17) [124]Просто наблюдение.
Много раз слышал, как ругают Delphi и за то, и за се, отстой, масдай, инструмент для ламеров - и прочая, и прочая.
И каждый раз из слов ругающего вытекало одно и то же - что он просто-напросто не знает Delphi. Соответственно, и не понимает, а что же это такое.
То есть, человек пытается оценивать то, о чем не имеет сколько-нибудь серьезного понятия. Ну, примерно, как я бы взялся судить матч боксеров-профессионалов.
Видимо, безграмотно судить о Delphi, безопаснее, чем боксеров - вот и лезут дилетанты в эксперты. А от людей, которые действительно знают и понимают, что такое Delphi (включая и приверженцев Си) я еще ни разу не слышал ругани в ее адрес. Критику - да слышал. Но по делу, в спокойном тоне, и без всяких масдаев-отстоев.
Г-н Kurtevich, Вы не подскажете мне, как программисты называют воинствующих невежд? Слово такое у них есть, специальное...
← →
вразлет © (2004-08-04 10:22) [125]Юрий Зотов ©
То есть, человек пытается оценивать то, о чем не имеет сколько-нибудь серьезного понятия. Ну, примерно, как я бы взялся судить матч боксеров-профессионалов.
Это когда Вы перепутали братьев Кличко?)
← →
Юрий Зотов © (2004-08-04 10:26) [126]> вразлет © (04.08.04 10:22) [125]
Было такое. Сламерствовал. Что и признал в итоге. Так ведь?
← →
вразлет © (2004-08-04 10:29) [127]Юрий Зотов ©
Воистину)
← →
Anatoly Podgoretsky © (2004-08-04 10:31) [128]Юрий Зотов © (04.08.04 10:26) [126]
Теперь тебе Кличко пожизненно :-)
← →
Sandman25 © (2004-08-04 10:32) [129][128] Anatoly Podgoretsky © (04.08.04 10:31)
Хорошо, что не Ламер :)
← →
Яод (2004-08-04 10:39) [130]Kurtevich
Напиши свою среду, где менеджер памяти будет отслеживать все переменные, ссылающиеся на ячейки памяти и соответсвенно инициализировать и очищать правильно и тогда посмотрим, где еще тот гемморой
← →
KSergey © (2004-08-04 11:00) [131]> [122] Некрофил-затейник__ (04.08.04 09:35)
> что нужно вписать в обьявление класа что бы он уничтожался?
Ничего.
> ДЕСТРУКТОР ГДЕ?
Зачем он здесь? Явный деструктор?
← →
Игорь Шевченко © (2004-08-04 11:13) [132]Яод (04.08.04 10:39) [130]
> Напиши свою среду, где менеджер памяти будет отслеживать
> все переменные, ссылающиеся на ячейки памяти и соответсвенно
> инициализировать и очищать правильно и тогда посмотрим,
> где еще тот гемморой
Уже все давно написано.
← →
Igorek © (2004-08-04 12:06) [133]Влом читать всю ветку. Я напр. не понимаю, какой смысл оставлять возможность существования битых ссылок.
Обьясните мне, когда нужна битая ссылка?
Если никогда, то и метод Free юзеру не нужен. Пусть бы его спрятали и выставили только FreeAndNil.
---
Сам я никогда Free не использую - только FreeAndNil.
← →
Sandman25 © (2004-08-04 12:08) [134][133] Igorek © (04.08.04 12:06)
1. Зачем обнулять локальную ссылку?
2. А если я не храню ссылки на объекты?
← →
noname_ (2004-08-04 12:27) [135]2 Igorek
FreeAndNil обнулит только одну ссылку, что делать если на один объект ссылается несколько переменных?
← →
Igorek © (2004-08-04 12:45) [136]
> Sandman25 © (04.08.04 12:08) [134]
> [133] Igorek © (04.08.04 12:06)
>
> 1. Зачем обнулять локальную ссылку?
> 2. А если я не храню ссылки на объекты?
Эти вопросы не являются ответами по сути на поставленный вопрос. Это ответы на вопрос "когда не надо обнулять ссылку?".
На самом деле обнуление занимает децл времени.
И если не будет Free, то имеем:
+ почти невозможно создать битую ссылку
- незначительное замедление
Плюс намного больше минуса по абс. величине.
> noname_ (04.08.04 12:27) [135]
> 2 Igorek
> FreeAndNil обнулит только одну ссылку, что делать если на
> один объект ссылается несколько переменных?
Ну да, тут FreeAndNil не поможет. Он и не может помочь во всех случаях. В приведенном случае можно рекоммендовать стандартную двустороннюю связку - все ссылки на обьект напр. содержатся в классах, перед удалением все связки обрываются и ссылки обнуляются.
← →
cyborg © (2004-08-04 12:48) [137]Mov EAX,ECX
Объясните, зачем мне нужно перемещать данные из регистра в регистр, если в регистре EAX может быть выжная информация? Нафиг ещё какой-то PUSH делать, а потом ещё и POP, ламеризм какой-то, если мне надо всего лишь в регистр перегнать данные? Ассамблер для ламеров!
← →
Sandman25 © (2004-08-04 12:49) [138][136] Igorek © (04.08.04 12:45)
Плюса нет, если в нужным местах пользоваться FreeAndNil.
Минус остается.
← →
KSergey © (2004-08-04 12:50) [139]> [136] Igorek © (04.08.04 12:45)
Читай
а) всю ветку, а то рискуешь попасть в клоуны наравне с автором
б) до посинения [120] noname_ (04.08.04 09:30), пока не поймешь, что это бред и н соответствует истине:
> И если не будет Free, то имеем:
> + почти невозможно создать битую ссылку
← →
Игорь Шевченко © (2004-08-04 12:51) [140]
> Сам я никогда Free не использую - только FreeAndNil.
Никогда не говори "никогда"
← →
Anatoly Podgoretsky © (2004-08-04 13:31) [141]Igorek © (04.08.04 12:06) [133]
FreeAndNil Борланд ввела для ламеров, пошла даже на нарушение строгой типизации.
← →
Юрий Зотов © (2004-08-04 13:55) [142]> Igorek © (04.08.04 12:06) [133]
> Обьясните мне, когда нужна битая ссылка?
Никогда, естественно.
> Если никогда, то и метод Free юзеру не нужен. Пусть бы его
> спрятали и выставили только FreeAndNil.
Например, существует вот такая часто используемая конструкция:
with TMyObject.Create do
try
...
finally
Free
end;
И как здесь уничтожит объект, если нет Free, а есть только FreeAndNil? Что передавать в параметре?
А вообще, программист просто обязан САМ следить за корректностью своих ссылок. Неважно, относятся ли они к объектам, или к чему-либо еще. Культуру кодинга и правила работы с динамической памятью еще никто не отменял, и Delphi - не исключение.
← →
Anatoly Podgoretsky © (2004-08-04 13:58) [143]Юрий Зотов © (04.08.04 13:55) [142]
Про [141] рассказывал кто то из TeamB, это из того что мол за хрень это Free, не обнуляет гад ссылки и еще и AV вызывает
← →
Sergey Kaminski © (2004-08-04 14:03) [144]Anatoly Podgoretsky © (04.08.04 13:58) [143]
не обнуляет гад ссылки и еще и AV вызывает
ничто не ново... :)
← →
KSergey © (2004-08-04 14:08) [145]> [143] Anatoly Podgoretsky © (04.08.04 13:58)
Можно было написать и по-китайски.
Я бы понял не больше.
← →
noname_ (2004-08-04 14:29) [146]по поводу конструкции TObject(nil).Free не дающей покоя автору ветки, сейчас проверил
#include <stdio.h>
class c1
{
public:
void DoSomething(void)
{
printf("something\n");
};
};
int main()
{
((c1*)NULL)->DoSomething();
}
печатает "something" сообщений об ошибке не выдает, Delphi в данном случае ничем от C++ не отличается
← →
Игорь Шевченко © (2004-08-04 14:33) [147]
> печатает "something" сообщений об ошибке не выдает
Неверно спроектированный класс, кстати, метод абсолютно лишний :))
← →
Igorek © (2004-08-04 15:25) [148]Вот пример организации двусторонней связи между классами:
procedure TamcBar.SetBarControl(const Value: TamcBarControl);
var
TmpBarControl: TamcBarControl;
begin
if FBarControl = Value then
Exit;
if FBarControl <> nil then
begin
TmpBarControl := FBarControl;
FBarControl := nil;
TmpBarControl.Bar := nil;
end;
FBarControl := Value;
if FBarControl <> nil then
FBarControl.Bar := Self;
end;
Защищает от битых ссылок.
← →
Юрий Зотов © (2004-08-04 15:35) [149]> Igorek © (04.08.04 15:25) [148]
Гм... а что здесь нового? Голимый стандарт. Механизм которого, кстати, встроен в VCL начиная с TComponent (Notification, FreeNotification, RemoveFreeNotification).
Кстати, а зачем так запутывать код? Какие-то Tmp... к чему они?
procedure TamcBar.SetBarControl(const Value: TamcBarControl);
begin
if FBarControl = Value then
Exit;
if FBarControl <> nil then
FBarControl.Bar := nil;
FBarControl := Value;
if FBarControl <> nil then
FBarControl.Bar := Self
end;
← →
Игорь Шевченко © (2004-08-04 15:37) [150]
> Защищает от битых ссылок
Каким образом, что-то я не очень понял...Если Value является битой ссылкой, то в 15-ой строке может возникнуть AV
← →
UK (2004-08-04 15:42) [151]>Юрий Зотов © (04.08.04 13:55) [142]
with TMyObject.Create do
try
...
finally
Free
end;
Имхо, неудачный пример. Не нужен здесь Free, достаточно Destroy.
← →
Игорь Шевченко © (2004-08-04 15:45) [152]UK (04.08.04 15:42) [151]
"It is not recommended coding style to call Destroy directly. Call Free instead. Free checks to ensure that the object reference is not nil before calling Destroy."
В данном случае мы догматики :)
← →
Digitman © (2004-08-04 15:51) [153]
> cyborg © (04.08.04 12:48) [137]
> Mov EAX,ECX
>
> Объясните, зачем мне нужно перемещать данные из регистра
> в регистр, если в регистре EAX может быть выжная информация?
> Нафиг ещё какой-то PUSH делать, а потом ещё и POP, ламеризм
> какой-то, если мне надо всего лишь в регистр перегнать данные?
это ты к чему ? откуда у этого ноги растут ?
← →
wicked © (2004-08-04 15:52) [154]единственной защитой от битых ссылок может быть либо garbage collector, либо подсчет ссылок, как с динамическими строками...
поправьте меня, если не так.... :)
кстати, интересная тема... может ветку завести?....
← →
Мастер © (2004-08-04 15:52) [155]>UK (04.08.04 15:42) [151]
И чем же пример неудачен?
← →
Igorek © (2004-08-04 15:55) [156]
> Юрий Зотов © (04.08.04 15:35) [149]
> > Igorek © (04.08.04 15:25) [148]
>
> Гм... а что здесь нового? Голимый стандарт.
Да ничего наверно нового нету.
Да, и не идет вам этот тон. Юношеский максимализм, против которого вы боретесь. Вы же консерватор-ортодокс. :-))
> Кстати, а зачем так запутывать код? Какие-то Tmp... к чему
> они?
Что бы не было зацикливания рекурсивных вызовов - на той стороне такой же код.
> Игорь Шевченко © (04.08.04 15:37) [150]
> Каким образом, что-то я не очень понял...Если Value является
> битой ссылкой, то в 15-ой строке может возникнуть AV
Все обращения к классу идут из классов, связанных таким образом. Потому не может быть обращения извне и потому битых ссылок.
← →
UK (2004-08-04 16:02) [157]>Игорь Шевченко © (04.08.04 15:37) [150]
>В данном случае мы догматики :)
Да я, честно говоря, тоже, пишу Free автоматически:)
>Мастер © (04.08.04 15:52) [155]
Написал же: > Не нужен здесь Free, достаточно Destroy
Что не так?
← →
Игорь Шевченко © (2004-08-04 16:04) [158]
> Все обращения к классу идут из классов, связанных таким
> образом. Потому не может быть обращения извне и потому битых
> ссылок.
А без таких вот строк кода разве нельзя сделать программу, в которой не будет битых ссылок ? От кого тогда защищаться-то ?
← →
Мастер © (2004-08-04 16:06) [159]>UK (04.08.04 16:02) [157]
Написал же: > Не нужен здесь Free, достаточно Destroy
Достаточно, это означает правильно и так нужно делать?
← →
Anatoly Podgoretsky © (2004-08-04 16:11) [160]UK (04.08.04 16:02) [157]
А работу Free будешь сам выполнять? А зачем?
← →
UK (2004-08-04 16:20) [161]>Anatoly Podgoretsky © (04.08.04 16:11) [160]
Не понял, какая такая работа в данном коде требуется от Free?
with TMyObject.Create do
try
...
finally
Free
end;
Что Self <> nil? Так по-другому здесь и быть не может. Вы о чем?
>Мастер © (04.08.04 16:06) [159]
>Достаточно, это означает правильно
Да.
>и так нужно делать?
Так можно делать и никогда ни к каким ошибкам это не приведет.
← →
Anatoly Podgoretsky © (2004-08-04 16:23) [162]А в другом месте, без анонимной ссылкой?
← →
Мастер © (2004-08-04 16:30) [163]> UK (04.08.04 16:20) [161]
Ну что же...
Все на борьбу с лишними командами!
Будем вычленять из VCL необходимо-достаточные куски кода, и, в соответствии с ситуацией, использовать только их.
← →
Sandman25 © (2004-08-04 16:33) [164][163] Мастер © (04.08.04 16:30)
И что в этом плохого? В том, что код понимается, а не бездумно используется.
← →
UK (2004-08-04 16:42) [165]>Anatoly Podgoretsky © (04.08.04 16:23) [162]
При чем здесь другое место, когда речь шла о вполне конкретном примере?
>Мастер © (04.08.04 16:30) [163]
Ну если больше нечем заняться, то боритесь. Или это способ вести дискуссию, когда по существу сказать уже нечего?
Я что-то не понял... Я что, сказал что-то неправильно? Что именно? В чем меня пытаются обвинить? Или здесь теперь так принято?
← →
Мастер © (2004-08-04 16:43) [166]>Sandman25 © (04.08.04 16:33) [164]
> И что в этом плохого? В том, что код понимается, а не бездумно
> используется.
А плохое то, что, даже если ты понял, что происходит в код VCL, не факт, что не допустишь ошибки. Также может изменииться код VCL при смене версии.
А в данном случае непонятна цель использования Destroy вместо Free.
Уменьшение кода на 5 байт? - Смешно, если учесть, что Destroy безопасно можно использовать только в приведенном примере.
← →
Sandman25 © (2004-08-04 16:45) [167][166] Мастер © (04.08.04 16:43)
А давайте не будем inherited вызывать, вдруг код изменится при смене VCL.
← →
Мастер © (2004-08-04 16:47) [168]>Sandman25 © (04.08.04 16:45) [167]
Это предложение кочевряжить внутреннюю структуру классов?
inherited как раз и предназначено для того, чтобы правильно использвать методы предка.
← →
Sandman25 © (2004-08-04 16:48) [169][168] Мастер © (04.08.04 16:47)
Free как раз и предназначено, чтобы правильно вызывать Destroy. И ни для чего больше.
← →
Мастер © (2004-08-04 16:50) [170]>Sandman25 © (04.08.04 16:48) [169]
> Free как раз и предназначено, чтобы правильно вызывать Destroy.
> И ни для чего больше.
Ну тогда о чем спорим?
Вызываем Free, чтобы правильно выполнилось Destroy.
← →
Sandman25 © (2004-08-04 16:52) [171][170] Мастер © (04.08.04 16:50)
procedure ProcessIfNotZero(I: byte);
begin
if I <> 0 then
Process(I);
end;
...
I := 1;
ProcessIfNotZero(I);
Вопрос. Почему бы не вызвать Process(I), если код ProcessIfNotYero никогда не изменится?
← →
Мастер © (2004-08-04 16:57) [172]>Sandman25 © (04.08.04 16:52) [171]
> Вопрос. Почему бы не вызвать Process(I), если код ProcessIfNotYero
> никогда не изменится?
Потому, что используя в десятках мест Process(I), в конце концов получишь AV(в лучшем случае), упустив место, где I изменится(А приведенный пример вообще некорректен, так как не зависит от внешних условий).
Такой стиль программирования - не лучший.
← →
UK (2004-08-04 17:00) [173]>Мастер © (04.08.04 16:47) [166]
С чего все началось:
Например, существует вот такая часто используемая конструкция:
with TMyObject.Create do
try
...
finally
Free
end;
И как здесь уничтожит объект, если нет Free, а есть только FreeAndNil? Что передавать в параметре?
Я высказал свое скромное мнение(Имхо), что ЭТОТ пример неудачен для обоснования необходимости наличия метода Free по таким-то причинах.
Как продолжилось:
Мастер © (04.08.04 15:52) [155]
>UK (04.08.04 15:42) [151]
И чем же пример неудачен?
Я повторил, чем же именно этот пример неудачен в ДАННОМ случае.
Уважаемый, Вы вообще-то нить отслеживаете? При чем здесь борьба, куски VCL и прочие ужасы? Вы о чем вообще? Или так, для самоутверждения?
← →
Sandman25 © (2004-08-04 17:02) [174][172] Мастер © (04.08.04 16:57)
А если я полностью контролирую свою программу и ничего не упущу? :)
Кстати, я всегда пишу по привычке Free, но если подумать, то применение Destroy вместо Free может сделать код более читабельным. Да, да! Как комментарий о том, что имеем дело с локальной переменной, которая нигде больше не используется.
← →
Sandman25 © (2004-08-04 17:03) [175]И которая точно не равна nil.
← →
Мастер © (2004-08-04 17:04) [176]>UK (04.08.04 17:00) [173]
При чем здесь борьба, куски VCL и прочие ужасы? Вы о чем вообще? Или так, для самоутверждения?
Для чего вообще здесь было указано, что можно использовать Destroy? Для самоутверждения?
Ведь в контексте разговора совершенно не имеет значения, Destroy или Free используется. Смысл был в том, что невозможно использовать FreeAndNil в такой конструкции.
В результате это абсолютно ненужное, и даже вредное замечание увело дискуссию в сторону.
← →
Sandman25 © (2004-08-04 17:05) [177][176] Мастер © (04.08.04 17:04)
Правильно, даешь процедуру DestroyAndNil!
← →
Мастер © (2004-08-04 17:07) [178]>Sandman25 © (04.08.04 17:02) [174]
> применение Destroy вместо Free может сделать код более читабельным
А вот это субъективное утверждение.
А если я полностью контролирую свою программу и ничего не упущу? :)
А если для корректировки объемной программы нужно будет вернуться к коду через полгода-год?
Ведь здесь дело в стиле, этот пример слишком прост, чтобы в нем можно было допустить ошибки.
← →
Sandman25 © (2004-08-04 17:10) [179][178] Мастер © (04.08.04 17:07)
Если пример сложнее, то используется Free :)
← →
UK (2004-08-04 17:11) [180]>Мастер © (04.08.04 17:04) [176]
>абсолютно ненужное, и даже вредное замечание.
А, понял. Врага народа нашли, хватай его - и на Соловки!
К ВАМ у меня больше вопросов нет, позвольте откланяться. Позвольте на прощание совет - потренируйте на досуге формальную логику, у Вас с ней проблемы.
← →
Мастер © (2004-08-04 17:12) [181]>UK (04.08.04 17:11) [180]
ага-)
Вот он каков - Ваш метод ведения дискуссии - демагогия.
← →
Мастер © (2004-08-04 17:15) [182]> Sandman25 © (04.08.04 17:10) [179]
> Если пример сложнее, то используется Free :)
К чему и вернулись;-)
← →
Sandman25 © (2004-08-04 17:17) [183][182] Мастер © (04.08.04 17:15)
Конечно, вернулись. Но, надеюсь, иногда Вы осмелитесь написать Destroy вместо Free :)
← →
Мастер © (2004-08-04 17:19) [184]>Sandman25 © (04.08.04 17:17) [183]
Конечно, вернулись. Но, надеюсь, иногда Вы осмелитесь написать Destroy вместо Free :)
Так не вижу смысла в этом.
для меня намного привычней и наглядней написать Free - так, как это я использую везде в программе. А задумываться еще и о том, можно ли в данном конкретном случае сэкономить одну команду - только время терять при разработке.
← →
Anatoly Podgoretsky © (2004-08-04 17:19) [185]Мастер © (04.08.04 17:04) [176]
Особо не увело, свою роль тоже сыграло.
← →
Sandman25 © (2004-08-04 17:20) [186][184] Мастер © (04.08.04 17:19)
С последней частью согласен.
← →
Igorek © (2004-08-04 17:38) [187]
> Игорь Шевченко © (04.08.04 16:04) [158]
> > Все обращения к классу идут из классов, связанных таким
> > образом. Потому не может быть обращения извне и потому
> битых
> > ссылок.
> А без таких вот строк кода разве нельзя сделать программу,
> в которой не будет битых ссылок ? От кого тогда защищаться-то
> ?
Что за манера - вопросом на вопрос.
Ты спросил - "как защищает?". Я пояснил. Не забывай, что в начале я написал "это пример". Могут быть и другие способы - с другими строками кода.
Просто именно такой код (или измененный, если есть список ссылок) позволяет:
- разрывать связь с любой стороны и даже извне
- будучи вызванным в деструкторе автоматом обрежет связи на класс, что разрушается
Что в конечном итоге делает невозможным битые ссылки. И делает это легко - т.е. раз написал связь - и ни о чем не беспокоишься.
← →
NailMan © (2004-08-04 18:44) [188]Anatoly Podgoretsky ©
> Проверка переменной на нил говорит о попытке повторного
> использования этой переменной, в правильно написаной программе
> этого быть не должно, говорит о недостатках дизайна, подлежит
> переписыванию.
Не соглашусь. Предположим у меня есть массив чего-то, скажем массив текстур которые сделаны в виде класса.
Я загрузил в начале программы кучу текстур, и по прошествии какого-то времени мне стала не нужна какая-то текстура в массиве.
Я ее Free-кнул, тобишь убил.
Далее прошло еще какое-то врем и я решил загрузить текстуру, которой в массиве нет еще и чтобы не расширять массив я хочу найти свободный указатель.
Я буду проверять if Texture[i]<>nil then я создам ее и буду юзать дальше.
Другими словами я найду первый свободный элемент и займу его, но не буду расширять сам массив добавляя ему в конец новый экземпляр.
Ну и как тут передизайнить по правильному?
---
WBR, NailMan aka 2:5020/3337.13
← →
wicked © (2004-08-04 18:48) [189]
> Ну и как тут передизайнить по правильному?
к
> Я ее Free-кнул, тобишь убил.
нужно добавить - "и об-nil-ил"....
и всех делов... тем более, что класс-контейнер сам должен инкапсулировать такие вещи...
← →
Igorek © (2004-08-04 19:22) [190]
> Другими словами я найду первый свободный элемент и займу
> его, но не буду расширять сам массив добавляя ему в конец
> новый экземпляр.
> Ну и как тут передизайнить по правильному?
связный список тебе поможет
← →
Anatoly Podgoretsky © (2004-08-04 19:57) [191]NailMan © (04.08.04 18:44) [188]
TList/TObjectList
← →
Anatoly Podgoretsky © (2004-08-04 19:58) [192]Поиск элемента (переменной) и есть попытка повторного использования, ведет к ошибкам.
← →
cyborg © (2004-08-04 20:29) [193]
> [153] Digitman © (04.08.04 15:51)
> это ты к чему ? откуда у этого ноги растут ?
Это я к первому сообщению, хотел сказать "ты программист или где?", но потом написал это, так понятнее :). Если человеку лень обнулять указатели это не значит что их не нужно обнулять. Напиши в конце концов процедуру, которая освобождает и обнуляет, но его это почему-то вымораживает. Пошёл бы он скворечник сострогал чтоли, тут птицам размножаться негде :).
Страницы: 1 2 3 4 5 вся ветка
Форум: "Потрепаться";
Текущий архив: 2004.08.22;
Скачать: [xml.tar.bz2];
Память: 1.01 MB
Время: 0.054 c