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

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.62 MB
Время: 0.013 c
1-1132916785
Tristania
2005-11-25 14:06
2005.12.18
Помогите с компиляцией


3-1130410688
Александр_н
2005-10-27 14:58
2005.12.18
Создание базы даннх программным путём


6-1125860805
Станислав
2005-09-04 23:06
2005.12.18
сетевая игра :)


2-1133790627
adamov_a
2005-12-05 16:50
2005.12.18
StringGrid - как получить содержимое выделенных ячеек


9-1116337250
Lexmark
2005-05-17 17:40
2005.12.18
Как можно перетащить модели из игр!





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