Re[7]: Контроль типов в С++ и в Object pascal
От: vasmann  
Дата: 11.05.07 07:53
Оценка:
Здравствуйте, SuhanovSergey, Вы писали:

SS>>// Pascal

SS>>var
SS>>A a;
SS>>Pointer p;

SS>Имел в виду:

SS>
SS>var
SS>  a: A;
SS>  p: Pointer;
SS>

Поправка 2
type
  AAAA=class
  end;
...
var
  a: AAAA;
  p: Pointer;
begin
  a := p;
  p := a;
....
end;


И приведение типа в С++ в стиле С — это дурной тон, хотя и очень простой. Я им не пользовался с момента когда узнал о
static_cast, reinterpret_cast, const_cast dynamic_cast — даже с усложнением написания этого самого приведения — жизнь стала легче.
Re[7]: Контроль типов в С++ и в Object pascal
От: SuhanovSergey  
Дата: 11.05.07 07:54
Оценка:
V>Да виноват, думал что функция FreeAndNil описана как procedure FreeAndNil(var obj: TObject) и чего то не совсем понятно почему так и не сделали.
Потому что было бы неудобно пользоваться
var
  m: TButton;
begin
  FreeAndNil(m); // error: types of actual and formal var parameters must be identical
end

Нужно было добавлять поддержку в язык.


V>... что TObject без дополнительных усилий програмера приведится к TObject-у и наоборот.

Не понял глубокой мысли
Re[8]: Контроль типов в С++ и в Object pascal
От: vasmann  
Дата: 11.05.07 07:56
Оценка:
Здравствуйте, SuhanovSergey, Вы писали:


V>>Да виноват, думал что функция FreeAndNil описана как procedure FreeAndNil(var obj: TObject) и чего то не совсем понятно почему так и не сделали.

SS>Потому что было бы неудобно пользоваться
SS>
SS>var
SS>  m: TButton;
SS>begin
SS>  FreeAndNil(m); // error: types of actual and formal var parameters must be identical
SS>end
SS>

SS>Нужно было добавлять поддержку в язык.


V>>... что TObject без дополнительных усилий програмера приведится к TObject-у и наоборот.

SS>Не понял глубокой мысли
И снова прошу прощения — мысли спереди слов летят.
Считаю не нормальным неявное преобразование типа из TObject в pointer и наоборот
Re[8]: Контроль типов в С++ и в Object pascal
От: vasmann  
Дата: 11.05.07 07:58
Оценка:
Здравствуйте, SuhanovSergey, Вы писали:


V>>Да виноват, думал что функция FreeAndNil описана как procedure FreeAndNil(var obj: TObject) и чего то не совсем понятно почему так и не сделали.

SS>Потому что было бы неудобно пользоваться
SS>
SS>var
SS>  m: TButton;
SS>begin
SS>  FreeAndNil(m); // error: types of actual and formal var parameters must be identical
SS>end
SS>

SS>Нужно было добавлять поддержку в язык.

Вообще смысла в этой функции нет, я не вижу по крайней мере.
Если он в том чтобы использовать одну и туже переменную два раза — не использую простите
а что бы изменилось от того если бы вы прсото написали
m.free?
Re[8]: Контроль типов в С++ и в Object pascal
От: Vitaliy_www  
Дата: 11.05.07 07:58
Оценка:
тоисть должно быть отак:




// C++
A* a;
void* p;

a = (A*)b;
p = a;

// Pascal
var
a: A;
p: Pointer;

type
AAAA=class
end;
...
var
a: AAAA;
p: Pointer;
begin
a := p;
p := a;
....
end;
Re[9]: Контроль типов в С++ и в Object pascal
От: vasmann  
Дата: 11.05.07 08:00
Оценка:
Здравствуйте, Vitaliy_www, Вы писали:

V_>тоисть должно быть отак:





V_>// C++

V_>A* a;
V_>void* p;

V_>a = (A*)b;

V_>p = a;

V_>// Pascal

V_>var
V_> a: A;
V_> p: Pointer;

V_>type

V_> AAAA=class
V_> end;
V_>...
V_>var
V_> a: AAAA;
V_> p: Pointer;
V_>begin
V_> a := p;
V_> p := a;
V_>....
V_>end;

Так вообще быть не должно.
Если есть приведение типов — нужно задуматься почему оно есть? А не тупо приводить
Re[10]: Контроль типов в С++ и в Object pascal
От: vasmann  
Дата: 11.05.07 08:04
Оценка:
Но раз уж на то пошло, то должно быть что то типа такого

