Главная страница
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.79 MB
Время: 0.022 c
3-19971
tamara
2003-06-10 16:57
2003.07.07
MSSQL2000


1-20109
Goga
2003-06-24 10:41
2003.07.07
Подскажите, как реализовать обратный вызов от MIDAS сервера


11-20029
blackalex
2002-10-29 15:28
2003.07.07
@Gandalf : TMHFontDialog


3-19967
alex nosik
2003-06-12 11:29
2003.07.07
Как программно в Delphi создать базу на удаленном IB 6 ?


4-20363
atruhin
2003-05-05 12:51
2003.07.07
Service NT помогите! Срочно! Пожалуйста!