Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.12.18;
Скачать: CL | DM;

Вниз

Паскаль и С++ - различные понимания свободы?   Найти похожие ветки 

 
Verg ©   (2005-11-24 22:07) [40]


> Игорь Шевченко ©   (24.11.05 21:47) [39]
> Странный вы народ, ей-богу. Какая разница, на каком языке
> писать плохие программы ?


Не скажи. На одном из языков плохие программы получаются намного лучче.
А на другом хорошие - намного хуже. Доказано занудством.


 
Игорь Шевченко ©   (2005-11-24 22:21) [41]

Verg ©   (24.11.05 22:07) [40]

На мой взгляд, от языка мало что зависит. Люди вот хорошие программы на APL пишут :) Правда, немного :)


 
Anatoly Podgoretsky ©   (2005-11-24 22:56) [42]

Ермак ©   (24.11.05 13:47)  
Тезис весь мир пишет на С++, ложен, весь мир пишет на Бейсике (VB), на С++ и других языках пишет меньшинство.


 
Anatoly Podgoretsky ©   (2005-11-24 22:58) [43]

wicked ©   (24.11.05 15:25) [12]
Есть знаменитая притча

Восемь мудрецов шли по дороге, к ним подошел один дурак и задав простой вопрос. Дальше шли семь мудрецов, а в пыли остались валяться два дурака.


 
марсианин ©   (2005-11-25 00:15) [44]

for (i=+a=-b+4;i<a+b++;i=b--);

a+++b.


просто не пиши так...

W := PWord(pchar(@I) + 2)^;
и так - тоже :)


 
Separator ©   (2005-11-25 05:09) [45]


> Anatoly Podgoretsky ©   (24.11.05 22:56) [42]

Вы совершенно правы, весь мир пишет на VB или VBA и таким людям оочень трудно доказать, что в их задачах с большим эффектом можно можно использовать другие языки.


 
КаПиБаРа ©   (2005-11-25 06:15) [46]

Separator ©   (25.11.05 5:09) [45]
VB или VBA и таким людям оочень трудно доказать, что в их задачах с большим эффектом можно можно использовать другие языки.


Когда мне приходится писать на VBA то мне очень трудно доказать что на других языках эту задачу можно решить с больее эффективно.


 
Igorek ©   (2005-11-25 09:03) [47]


> Паскаль и С++ - различные понимания свободы?

Различные понимания необходимой и достаточной свободы.


 
noname_   (2005-11-25 09:35) [48]

Как можно называть ObjectPascal языком со строгим контролем типов, если в нем возможно присваивание объекту значения указателя, без явного приведения типа, например, в delphi до 7 версии, в следующем коде не будет не только ошибки, но и даже предупреждения от компилятора:

procedure TForm1.Button1Click(Sender: TObject);
var
 p: Pointer;
 e: TEdit;
begin
 p := Button1;
 e := p;
end;


 
Sandman29 ©   (2005-11-25 09:59) [49]

noname_   (25.11.05 09:35) [48]

e := TEdit(Pointer(Button1));

Вы написали то же самое.


 
Igorek ©   (2005-11-25 10:09) [50]


> Вы написали то же самое.

Нет.


 
Sandman29 ©   (2005-11-25 10:19) [51]

Igorek ©   (25.11.05 10:09) [50]

Только что проверил. Генерится одинаковый машинный код.


 
noname_   (2005-11-25 10:31) [52]

2 Sandman29 [49]

в моем коде нет явного преобразования типов.


 
umbra ©   (2005-11-25 10:34) [53]

2 noname_   (25.11.05 10:31) [52]

а что этот код делает? собственно ничего. вы попробуйте что нибудь сделать с полученным таким образом указателем


 
noname_   (2005-11-25 10:48) [54]

2 umbra [53]
> попробуйте что нибудь сделать с полученным таким образом указателем

в этом и состоит проблема - ObjectPascal позволяет присвоить объект одного типа объекту другого, без явного указания приведения типа.


 
Igorek ©   (2005-11-25 10:49) [55]


> Только что проверил. Генерится одинаковый машинный код.