C++
class A
{
...
};

void* p;
A* a;
...

{
  p = reinterpret_cast<void*>(a);
  a = reinterpret_cast<A*>(p); //Чувсвуете силу - такое писать не сильно хочется, а надо.
}

Delphi
type
  AAAA=class
  end;
  ...
  var
    a: AAAA;
    p: Pointer;
  begin
    a := p;
    p := a;
  end;
Re[11]: Контроль типов в С++ и в Object pascal
От: Vitaliy_www  
Дата: 11.05.07 08:07
Оценка:
Здравствуйте, vasmann, Вы писали:

V>Но раз уж на то пошло, то должно быть что то типа такого


V>C++

V>
V>class A
V>{
V>...
V>};

V>void* p;
V>A* a;
V>...

V>{
V>  p = reinterpret_cast<void*>(a);
V>  a = reinterpret_cast<A*>(p); //Чувсвуете силу - такое писать не сильно хочется, а надо.
V>}
V>

V>Delphi
V>
V>type
V>  AAAA=class
V>  end;
V>  ...
V>  var
V>    a: AAAA;
V>    p: Pointer;
V>  begin
V>    a := p;
V>    p := a;
V>  end;
V>


Я понимаю, ето мне просто на Курсовую, мне нужно написать разницу между етими языками, я один из пунктов ето про контроль типов! Спасибо!
Re[8]: Контроль типов в С++ и в Object pascal
От: SuhanovSergey  
Дата: 11.05.07 08:11
Оценка:
V>Поправка 2
V>

V>type

V> AAAA=class
V> end;
V>...
V>var
V> a: AAAA;
V> p: Pointer;
V>begin
V> a := p;
V> p := a;
V>....
V>end;
V>

Да, согласен a := p; — это отличие от C++, связанное с контролем типов.

V>И приведение типа в С++ в стиле С — это дурной тон, хотя и очень простой. Я им не пользовался с момента когда узнал о

Изначально шла речь, о том, можно ли легко присвоить указатели. В обоих языках МОЖНО и одинаково легко. Другое дело, что лучше этого не делать, но это к языку не отностился.

Что касается, специальных XXX_cast-ов в С++, то можно зафиксировать ещё одно маленькое отличие: в C++ есть более полная поддержка для разных приведений типов
C++                 Delphi
(T)v                   T(v)
static_cast<T>(v)      T(v)
reinterpret_cast<T>(v) T(v)
const_cast<T>(v)       T(v)
dynamic_cast<T>(v)     v as T

т.е. в Delphi есть только спец. синтаксис для dynamic cast, в остальных случаях программист не может явно выразить свои намерения. Это конечно минус Delphi.
Re[9]: Контроль типов в С++ и в Object pascal
От: OdesitVadim Украина  
Дата: 11.05.07 08:15
Оценка:
Здравствуйте, vasmann, Вы писали:

V>Здравствуйте, SuhanovSergey, Вы писали:

Считаю не нормальным неявное преобразование типа из TObject в pointer и наоборот
Ну я в си и плюсах тоже многое считаю неверным. Но в данном случае это преобразование вполне законно, так как в Делфи любая переменная-объект есть указателем. Попробуйте к примеру sizeof(Form1). Будет 4.

to all:
А вот создателей Си/С++ за результат выражения 3/2 расстрелял. очень сложно логике здравой поддаётся. (ну мож на процессорах и понятно, но в нормальной жизни...)
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[10]: Контроль типов в С++ и в Object pascal
От: vasmann  
Дата: 11.05.07 08:21
Оценка:
OV>to all:
OV>А вот создателей Си/С++ за результат выражения 3/2 расстрелял. очень сложно логике здравой поддаётся. (ну мож на процессорах и понятно, но в нормальной жизни...)
Все очень здраво — свои намерения выражайте явно а не неявно
3/2 — это деление двух целых
3.0f/2 это деление числа плавающей точкой на целое... дальше думаю не стоит приводить примеров.
Re[9]: Контроль типов в С++ и в Object pascal
От: SuhanovSergey  
Дата: 11.05.07 08:24
Оценка:
SS>>Потому что было бы неудобно пользоваться
SS>>
SS>>var
SS>>  m: TButton;
SS>>begin
SS>>  FreeAndNil(m); // error: types of actual and formal var parameters must be identical
SS>>end
SS>>

