Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2007.10.21;
Скачать: [xml.tar.bz2];

Вниз

FreeAndNil   Найти похожие ветки 

 
Anatoly Podgoretsky ©   (2007-09-22 14:36) [40]

> oxffff  (22.09.2007 14:32:39)  [39]

Может из-за var
В этом случае да, параметры не идентичны.


 
oxffff ©   (2007-09-22 14:44) [41]


> Anatoly Podgoretsky ©   (22.09.07 14:36) [40]
> > oxffff  (22.09.2007 14:32:39)  [39]
>
> Может из-за var
> В этом случае да, параметры не идентичны.


Так является ли это упущением с вашей точки зрения?

Ведь именно по этой причине FreeAndNil имеет вид

procedure FreeAndNil(var Obj);

а не

procedure FreeAndNil(var Obj:Tobject);

Почему если типы совместимы, ссылки на них не совместимы?

Повторю еще раз

Так является ли это упущением с вашей точки зрения?


 
Anatoly Podgoretsky ©   (2007-09-22 14:50) [42]

> oxffff  (22.09.2007 14:44:41)  [41]

Мне как то все равно до FreeAndNil я ее не использую.


 
oxffff ©   (2007-09-22 14:54) [43]

Еще из этого разряда. Почему компилятор не пропускает

procedure abc(p:ppointer);
begin
end;

procedure TForm1.Button1Click(Sender: TObject);
var a:^Tobject;
begin
abc(a);
end;

Incompatible types: "TObject" and "Pointer"

IMHO.
Компилятор слегка подстроить для нормальной обработки этой ситуации.
А именно, если типы совместимы, то и ссылки и указатели на них должны совместимы
IMHO.


 
Anatoly Podgoretsky ©   (2007-09-22 14:57) [44]

> oxffff  (22.09.2007 14:54:43)  [43]

Ну так и говорит - типы не совместимые.


 
oxffff ©   (2007-09-22 15:00) [45]


> Anatoly Podgoretsky ©   (22.09.07 14:57) [44]
> > oxffff  (22.09.2007 14:54:43)  [43]
>
> Ну так и говорит - типы не совместимые.


Ну а почему вы можете присвоить Tobject к pointer. И наоборот.

Почему?


 
Leonid Troyanovsky ©   (2007-09-22 15:00) [46]


> oxffff ©   (22.09.07 14:54) [43]

> Еще из этого разряда. Почему компилятор не пропускает

Конечно, достаточно уйти от var и никаких ограничений,
за исключением необходимости добавлять @.

type
 PObject = ^TObject;
 TMyObject = class
   x: TObject;
 end;

procedure abc(a: PObject);
begin
 ShowMessage(a^.ClassName);
 a^ := nil;
end;

procedure TForm1.Button1Click(Sender: TObject);
var a:tMyobject;
begin
a:= TMyobject.Create;
a.x := TObject.Create;
abc(@a.x);
Caption :=  Format("%p", [Pointer(a.x)]);
end;


Только, подобная "гибкость" только плодит проблемы.

--
Regards, LVT.


 
oxffff ©   (2007-09-22 15:02) [47]

Если следовать логике компилятора.

Он должен не пропустить. Однако вы знаете он пропустит.

procedure abc(p:pointer);
begin
end;

procedure TForm1.Button1Click(Sender: TObject);
var a:Tobject;
begin
abc(a);
end;


 
oxffff ©   (2007-09-22 15:07) [48]


> Только, подобная "гибкость" только плодит проблемы.


В чем проблема в вашем примере?


 
Leonid Troyanovsky ©   (2007-09-22 15:13) [49]


> oxffff ©   (22.09.07 15:02) [47]

> Он должен не пропустить. Однако вы знаете он пропустит.

Ограничение относится только к var параметрам,
Types of actual and formal var parameters must be identical (E2033)

For a variable parameter, the actual argument must be of the exact type of the formal parameter.

Почитай статью.

Не пойму в чем смущение ума :)

--
Regards, LVT.


 
Leonid Troyanovsky ©   (2007-09-22 15:16) [50]


> oxffff ©   (22.09.07 15:07) [48]

> В чем проблема в вашем примере?

В моем их нет, но в подобных - отсутствие возможности контролировать типы, т.е. та самая совместимость TObject - pointer.

--
Regards, LVT.


 
oxffff ©   (2007-09-22 15:19) [51]


> Types of actual and formal var parameters must be identical
> (E2033)



