Текущий архив: 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.61 MB
Время: 0.016 c