SS>>Нужно было добавлять поддержку в язык.

V>Вообще смысла в этой функции нет, я не вижу по крайней мере.

V>Если он в том чтобы использовать одну и туже переменную два раза — не использую простите
V>а что бы изменилось от того если бы вы прсото написали
V>
V>m.free?
V>

Если m — это поле, а не локальная переменная, то оно с большей вероятностью использоваться повторно. Даже в пределах функции для обнуления локальной переменной можно найти смысл: упрщение при написании кода обработки исключений. Пример:
var
  m: TFileStream;
begin
  m = TFileStream.Create(fname, fmCreate); // create and lock file
  try
    WriteFile(m);
    FreeAndNil(m); // release file here
    UseFile(fname);
  finally
    m.Free();
  end;
end;

Если FreeAndNil заменить на
m.Free(); 
m = nil;

то при исключении в m.Free() произойёт access vioaltion в finally.
Re[7]: Контроль типов в С++ и в Object pascal
От: Sergei I. Gorelkin Россия  
Дата: 11.05.07 08:25
Оценка:
Здравствуйте, vasmann, Вы писали:

<skipped>


V>Да виноват, думал что функция FreeAndNil описана как procedure FreeAndNil(var obj: TObject) и чего то не совсем понятно почему так и не сделали.


Если бы так сделали, то она принимала бы только TObject (т.к. для аргументов, передаваемых по ссылке, язык требует точного совпадения типа), наследники
от TObject не принимались бы. Это гораздо неудобнее того, что есть сейчас.
Re[8]: Контроль типов в С++ и в Object pascal
От: vasmann  
Дата: 11.05.07 08:27
Оценка:
Здравствуйте, Sergei I. Gorelkin, Вы писали:

SIG>Здравствуйте, vasmann, Вы писали:


SIG><skipped>



V>>Да виноват, думал что функция FreeAndNil описана как procedure FreeAndNil(var obj: TObject) и чего то не совсем понятно почему так и не сделали.


SIG>Если бы так сделали, то она принимала бы только TObject (т.к. для аргументов, передаваемых по ссылке, язык требует точного совпадения типа), наследники

SIG>от TObject не принимались бы. Это гораздо неудобнее того, что есть сейчас.

Я этой функцией вообще не пользуюсь (оговорочка: около года) и чувствую себя прекрасно.
Re[10]: Контроль типов в С++ и в Object pascal
От: SuhanovSergey  
Дата: 11.05.07 08:28
Оценка:
V>>Здравствуйте, SuhanovSergey, Вы писали:
OV>Считаю не нормальным неявное преобразование типа из TObject в pointer и наоборот
OV>Ну я в си и плюсах тоже многое считаю неверным. Но в данном случае это преобразование вполне законно, так как в Делфи любая переменная-объект есть указателем. Попробуйте к примеру sizeof(Form1). Будет 4.
Если так рассуждать, то все укзатели — это по сути целые числа. Давайте тогда разрешим свободно приводить их в Integer!
Re[11]: Контроль типов в С++ и в Object pascal
От: OdesitVadim Украина  
Дата: 11.05.07 08:31
Оценка:
Здравствуйте, vasmann, Вы писали:

OV>>to all:

OV>>А вот создателей Си/С++ за результат выражения 3/2 расстрелял. очень сложно логике здравой поддаётся. (ну мож на процессорах и понятно, но в нормальной жизни...)
V>Все очень здраво — свои намерения выражайте явно а не неявно
V>3/2 — это деление двух целых
Да, но скажи это в школе или институте. Они пальчиком у виска покрутят. Только Сипрограммеры и им подобные понимают эту "особенность"
Ведь если 3 яблока на двоих делить, то куда ещё одно денеться?
Получается, что (3/2)*2!=3 явное нарушение законов математики. Вот где одна из собак языка Си/Си++ порылась. В Паскале всё нормально — математика выполняется.
V>3.0f/2 это деление числа плавающей точкой на целое... дальше думаю не стоит приводить примеров.
а смысл?
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[10]: Контроль типов в С++ и в Object pascal
От: vasmann  
Дата: 11.05.07 08:32
Оценка:
а чт омешает сделать так?
var
  m: TFileStream;
  ..
begin
  m = TFileStream.Create(fname, fmCreate); // create and lock file
  try
    WriteFile(m);
  finally
    m.free;
  end;
  m = TFileStream.Create(fname, fmCreate); // create and lock file
  try
    UseFile(m);
  finally
    m.free;
  end;