> exact type


Да но к каким потенциальным граблям могут, если мы попросим их расширить эту функциональность. Вопрос в этом.

Вернемся к простому примеру с Tconrol и Tobject.

procedure abc(var a:Tobject);
begin
end;

procedure TForm1.Button1Click(Sender: TObject);
var a:tControl;
begin
abc(a);
end;

Почему бы не пропускать данный вызов. Ведь Tobject является подмножеством tControl и поэтому совместим.

Почему авторы ограничили именно до  exact type?


 
oxffff ©   (2007-09-22 15:22) [52]


> Leonid Troyanovsky ©   (22.09.07 15:16) [50]
>
> > oxffff ©   (22.09.07 15:07) [48]
>
> > В чем проблема в вашем примере?
>
> В моем их нет, но в подобных - отсутствие возможности контролировать
> типы, т.е. та самая совместимость TObject - pointer.


Но тем не менее проблем будет имхо не больше, чем когда вы пишите так

procedure TForm1.Button1Click(Sender: TObject);
var a:pointer;
begin
a:=self;
end;


 
Ping   (2007-09-22 15:28) [53]

Почему бы не пропускать данный вызов. Ведь Tobject является подмножеством tControl и поэтому совместим.

procedure Test(var Obj: TObject);
begin
 Obj := TBitmap.Create;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
 Obj: TWinControl;
begin
 Test(Obj);
end;


Вот поэтому...


 
oxffff ©   (2007-09-22 15:34) [54]


> Вот поэтому...


Но Imho это решаемо.
Захочешь ограничить. Сделаешь так

procedure Test(var Obj: TControl);
begin
Obj := TBitmap.Create;
end;


 
Ping   (2007-09-22 15:37) [55]

Захочешь ограничить. Сделаешь так

Как это относится к FreeAndNil()?


 
oxffff ©   (2007-09-22 15:41) [56]


> Как это относится к FreeAndNil()?


oxffff ©   (22.09.07 14:44) [41]


 
Leonid Troyanovsky ©   (2007-09-22 15:46) [57]


> oxffff ©   (22.09.07 15:22) [52]

> Но тем не менее проблем будет имхо не больше, чем когда
> вы пишите так

Ну, это, скорее, вынужденые локальные меры.
Информация о типе, видимо, сохраняется "в уме" пишущего.
А от глобальных процедур требуют большего.
Т.е., чтобы случайно не передать туда не то.

--
Regards, LVT.


 
Ping   (2007-09-22 15:52) [58]

В частном случае, для FreeAndNil(), когда производится только обниление переменной - такое решение, возможно, и подошло бы.

Но

При передаче параметров по ссылке (var), при предлагаемом тобой подходе, можно вернуть все, что душе угодно (в пределах наследования). Компилятор  - он не телепат. Есть формальная логика. И если для Паскаля постулируется сильная типизация, то компилятор, при передаче по ссылке, будет требовать, чтобы передаваемая ссылка была на объект требуемого типа. Не нравится - пиши на С.

P.S. "Я дерусь... потому что я... дерусь!" (С) ?


 
oxffff ©   (2007-09-22 15:59) [59]


>  И если для Паскаля постулируется сильная типизация, то
> компилятор, при передаче по ссылке, будет требовать, чтобы
> передаваемая ссылка была на объект требуемого типа.


Сильная типизация?
А как насчет в совместимости pointer и Tobject?
Далее как насчет дочерних типов?

>P.S. "Я дерусь... потому что я... дерусь!" (С) ?

Я хочу сделать свою жизнь проще. :)


 
Anatoly Podgoretsky ©   (2007-09-22 16:18) [60]

> oxffff  (22.09.2007 15:59:59)  [59]

Pointer и pPointer разные вещи, вторая уже строгая типизация


 
oxffff ©   (2007-09-22 16:29) [61]


> Anatoly Podgoretsky ©   (22.09.07 16:18) [60]
> > oxffff  (22.09.2007 15:59:59)  [59]
>
> Pointer и pPointer разные вещи, вторая уже строгая типизация


А почему язык со строгой типазацией закрывает глаза на первую?
И причину такого поведения не подскажите?

Почему бы не сделать свой выбор в пользу неявного приведения для ссылочных типов с простой семантикой копирования.
А именно для типов Tobject, нетипизированного указателя и указателей на типы с простой семантикой копирования? А как же для ссылок на эти типы.


 
Anatoly Podgoretsky ©   (2007-09-22 16:34) [62]