Причем тут машинный код? Вы сказали "то же самое". А я вам говорю "нет". Так как
e := p;
Не то же самое, что
e := TEdit(Pointer(Button1));


 
Sandman29 ©   (2005-11-25 10:54) [56]

noname_   (25.11.05 10:31) [52]

в моем коде нет явного преобразования типов.

Присвоение Pointer"у зачем? Это явное действие, выполненное программистом.


 
Чапаев ©   (2005-11-25 10:58) [57]


> Далее мысль была расширена: строгая типизация и запрет прямых
> низкоуровневых операций плохи, т.к. ограничивают свободу.
>

В Паскале (который Обджект) я пишу: var s:string; ... MessageBox(...,PChar(S),...) -- и всё компилируется и работает... А к скольким типам придётся привести в Сях?

Некоторые товарищи мне приводят в пример: "Вот, на Си есть char, И он заменит Паскалевские и Byte, и Char, и ShortInt" (или SmallInt? Short, если брать "классический" борландовский Паскаль). Тогда контрвопрос... А на кой в Си char*, PAnsiChar, wchar_t*, LPSTR, LPCSTR, LPWSTR, указатели на три последних типа -- и всё это для обозначения строки???

Ах да, ещё есть COM со знаменитым BSTR...

ЗЫ. Мне споры о превосходстве "вообще" того или иного языка надоели ещё на втором курсе...


 
noname_   (2005-11-25 11:02) [58]

2 Sandman29 [56]
> Присвоение Pointer"у зачем? Это явное действие, выполненное программистом.

Можно ли считать присвоение Pointer"у явным указанием операции приведения типа?


 
Игорь Шевченко ©   (2005-11-25 11:02) [59]


> LPSTR, LPCSTR, LPWSTR


Это не в С. Учи матчасть.


 
Sandman29 ©   (2005-11-25 11:10) [60]

noname_   (25.11.05 11:02) [58]

Конечно. Я Pointer использую только когда мне лень смотреть описание справки в коде типа
var
 OldAfterScroll: Pointer;
...
 OldAfterScroll := DataSet.AfterScroll;
 DataSet.AfterScroll := nil;
 try
 ...
 finally
   DataSet.AfterScroll := OldAfterScroll;
 end;

и аналогичных случаях, когда тип не важен. Если тип важен, то никаких Pointer.


 
sniknik ©   (2005-11-25 11:20) [61]

> Можно ли считать присвоение Pointer"у явным указанием операции приведения типа?
да. однозначно, к неопределенному типу указателя.

в справке написано ...Pointer type can represent a pointer to any data...
т.е. это "чистый" указатель, на любые данные. естественно раз на любые то и контроль не производится. и именно поэтому (нет контроля)  это unsafe type использование которого предупреждение выдает. если не отключено.


 
адрес   (2005-11-25 11:21) [62]

Cи, Паскаль, Java лучший язык тот который ты лучше знаеш.


 
noname_   (2005-11-25 11:25) [63]

2 Sandman29 [60]

Не понимаю, как этот код вообще может работать SizeOf(TDataSetNotifyEvent) = 8, а SizeOf(Pointer) = 4, здесь я вижу еще более грубое нарушение типизации.


 
Sandman29 ©   (2005-11-25 11:31) [64]

noname_   (25.11.05 11:25) [63]

Извиняюсь, набредил.
Запустил сейчас поиск по всем своим проектам, Pointer используется вообще только при вызове AddObject(.., Pointer({longint}))


 
Bless ©   (2005-11-25 11:36) [65]


Sandman29 ©   (25.11.05 10:54) [56]
Присвоение Pointer"у зачем? Это явное действие, выполненное программистом.

Это да. А вот
e := p;
- тут делфи, имхо, мог бы и попросить привести pointer к TEdit явно. Ведь e - не нетипизированный указатель


 
noname_   (2005-11-25 11:38) [66]

2 sniknik [61]

Меня беспокоит не столько возможность присваивания Pointer := Object, сколько Object := Pointer, не всегда можно сразу понять какой тип имеет выражение в правой части оператора присваивания, и молчание компилятора может вызвать трудноуловимые ошибки.
То, о чем я писал в этом треде относится к Delphi 5, как подобные ситуации обрабатываются в последних версиях - я не знаю.


 
Sandman29 ©   (2005-11-25 11:53) [67]

