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

Вниз

---|Ветка была без названия|---   Найти похожие ветки 

 
MOA   (2003-06-20 15:00) [120]

Понял! Вы имели в ввиду именно String! Тогда беру свои слова обратно. Действительно, аналог там выглядит как
STRING: PACKED ARRAY [1..STRGLGTH] OF CHAR;


 
MOA   (2003-06-20 15:19) [121]

type
PNode=^Node;
Node = record
a : Integer;
p: PNode;
end;
var
St1, St2 : Node;
...
begin
New(St1);
St1^.a := 1;
St1^.p := nil;
New(St2);
St2^.a := 1;
St2^.p := nil;
{сравниваем по значениям}
if St1 = St2 then {тут всё никаких противоречий пока нет - одинаковы}
New(St1^.p);
St1^.p^.a := 1;
St1^.p^.p := nil;
New(St2^.p);
St2^.p^.a := 1;
St2^.p^.p := nil;
if St1 = St2 then {теперь, если сравнивать по "значениям", необходимо просмотреть ссылку из p, и убедиться, что значения структур одинаковы.}
New(St1^.p^.p);
...

И так далее. Т.е., чтобы "по честному" сравнить структуры "по значениям", необходимо бегать по ссылкам из структуры, причём рекурсивно.


 
VD601   (2003-06-20 15:30) [122]

Мне не хватает volatile переменных.

На счет {$J+}. Спасибо всем ответившим.


 
euru   (2003-06-20 15:46) [123]

Не хватает:
поля класса, конструктор класса бы не помешали;
возможность создавать объекты не только динамически, но и статически

Было бы не лишне:
++ += и т.д. - просто так удобнее;
объявлять локальные переменные по мере необходимости;


Про with:
в VB, по-моему хорошо придумали - можно было бы их идею взять

with Obj do begin
.Var1 := 0; // Obj.Var1 := 0
Proc(.Var2) // Proc(Obj.Var2);
...
end;


 
DiamondShark   (2003-06-20 15:50) [124]

Оператор сравнения для структур будет (тем более "честный" по MOA © (20.06.03 15:19)) будет вносить замаскированную сложность. Это противоречит духу паскаля.
Кроме того, что он будет делать, если в структуре попадётся интерфейсная или объектная ссылка?

Вывод: нафиг.


 
uw   (2003-06-20 16:14) [125]

>MOA © (20.06.03 15:19)

Очевидно,
St1, St2: PNode;

А сравнивать можно либо так St1 = St2, либо так St1^ = St1^ побитно. Все, как и в простых типах.

>DiamondShark © (20.06.03 15:50)

Так ведь присваивать тебе никто не запретил со всеми этими прибамбасами. Впрочем, если на фиг, то и ладно - все равно ничего не изменишь.


 
Anatoly Podgoretsky   (2003-06-20 16:20) [126]

euru © (20.06.03 15:46)
Ты что просишь добавить точку, нафиг, нафиг.


 
uw   (2003-06-20 16:26) [127]

>Anatoly Podgoretsky © (20.06.03 16:20)

Точно. От разыменовывания освободились в большинстве случаев, слава Богу!


 
euru   (2003-06-20 16:35) [128]

>Anatoly Podgoretsky © (20.06.03 16:20)
>Ты что просишь добавить точку, нафиг, нафиг.

:) Да, вторую точку добавить сложно будет. Но ведь еще не задействован восклицательный знак!

А если серьезно, мне вариант .Var нравится больше, чем this.Var

Кстати, забыл написать чего не:
макросы
шаблоны
перегрузку операторов

Просто нужно по-человечески организовать работу с классами и элементарными типами.


 
McSimm   (2003-06-20 16:40) [129]

>А если серьезно, мне вариант .Var нравится больше, чем this.Var

И вместо .Var и вместо this.Var мы используем просто Var :)))

with Obj do begin
Var1 := 0; // Obj.Var1 := 0
Proc(Var2) // Proc(Obj.Var2);
...
end;

Речь шла об использовании Obj


 
euru   (2003-06-20 16:54) [130]

>McSimm © (20.06.03 16:40)

Точно. Невнимательно прочел.
Тогда так:

var
Obj: TObject;
begin
...
with (Obj := SomeObj.SomeProperty[SomeIndex]) do
if Assigned(Obj) then Obj.SomeMethod(....


Преимущества:
1. не нужно вводить еще одно ключевое слово
2. возможность использовать тот же способ напр. в if


 
MOA   (2003-06-20 16:56) [131]

>++ +=
А тут, IMHO, сложность принципиальная. Дело в том, что в С выражения - это l-value, и это одна из задумок языка (выдумали его после Паскаля). А в Паскале - нет. Введение ++ и т.д. сделает из Паскаля С, причём с усложнённым и противоречивым синтаксисом - лучше уж тогда и писать на С,++, #. Кстати, делегаты в остром С чем-то даже и понравились - м.б., из-того, что дело дальше проб пока и не пошло.
А вот перегрузка операций и стаческие переменные, наверное, и впрямь не помешали бы. Впрочем, надо подумать, с какими принципиальными ограничениями Паскаля столкнулись Борланды при попытке реализации подобной возможности - ведь это до сих пор не сделано?


 
Demiurg   (2003-06-20 17:08) [132]

Бред, конечно, но еще и код мне твой не понравился. Ненавижу когда begin"ы в концах строк ставят, потом задолбаешься начало блока искать.


 
McSimm   (2003-06-20 17:15) [133]

>euru © (20.06.03 16:54)
Это же можно записать так:
Obj := SomeObj.SomeProperty[SomeIndex];
with (Obj) do
собственно, так и приходится зачастую делать.

>не нужно вводить еще одно ключевое слово
Result ввели, кто от этого пострадал? Удобно же. Все только выиграли.


 
euru   (2003-06-20 17:42) [134]

>MOA © (20.06.03 16:56)
Объектов тоже изначально в паскале не было и со строками он не работал. Тем более, что начиная с Delphi 7, это уже другой язык, если судить по названию. Можно было бы и подумать, как это сделать :).
C# руками пока не трогал, но по описанию он идеологически очень похож на Delphi.
Шаблоны, по-моему, все-таки не нужны в принципе.
См.