То что это документировано, или передаешь var Name без типа или var Name: тип, тогда должно быть соответствие формальных и фактических параметров.


 
Anatoly Podgoretsky ©   (2007-09-22 16:35) [63]

А насчет хотелок, многие хотели бы превратить Паскаль в Си или Бейсик и обидно, что Борланд иногда идет на поводу.


 
oxffff ©   (2007-09-22 16:39) [64]


> Anatoly Podgoretsky ©   (22.09.07 16:34) [62]
> То что это документировано, или передаешь var Name без типа
> или var Name: тип, тогда должно быть соответствие формальных
> и фактических параметров.


Да об этом и речи нет.

Я о расширении языка.
И чтобы не было каламбура по типу oxffff ©   (22.09.07 14:54) [43].

Только скажите как в языке со строгой типизацией присутствуют конструкции untyped var, out, const педачи параметров?


 
Anatoly Podgoretsky ©   (2007-09-22 16:41) [65]

> oxffff  (22.09.2007 16:39:04)  [64]

К Вирту, он папа и к извращенцам из Борланда.


 
oxffff ©   (2007-09-22 16:45) [66]


> Anatoly Podgoretsky ©   (22.09.07 16:35) [63]
> А насчет хотелок, многие хотели бы превратить Паскаль в
> Си или Бейсик и обидно, что Борланд иногда идет на поводу.
>


Я все таки думую нужно быть не гордым, а расчетливым и "видеть" как одни конструкции удобнее, или быстрее других. Согласитесь, что конструкция for in действительна удобна. Хоть я и пишу до сих пор на 7 версии.Но считаю ее удобной. Также как и внесение статических методов в record.
Также как и nested types, class var. И даже те же Class helpers и record helper.
Не смотря на что приходится писать и на других языках включая С++,C#, ASM и ряд других.
Все равно Delphi мне ближе.


 
oxffff ©   (2007-09-22 16:50) [67]


> Но считаю ее удобной.


Я о новых конструкциях.

Сейчас я поехал в баню париться. :)
Вечером приеду и с вашего позволения я был бы рад продолжить дисскусию.
Спасибо всем за диалог.


 
Leonid Troyanovsky ©   (2007-09-22 16:55) [68]


> oxffff ©   (22.09.07 16:29) [61]

> Почему бы не сделать свой выбор в пользу неявного приведения
> для ссылочных типов с простой семантикой копирования.
> А именно для типов Tobject, нетипизированного указателя
> и указателей на типы с простой семантикой копирования? А
> как же для ссылок на эти типы.

А зачем?
Передача var TObject - извращение, FreeAndNil тому иллюстрация.

Все, что нужно потомку TObject должно быть в _его_ методах,
а не в глобальных регулярных процедурах.

--
Regards, LVT.


 
oxffff ©   (2007-09-24 10:09) [69]


> Все, что нужно потомку TObject должно быть в _его_ методах,
>
> а не в глобальных регулярных процедурах.


Согласитесь, что переменная типа  Tobject является лишь ссылкой на объект. А методы "должны" выполнять операции связанные с объектом, а не со ссылкой на него. Поэтому технически невозможно "грамотно" обнулить ссылку на объект, по причине того, что self передается by value.
А передовать ссылку на объект by ref в метод объекта не "грамотно".
Конечно можно создать невиртуальный классовый метод в Tobject, который принимает ссылку на объект и делает то, что делает FreeAndNil.
Но фактически классовый метод является регулярной функцией с ограниченным scope и дополнительным параметром на VMT, что избыточно по причине того, что VMT является ненужным параметром, и его мы может при желании изъвлечь из объекта.

Таким образом из-за ref семантики объектов в delphi операции над ссылкой и вынесли за пределы object scope. Поэтому это не извращение.

Вопрос, а как вы бы постулили в C++, где object is value type semantic?


 
Kolan ©   (2007-09-24 10:11) [70]

> конструкция for in действительна удобна. Хоть я и пишу до
> сих пор на 7 версии.Но считаю ее удобной.

Вот потому и считаешь, а я получал internal error из-за неё. Поэтому не использую&#133


 
oxffff ©   (2007-09-24 10:20) [71]


> Kolan ©   (24.09.07 10:11) [70]
> > конструкция for in действительна удобна. Хоть я и пишу
> до
> > сих пор на 7 версии.Но считаю ее удобной.
>
> Вот потому и считаешь, а я получал internal error из-за
> неё. Поэтому не использую…