Bless ©   (25.11.05 11:36) [65]
noname_   (25.11.05 11:38) [66]

Согласен. Self := @Self выглядит странно.


 
jack128 ©   (2005-11-25 12:11) [68]

noname_   (25.11.05 11:38) [66]
как подобные ситуации обрабатываются в последних версиях - я не знаю.

Так же. Вообще то все по справке. Но вообще да, наверно правельнее было бы писать  так:
e := TEdit(p);
Или так:
DoubleVar := Double(IntegerVar);  ;)


 
Суслик ©   (2005-11-25 12:13) [69]

не знаю о чем спор, но судя по всему, что в паскале сложнее наделать ошибок.

мое имхо, что ошибок можно наделать где угодно.


 
sniknik ©   (2005-11-25 12:21) [70]

> Меня беспокоит не столько возможность присваивания Pointer := Object, сколько Object := Pointer
если подумаеш то это две стороны одной монеты... если ты можеш сказать "вот этот указатель на обьект кнопки это не на кнопку, это указатель на ЧТОТО" то значит можеш и обратное "это ЧТОТО  не чтото это указатель на едит" (раз сам так решил. компилятор "потерял" тип в тот момент когда ты сделал его неопределенным, а как проверить неопределенное при присвоении конкретному? никак, поэтому и не проверяется)

> и молчание компилятора может вызвать трудноуловимые ошибки.
поэтому и рекомендуют использовать указатели на конкретные типы, и не использовать поинтер. а раз используеш значит, считается, знаеш что делаеш.


 
noname_   (2005-11-25 12:23) [71]

2 jack128 [68]
> DoubleVar := Double(IntegerVar);  ;)

это лишнее - множество действительных чисел включает в себя множество целых, и преобразование будет однозначным.


 
noname_   (2005-11-25 12:35) [72]

2 sniknik [70]

Да, действительно, придумать применение Pointer := Object без возможности Object := Pointer сложно 8-)

> поэтому и рекомендуют использовать указатели на конкретные типы и не использовать поинтер

было бы совсем хорошо, если бы эти рекомендации давал компилятор, а то получается что типобезопасноть языка определяется тем что написано в руководстве.


 
Igorek ©   (2005-11-25 12:38) [73]


> Да, действительно, придумать применение Pointer := Object
> без возможности Object := Pointer сложно 8-)

Pointer := nil;
При автоматической сборке мусора.


 
vlad_gri   (2005-11-25 13:00) [74]

Читаем старую книжку.
Стандартный тип-указатель Pointer дает указатель, не связанный ни с каким конкретным базовым типом. Этот тип совместим с любым другим типом-указателем, однако следует иметь в виду, что использование знака ^ после параметра типа Pointer дает параметр без типа (см. п. 10.3.4)


 
ZeroDivide ©   (2005-11-25 13:02) [75]

Эквивалентность типов в языках программирования бывает 2-х видов
1. Именная эквивалентность
2. Структурная эквивалентность

Например:

type
 xx = record
       z: Integer;
       s: String;
     end;
 yy = record
       z: Integer;
       s: String;
     end;
var
 z: xx;
 r: yy;
begin
 z := r;
end;

Можно ли z присвоить r ? Если нет, то это эквивалентность 1-го типа, если можно, то 2-го.
Изначально, в спецификации языка Паскаль, небыло выбрано ни одного варианта!!! Таким образом, принятие решения о выборе типа эквивалентности лежало на разработчиках компилятора. В итоге вот имеем....



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

Текущий архив: 2005.12.18;
Скачать: CL | DM;

Наверх




Память: 0.62 MB
Время: 0.032 c
1-1132585085
Officeman
2005-11-21 17:58
2005.12.18
ГЛЮКИ


4-1129271146
Roughneck
2005-10-14 10:25
2005.12.18
CreateProcessAsUser или CreateProcessWithLogonW


5-1116502039
andrey__
2005-05-19 15:27
2005.12.18
Как в DBGrid ячейку вставить CheckBox


14-1132743322
oleggar
2005-11-23 13:55
2005.12.18
codebase


2-1133467887
sedot
2005-12-01 23:11
2005.12.18
Работа с текстовыми файлами