end;


Плюс вообще можно два отдельных логических участка WriteFile и UseFile разделить на отдельные функции с приемом имени файла?

Я не спорю — все это искуственные примеры, но вот в течении порядка года я обхожусь без FreeAndNil и никак об этом не жалею и не чувсвую дискомфорта. Ладно это дело вкуса каждого.
Но факт остается фактом Типовая систем Делфы сливает С++ без особых надежд на победу. И это ВСЕГДА НУЖНО ДЕРЖАТЬ В ГОЛОВЕ, отвлекать себя на это, в то время как это МОЖЕТ И ДОЛЖЕН ДЕЛАТЬ КОМПИЛЯТОР, но знать об это тоже надо.
Re[12]: Контроль типов в С++ и в Object pascal
От: AKh  
Дата: 11.05.07 08:38
Оценка: :)
Здравствуйте, OdesitVadim, Вы писали:

V>>3/2 — это деление двух целых

OV>Да, но скажи это в школе или институте. Они пальчиком у виска покрутят. Только Сипрограммеры и им подобные понимают эту "особенность"
OV>Ведь если 3 яблока на двоих делить, то куда ещё одно денеться?
OV>Получается, что (3/2)*2!=3 явное нарушение законов математики. Вот где одна из собак языка Си/Си++ порылась. В Паскале всё нормально — математика выполняется.

Имхо тут надо различать оператор деления языка и математический оператор деления. Вы сравниваете совсем разные понятия.
Re[11]: Контроль типов в С++ и в Object pascal
От: OdesitVadim Украина  
Дата: 11.05.07 08:39
Оценка:
Здравствуйте, SuhanovSergey, Вы писали:

SS>Если так рассуждать, то все укзатели — это по сути целые числа.

А как оригинально вы основываясь на количестве байт, пришли к неверному выводу.Хотя в компах всё числа. Давайте не будем кота называть собакой, несмотря на то, что у них по 4 лапы, хвос и шерсть.
SS> Давайте тогда разрешим свободно приводить их в Integer!
Уж извените. Одинаковое количество байт ещё ничего не говорит. Целое число и объект — разные вещи. Просто в С++ существуют классы в стеке и в куче. В делфи только в куче. Здесь есть свои плюсы и минусы.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[11]: Контроль типов в С++ и в Object pascal
От: vasmann  
Дата: 11.05.07 08:40
Оценка:
Здравствуйте, SuhanovSergey, Вы писали:

V>>>Здравствуйте, SuhanovSergey, Вы писали:

OV>>Считаю не нормальным неявное преобразование типа из TObject в pointer и наоборот
OV>>Ну я в си и плюсах тоже многое считаю неверным. Но в данном случае это преобразование вполне законно, так как в Делфи любая переменная-объект есть указателем. Попробуйте к примеру sizeof(Form1). Будет 4.
SS>Если так рассуждать, то все укзатели — это по сути целые числа. Давайте тогда разрешим свободно приводить их в Integer!

Это просто слова человека который не наступал на грабли связанных с неявным приведением типа.
Я приведу пример из реальной жизни. Писалось клиент/сервер приложение, из сокета читались данные, так вот для дебага мне было удобнее читать в строка (заранее установив ее размер в нужное значение) и смотреть на контент, потому как простой перевод указателья в PChar не помогал — наличие хотябы одного нуля в контенте приводил к показанию конца строки и это понятно, так что было вот удобно строкой, в релизе используется свой класс, который кеширует память — короче отдельный обьект, совсем другого типа, так вот была проблема в нарушении протокола — контент левый ехал, искал почему, и вернул строку и ЗАБЫЛ закоментировать FreeAndNil(buffer) (buffer был описан как buffer: TMyObject, а я его заменил на String) как вы догодались, проблему в протоколе я нашол быстро, а вернуть обратно забыл — конец дня, нужно отдать на тестирование — короче в режиме "быстронах и срочнонах", поверьте я минут 30 искал в чем проблема, даже с наличием WinMerge просто по той причине что я положился на систему типов и думал что FreeAndNil строке никогда не сделаешь...
Все это мой опыт, моя не внимательность — знаю — вина была полностью на мне я даже и не спорю, но ВЕДЬ ЭТО МОГ УВИДЕТЬ КОМПИЛЯТОР и дать хотя бы гнусненький хинт, не говоря о ворнинге или вообще откозаться компилить.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.