oxffff ©   (22.09.07 16:50) [67]

Более того я выявил баг в реализации for in и отправил на qc, который получил уже open статус

Но тем не менее cчитаю ее удобной.


 
Kolan ©   (2007-09-24 10:30) [72]

> Но тем не менее cчитаю ее удобной.

Если бы переменную не заводить, то былобы хорошо совсем&#133


 
Turbouser ©   (2007-09-24 10:40) [73]

> [16] Anatoly Podgoretsky ©   (21.09.07 20:23)

Посмеялся :)) Спасибо за порцию позитива :)))


 
Leonid Troyanovsky ©   (2007-09-24 11:29) [74]


> oxffff ©   (24.09.07 10:09) [69]

> Согласитесь, что переменная типа  Tobject является лишь
> ссылкой на объект. А методы "должны" выполнять операции
> связанные с объектом, а не со ссылкой на него. Поэтому технически
> невозможно "грамотно" обнулить ссылку на объект, по причине
> того, что self передается by value.

Ссылка на объект отличается от самого объекта (тоже ссылки)
лишь (лишним) разыменованием. By-reference vs by-value - тоже.

Ну, а раз оно лишнее, то это и есть изврат :)

Да и, во-ще, тема, IMHO, себя исчерпала,
а FreeAndNil - MD.

--
Regards, LVT.


 
Плохиш ©   (2007-09-24 11:53) [75]

"Каждому овощу своё время"...


 
oxffff ©   (2007-09-24 11:55) [76]


> Leonid Troyanovsky ©   (24.09.07 11:29) [74]
>
> > oxffff ©   (24.09.07 10:09) [69]
>
> > Согласитесь, что переменная типа  Tobject является лишь
>
> > ссылкой на объект. А методы "должны" выполнять операции
>
> > связанные с объектом, а не со ссылкой на него. Поэтому
> технически
> > невозможно "грамотно" обнулить ссылку на объект, по причине
>
> > того, что self передается by value.
>
> Ссылка на объект отличается от самого объекта (тоже ссылки)
> лишь (лишним) разыменованием. By-reference vs by-value -
>  тоже.
>
> Ну, а раз оно лишнее, то это и есть изврат :)
>
> Да и, во-ще, тема, IMHO, себя исчерпала,
> а FreeAndNil - MD.
>
> --
> Regards, LVT.


Я думаю мы с вами говорим о разных вещах.


 
oxffff ©   (2007-09-24 12:12) [77]


> Ссылка на объект отличается от самого объекта (тоже ссылки)
> лишь (лишним) разыменованием. By-reference vs by-value -
>  тоже.


Методы связаны с блоком памяти в куче, а не с самой ссылкой на этот блок.
Поэтому обнуление ссылки является грамотным вынесением в регулярную процедуру.

А вы как предлагаете?

procedure Tobject.FreeAndNil(var obj:Tobject);?
или class procedure Tobject.FreeAndNil(var obj:Tobject); ?


 
Anatoly Podgoretsky ©   (2007-09-24 12:26) [78]

> oxffff  (24.09.2007 12:12:17)  [77]

Tobject.Free;
Tobject := nil;

И не будет таких фокусов, как

FreeAndNil(Integer)


 
oxffff ©   (2007-09-24 12:59) [79]


> FreeAndNil(Integer)


freeandnil(integer);
freeandnil(5);

Такое даже не откомпилируется. ;)

Тогда уж типизировать параметр.


 
Игорь Шевченко ©   (2007-09-24 13:04) [80]

Borland же честно подписал "Be careful to only pass TObjects to this routine." :)



Страницы: 1 2 3 4 вся ветка

Форум: "Начинающим";
Текущий архив: 2007.10.21;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.62 MB
Время: 0.046 c
1-1186403635
pirks
2007-08-06 16:33
2007.10.21
WMI ConnectServer


2-1190999717
Pacific
2007-09-28 21:15
2007.10.21
System


2-1190909885
_@_@_
2007-09-27 20:18
2007.10.21
Как в Memo отловить перенос строки.


8-1168288879
Jimmy
2007-01-08 23:41
2007.10.21
Аналог StretchBlt для TMetaCanvas


2-1190800205
max-wo
2007-09-26 13:50
2007.10.21
TStrings - TStringList





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский