Текущий архив: 2003.07.07;
Скачать: CL | DM;
Вниз
---|Ветка была без названия|--- Найти похожие ветки
← →
Кен © (2003-06-18 02:27) [80]> blackweber © (17.06.03 08:58)
> > Кен ©
> Вроде человек с высшим образованием(если верить анкете,
> хотя я что-то сомневаюсь), а такую фигню лепишь.
> Значит рано писать шахматы, раз с массивами не справиться.
Надо же ! Для меня новость, что у меня в анкете написано такое. Я не писал этого. Мастаки шутят наверное.
Обычно я правды о себе в Интернете нигде не пишу. Нехочу весь мир о себе информировать ?
> Юрий Зотов © (17.06.03 09:16)
> > Кен
>
> Извините, сразу видно, что на старых языках Вы не работали.
> Не горевать, а радоваться надо, что при выходе за границы
> массива возникает ошибка. Даже если, как Вы предлагаете,
> такие попытки игнорировать, программа все равно будет работать
> неверно, только вот причину Вы будете искать очень долго.
> А тут Вам на блюдечке преподносят и причину, и место ошибки.
>
> Паскаль тем и хорош, что вопит по любому поводу. Если бы
> этого не было, ошибок в программах было бы на порядок больше,
> а искать их было бы на порядок сложнее. Такую фичу ценить,
> а не ругать нужно.
Тогда как управлять ошибками ? Чтобы отделять эти ошибки от других и их игнорировать. Чую, что что то через try . Но как именно ?
> Юрий Зотов © (17.06.03 10:48)
> > статические переменные с областью видимости - функция
> (метод),
> > а не модуль...
>
> А как насчет вот этого:
>
> function A: integer;
> const
> MyVar: Integer = 0;
> begin
> Inc(MyVar);
> Result := MyVar
> end;
А как в этом случае сделать A := 0; ?
> Mystic © (17.06.03 11:42)
> Кстати, при напиании шашек (то же относится и к шахматам)
> проверка на выход за пределы массива пишется не один десяток
> раз вручную...
О том и речь, что неудобно это.
> VD601 (17.06.03 21:16)
> ЮЗ, не пойму вашу фичу с Inc(MyVar). Компилятор вполне законно
> ругается Left side cannot be assgned to.
Вот так вот вроде.
{$J+}
function A: integer;
const
MyVar: Integer = 0;
begin
Inc(MyVar);
Result := MyVar
end;
← →
Думкин © (2003-06-18 05:26) [81]
> Кен © (18.06.03 02:27)
Еще и издеваешься? Без тебя жарко - а ты прежде чем постить глупости сядь и посчитай ло десяти.
← →
uw © (2003-06-18 08:40) [82]>> Юрий Зотов © (17.06.03 10:48)
>> А как насчет вот этого:
>>
>> function A: integer;
>> const
>> MyVar: Integer = 0;
>> begin
>> Inc(MyVar);
>> Result := MyVar
>> end;
>А как в этом случае сделать A := 0; ?
Я тоже с нетерпением жду ответа на этот вопрос!
← →
Юрий Зотов © (2003-06-18 09:20) [83]> uw © (18.06.03 08:40)
Елы-палы, это сложно.
> Кен
Действительно, а как же сделать A := 0? Как Вы думаете?
← →
stone © (2003-06-18 09:22) [84]
> Fantasist. (18.06.03 01:11)
> А вообще, не хватает try ... except ... finally ... end;
> как в Java. Есть либо try/except, либо try/finally. А так
> как в Delphi автоматических объектов нету, приходиться извращаться
> типа:
> obj:=TObj.Create;
> try
> obj.DoWork;
> except
> on e:exception do
> begin
> Log(e); //рапортуем об ошибке
> obj.Free; //освобождаем
> end;
> end;
> obj.Free;
А развет так нельзя?
obj:=TObj.Create;
try
obj.DoWork;
except
on e:exception do
Log(e); //рапортуем об ошибке
end;
obj.Free;
← →
KSergey © (2003-06-18 09:22) [85]> uw © (18.06.03 08:40)
От кого, интересно? ;)
← →
Danilka © (2003-06-18 09:25) [86]function A(clear: boolean): integer;
const
MyVar: Integer = 0;
begin
if clear then Dec(MyVar,MyVar)
else Inc(MyVar);
Result := MyVar
end;
:))
← →
[NIKEL] © (2003-06-18 09:29) [87]вобщем, судя по постам, можно сказать, что вам всем надо переходить на C++ :)))))))))
← →
stone © (2003-06-18 09:37) [88]Fantasist. (18.06.03 01:11)
И в догонку. Приведенный тобой код в случае Exception выдаст "отсос виолейшн", так как Obj.Free будет вызвано 2 раза.
← →
Danilka © (2003-06-18 09:39) [89]stone © (18.06.03 09:37)
может, просто очепятка, забыл raise добавить.
← →
sudiv © (2003-06-18 10:04) [90]> Действительно, а как же сделать A := 0? Как Вы думаете?
8-)))
← →
uw © (2003-06-18 10:10) [91]>Danilka © (18.06.03 09:25)
Предлагаю усовершенствование:
function AA(clear: boolean = False): integer;
const
MyVar: Integer = 0;
begin
if clear then MyVar:=0;
else Inc(MyVar);
Result := MyVar;
end;
← →
uw © (2003-06-18 10:12) [92]И еще одно:
function AA(clear: boolean = False): integer;
const
MyVar: Integer = 0;
begin
if clear then MyVar:=0
else Inc(MyVar);
Result := MyVar;
end;
← →
Danilka © (2003-06-18 10:25) [93]uw ©
согласен на усовершенствования. :))
← →
k-man © (2003-06-18 10:46) [94]
> Обычно я правды о себе в Интернете нигде не пишу. Нехочу
> весь мир о себе информировать ?
Ха-Ха! Да кому ты нахрен нужен!
А правды не надо говорить, так как чуется она горькая...
← →
Sandman25 © (2003-06-18 12:39) [95]function A: integer;
const
MyVar: Integer = 0;
begin
Result := MyVar;
Inc(MyVar);
end
← →
uw © (2003-06-18 13:14) [96]>Sandman25 © (18.06.03 12:39)
Не, ты немного не догоняешь. У нас с Кеном и Danilkой более тонкая материя рассматривается!
← →
Юрий Зотов © (2003-06-18 13:54) [97]Лотерея - ставлю пиво тому, кто напишет 8-ю версию функции A. Четыре уже есть. Сделай Дью!
← →
Mystic © (2003-06-18 14:17) [98]
> MalkoLinge © (17.06.03 16:43)
> перегрузка операторов.
> В частности перегрузка AS а еще лучне перегрузка опасного
> приведения типов !!!!!!!!!!!!!!!
А зачем? Можно добавить много новых фичей, которыми будет возникать соблазн воспользоваться... А потом? Как разгребать чужой код?
Кстати, Delphi мне нравится как раз тем, что подобные фичи отсутсвуют, для этого есть C++.
← →
MalkoLinge © (2003-06-18 15:14) [99]
> А зачем? Можно добавить много новых фичей, которыми будет
> возникать соблазн воспользоваться... А потом? Как разгребать
> чужой код?
>
> Кстати, Delphi мне нравится как раз тем, что подобные фичи
> отсутсвуют, для этого есть C++.
Я ж не сказал, что хочу чтоб это ввели..Мы придумали другое решение, но я просто ответил на вопрос, чего мне не хватает :)))
← →
han_malign © (2003-06-18 15:19) [100]>P[i,j+1]:="Пешка";
function A: integer;
const
MyVar: Integer = 0;
begin
MyVar:=Succ(MyVar) and 3;
Result := MyVar;
end;
P[i,A]:="Пешка";
(может кому обломится (Юрий Зотов ©):)))
З.Ы. Естественно это чушь, но направление задано (а еще есть mod, на случай если размерность массива не степень двойки)
З.З.Ы. P[i,j]:="Пусто"; P[i,j+1]:="Пешка";
- то есть, для j=7(для массива 0..7), с игнорированием выхода за границы(и автоматическим отловом засирания памяти(не факт что будет сразу AV, вернее будет, но позже и в другом месте)), получаются казацкие шахматы, или, не помню, как это в детсве называли - когда фигуры сбиваются щелчком пальца...
← →
Sandman25 © (2003-06-18 15:49) [101]"Тонкая материя"... :)
function A(NoReset:integer = $FFFFFFFF): integer;
const
MyVar: Integer = 0;
begin
MyVar := NoReset and MyVar;
Result := MyVar;
Inc(MyVar);
end
← →
Danilka © (2003-06-18 15:56) [102]так, осталась пара вариантов, последний получает пиво, интересно, подождать до утра или прямо сейчас написать?
нет, лучше подожду, пора домой :))
← →
DiamondShark © (2003-06-18 15:57) [103]Люди, вы это о чём, а?
← →
Danilka © (2003-06-18 15:58) [104]DiamondShark © (18.06.03 15:57)
Мы о халявном пиве, см:
Юрий Зотов © (18.06.03 13:54)
:))
← →
MOA © (2003-06-18 16:26) [105]>Вот что мне не хватает! Простое сравнение 2- записей. Не по полям или побайтным сравнением, а нормальным if Rec1=Rec2 then(записи ессно однотипные). Объясните кто-нибудь почему этого еще в паскале небыло? Присваивать записи можно, а сравнивать(естесственно сравнивать на равенство) низзя?
Например, в записи есть поле "указатель на строку". Записи считаются одинаковыми, когда равны указатели, или когда содержимое строк одинаково? - Получается, 2 оператора проверки на равенство. (Причём, в первом случае можно проста сравнить два куска памяти). А если поле - указатель на запись, в которой есть указатель на строки. Когда в этом случае считать записи "равными"? - Это потребует внесения в язык сущностей и понятий таких, которые сделают его уже и не Паскалем.
← →
D@rk © (2003-06-18 16:28) [106]2 Кен ©
> Поэтому программирование в Дельфи напоминает общение с душевнобольным,
> которому приходится растолковывать очевидные вещи.
Ну и не общайся!!
← →
han_malign © (2003-06-18 16:34) [107]> напоминает общение с душевнобольным
- сумасшедший всегда уверен, что здоров как раз он...
← →
uw © (2003-06-18 16:52) [108]>MOA © (18.06.03 16:26)
Я посмотрел копирование записей типа
record
i: Integer;
s: String;
end;
оператором r1 := r2; и увидел, что идет проверка, было ли присвоение полю s и т.д. Казалось бы, что так можо было бы и сравнивать.
← →
MOA © (2003-06-18 17:01) [109]Имеется в виду
record
i: Integer;
s: String^;
end;
Считать записи одинаковыми, если одинаковы указатели, или строки с одинаковым содержимым. Ну и так далее (указатель на структуру со строкой - одинаковы должны быть указатели, или структуры должны содержать строки "конгруэнтные" строки. Языки, позволяющие сравнивать на "равенство" структуры, обязательно проводят разграничение этих случаев, и операторы эквивалентности разные. При этом в язык приходится вводить дополнительные сущности и понятия.
← →
Soft © (2003-06-18 17:14) [110]>>[NIKEL] © (18.06.03 09:29)
>>вобщем, судя по постам, можно сказать, что вам всем надо переходить на C++ :)))))))))
Вот и я говорю, что на Linux:)))
← →
SPeller © (2003-06-18 17:38) [111]function A: Integer;
const MyVar: Integer = 0;
begin
if MessageBox( "Увеличить?", MB_YES or MB_NO ) = MB_YES then begin
Inc( MyVar );
end else begin
if MessageBox( "Уменьшить?", MB_YES or MB_NO ) = MB_YES then begin
Dec( MyVar );
end else begin
if MessageBox( "Обнулить?", MB_YES or MB_NO ) = MB)YES then begin
Halt( 0 );
end;
end;
end;
Result := MyVar;
end
← →
uw © (2003-06-18 18:13) [112]>MOA © (18.06.03 17:01)
Нет, я говорил именно про String как динамическую строку, что по сути есть указатель. Если речь идет об указателях, то Паскаль решает эту проблему однозначно: он сравнивает их (если они совместимы по типу), а не то, на что они указывают, и никакой конгруэнтности -if p1 <> p2 then
. Если указатели встречаются в записи, то тоже никаких проблем могло бы не быть, если бы Вирт допускал синтаксис сравнения записей, но он по какой-то причине этого не сделал. А строк у него вообще не было.
В Delphi есть строки, и компилятор и RTL делают много телодвижений при работе с ними (Вирт и не предусмотрел их, чтобы упростить компилятор). Могли бы поработать и со строками в записях, как при присваивании. Можно было бы ввести специально для строк флажок конгруэнтности. Но этого не сделано, видимо, по религиозным соображениям.
← →
SPeller © (2003-06-19 00:43) [113]А что вам мешает определить свою функцию и сравнивать эти самые записи как вашей душе заблагорассудится? И компилятору проще и вам спокойней будет.
← →
SPeller © (2003-06-19 09:44) [114]Эй! Народ! А где пиво??? ;)
← →
Кен © (2003-06-20 02:25) [115]> Mystic © (17.06.03 11:42)
> 2 Кен
>
> Наслаждайся
>
> procedure TForm1.Button1Click(Sender: TObject);
> var
> J: Integer;
> Dummy1: array[0..19] of Integer;
> Dummy2: array of Integer;
> begin
> SetLength(Dummy2, 20);
> {$R-}
> J := 10;
> Dummy1[J] := 11;
> Dummy2[J] := 11;
> {$R+}
> end;
>
> транслируется в
>
> MOV EAX, 10
> MOV [EBP+EAX*4-54h], 11
> MOV EDX, [EBP-4]
> MOV [EDX+EAX*4], 11
>
> Один раз в C ошибку выхода за пределы массива ловил неделю
> (оказалась в чужом коде). Всего-то на один элемент!
Третий раз перечитываю тему и пытаюсь осмыслить этот код.
Непойму на какую он тему ? Откуда тут можнет быть ошибка выхода за предел массива ?
← →
MOA © (2003-06-20 13:41) [116]Ну, вроде в Паскале строки-то были с самого начала.
>этого не сделано, видимо, по религиозным соображениям
Предположим, мы собрались вводить оператор сравенинея (на равенство) структур, т.е if struc1 = struc2 then.... - так он, наверное, должен выглядеть.Рассмотрим структуру "список":
record Node
Value : Integer;
Next : ^Node;
end;
....
struc1, struc2 : Node; // -это головы списков
Пусть В списках 2 узла (вместе со strucN), поле Value - везде одно и тоже, но сами узлы (соответственно, указатели на них) - разные. Оператор сравнения что должен выдать? Если "истина" - то как же сравнить именно эквивалентность (не "конгруэнтность) struc1 и struc2. Если "ложь" - оператор "=" получается, действует по-разному для скаляров (где проверяется не адрес, а именно значение) и записей. Ну ладно, думаем мы, пусть по-разному. Хорошо. Добавим ещё по одному (одинаковому) элементу в оба списка (теперь указатели указывают на разные структуры, в смысле их содержания, но на одинаковые, в смысле "значений"). Оператор сравнения должен анализировать и эти узлы? Т.е. компилятор при операциях сравнения должен ходить по ссылкам до тех пор, пока не увидит nil? А если это цикл? А если это многосвязный список?
Вот, IMHO, те религиозные соображения, которые не позволяют сравнивать структуры (не побитово, а по значениям). Обратим внимание - ни в одном императивном языке программирования оператора сравнения структур "не-побитово" нет! И, напротив, в языках функционального программирования, в которых список - одна из основ самого языка - есть.
← →
uw © (2003-06-20 13:59) [117]>MOA © (20.06.03 13:41)
У Вирта строк не было.
var
i, j: ^Integer;
a, b: Integer;
bool: Boolean;
begin
a := 17; b := 17;
i := @a; j := @b;
bool := (i^ = j^); //bool = True;
bool := (i = j); //bool = False;
end;
Это хорошо или плохо? Пусть так же было бы и при сравнении структур. Если там что-то не так, то напиши пример, который бы иллюстрировал проблему, из приведенного описания я не понял.
← →
MOA © (2003-06-20 14:48) [118]>У Вирта строк не было.
По-крайней мере в реализации стандартного Паскаля на Unix V 5 в 1985 году они были. Однако, я не поленился, и нашёл вот тут ( http://www.threedee.com/jcm/psystem/) исходники одного из первых интерпретаторов Паскаля на Паскале из рук самого Вирта (1974 год - прошдо 3 года с момента рождения, это одна из первых реализаций Паскаля на Паскале, как я понял английский ;).
Впрочем, вот цитата оттуда:
Circa 1973 Pascal compiler source code
In July 1997, Huw Davies of the La Trobe University in Melbourne, Australia sent me the source code to Jensen & Wirth"s Pascal assembler and interpreter, "pasint.pas" circa March 15, 1973, and the "modified step 5" compiler "pcomp.pas" circa May 20, 1974. Shift-click here to get a 39K Zip file of it.
Ссылка на этот зип: ( http://www.threedee.com/jcm/psystem/p2.zip) - он малюсенький, можно распаковать и убедиться, что строки были. Да а впрямь - а как же без них?
Чуть позже про сравнение структур попробую поподробнее ;)
← →
uw © (2003-06-20 14:56) [119]>MOA © (20.06.03 14:48)
Интересно, посмотрю дома книжку Йенсена и Вирта. Помню сроковые константы и packed array[n] of Char. Здесь - действительно STRING.
← →
MOA © (2003-06-20 15:00) [120]Понял! Вы имели в ввиду именно String! Тогда беру свои слова обратно. Действительно, аналог там выглядит как
STRING: PACKED ARRAY [1..STRGLGTH] OF CHAR;
Страницы: 1 2 3 4 вся ветка
Текущий архив: 2003.07.07;
Скачать: CL | DM;
Память: 0.72 MB
Время: 0.032 c