McSimm © (20.06.03 17:15)
Тогда так:

with (Obj: TObject := SomeObj.SomeProperty[SomeIndex]) do


И даже вот так :)

with(
n: Integer := SomeObj.SomeProperty[SomeIndex],
o: TObject := SomeObj.SomeProperty[SomeIndex]
) do begin
o.SomeMethod(n)
end;



 
euru   (2003-06-20 17:45) [135]

McSimm © (20.06.03 17:15)

ошибочка

with(
n: Integer := SomeObj.SomeProperty[SomeIndex],
o: TObject := SomeObj.SomeAnotherProperty[SomeIndex]
) do begin
o.SomeMethod(n)
end;


 
DiamondShark   (2003-06-20 18:25) [136]


> uw © (20.06.03 16:14)

Присваивание пришло из стандартного паскаля. Там таких проблем не было. Пришлось Борланду попыхтеть с автоматическими типами (string, variant, interface, array).

И не надо думать, что Вирт, создавая язык, что-то пропустил по причине "ну его нафиг", "в лом" или просто недоглядев. В стандартном паскале есть один момент -- записи с вариантами. Вот пример:
type
TVariantRec = record
A, B: integer;
case Selector: integer of
0: (I: integer);
1: (S: packed array[0..10] of char)
end;

Во-первых, непонятно, как поступать в случае неинициализированных значений или, ещё круче, неименованного селектора, но это ещё не самое страшное.
type
PVariantRec = ^TVariantRec;
var
W, V: PVariantRec;
begin
new(W, 0); (* выделяем память под целое *)
new(V, 1); (* выделяем память под массив*)

Как теперь сравнить W^ и V^? При том, что формально они имеют один тип, физически им выделены разные объёмы памяти! Хорошо, если у нас есть поле-селектор, можно заставить компилятор генерить код по проверке сначала поля-селектора, а в случае совпадения и всего остального. А если селектор анонимный? Вводить кучу правил-исключений применимости операторов?

Кстати, в Обероне, где введена возможность наследования записей и ограничение видимости полей присваивание исключено.
____________________________________________________________

По поводу операций ++, --, += и т.п.
Предлагаю тем, кому их "жизненно не хватает" шуточный тест:
#include <stdio.h>
void main()
{
int C;
C = 0;
printf("Что круче, C или C++?\n");
if (C++ > C) printf("Конечно же С++!\n");
else if (C > C++) printf("Всё же С лучше.\n");
else printf("Не знаю :-( Попробуй паскаль.\n");
}

Отвечайте, что напечатает программа? Только быстро!


 
Sandman25   (2003-06-20 18:42) [137]

>При том, что формально они имеют один тип, физически им выделены разные объёмы памяти!

Нет.


 
SPeller   (2003-06-20 18:47) [138]

Паскаль


 
uw   (2003-06-20 18:48) [139]

"Не знаю :-( Попробуй паскаль.\n"


 
MOA   (2003-06-20 18:52) [140]

>C# ... по описанию он идеологически очень похож на Delphi.
Что не удивильно - его делал тот же человек, который делал Делфы ;). Борланды, если мне память не изменяет, по поводу его переманивания даже хотели судиться с мелкомягкими.


 
uw   (2003-06-20 19:02) [141]

>DiamondShark © (20.06.03 18:25)

Запись с вариантами всегда занимает максимум памяти.
А это что такое?
new(W, 0);



 
uw   (2003-06-20 19:22) [142]

>DiamondShark © (20.06.03 18:25)

Да, правильно - запись с вариантами не сравнишь: мусор может быть разный. Поэтому и все остальные сложные типы сравнивать нельзя. Точка.


 
DiamondShark   (2003-06-20 20:35) [143]


> Sandman25 © (20.06.03 18:42)
> uw © (20.06.03 19:02)


Я ж про виртовский паскаль говорил.
В процедуре NEW можно указать значения селекторов для выделения памяти только под нужный вариант.

См. К.Йенсен, Н.Вирт. "Паскаль. Сообщение. Описание языка."


 
Sha   (2003-06-20 22:38) [144]

Иногда требуется изобразить что-нибудь типа:
if <условие1> then <оператор1>
else or <условие2> then <оператор2>;

или
if <условие1> then <оператор1>
else and <условие2> then <оператор2>;

если, конечно, понятно, что я имел ввиду :))


 
Sha   (2003-06-20 23:26) [145]

Sha © (20.06.03 22:38)
Извиняюсь, нужно только первое, второе уже есть.



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

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

Наверх




Память: 0.76 MB
Время: 0.013 c
1-20108
BlackSun
2003-06-23 15:07
2003.07.07
Наследник TMemo


14-20228
Snake2000
2003-06-19 09:35
2003.07.07
2-й курс канул в лету !!!


14-20299
SemFLY
2003-06-19 09:16
2003.07.07
Проблема с WinRoute 5.0.4 ...


1-20033
VitaL
2003-06-24 03:28
2003.07.07
Как добавить иконку в трей


1-20135
INCOGNITO
2003-06-25 04:37
2003.07.07
ReadOnly в ComboBox и ещё пара вопросов





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