Текущий архив: 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