Текущий архив: 2003.07.07;
Скачать: CL | DM;
Вниз
---|Ветка была без названия|--- Найти похожие ветки
← →
Кен (2003-06-17 04:21) [0]А каких языковых конструкций в Дельфи вам нехватает ?
Вроде бы всего хватает. А из любой сложной ситуации можно вывернуться и использовать уже имеющиеся конструкции. Например.
Сколько раз вы писали такое :
var i : Integer;
...
for i:=0 to Memo1.Lines.Count-1 do begin
...
end;
или такое для массива 10 на 10
var
i, j : Integer;
...
for i := 1 to 10 do begin
for j := 1 to 10 do begin
end;
end;
А что будет если массив не двухмерный, а пятимерный ?
Почему была бы удобна языковая конструкции, которая бы позволяла просто перебрать все элементы подряд. Было бы удобно, понятно и код бы сократился.
Или может такая конструкция есть, а я просто не знаю ? Подскажите тогда.
------------
Дальше. Допустим вы пишете крестики-нолики, шахматы, шашки или нечто подобное. Сколько раз вы делаете проверки на выходы за пределы массива ? ... Думаю огромное колличество раз. Или пользуетесь финтами всякими чтобы эту проблему решить. Но почему сам Дельфи не понимает, что все попытки выхода за пределы массива надо не считать ошибками, а игнорировать ?
Можно конечно извернуться и писать код так, чтобы вообще не возникало проблемы выхода за пределы доски. Но это ненормальный подход. Нормальный подход - это описание общих правил для каждой фигуры. Общее правило для пешки : пешка может ходить на одну клетку вперёд. Всё.
Потому, что любому умственнополноценному человеку ясно, что если доска кончилась, то ходить дальше нельзя. Даже если очень хочется, то просто нету клетки, чтобы поставить фигуру. А вот Дельфи, если массив кончился, то непонятно что ходить дальше нельзя и он выдаёт ошибку. Поэтому программирование в Дельфи напоминает общение с душевнобольным, которому приходится растолковывать очевидные вещи.
Разве не так ?
Или может такие конструкции тоже есть, но я о них не знаю ? Тогда просвятите меня.
---------
Кто ещё чего об этом думает ?
← →
АлексейК (2003-06-17 05:10) [1]> Но почему сам Дельфи не понимает, что все попытки выхода за пределы массива надо не считать ошибками, а игнорировать ?
Отключи контроль будет игнорировать, хотя ошибка от этого в приложении не исчезнет.
> Можно конечно извернуться и писать код так, чтобы вообще не возникало проблемы выхода за пределы доски. Но это ненормальный подход. Нормальный подход - это описание общих правил для каждой фигуры. Общее правило для пешки : пешка может ходить на одну клетку вперёд. Всё.
Интерсно как это вообще понять. Наверное мысли он твои должен угадывать и преобразовывать в машинный код.
> А вот Дельфи, если массив кончился, то непонятно что ходить дальше нельзя и он выдаёт ошибку.
А что ей остается делать если ты обращаешся к тому чего нет?
> Поэтому программирование в Дельфи напоминает общение с душевнобольным, которому приходится растолковывать очевидные вещи.
Разве не так ?
Полный бред.
← →
Palladin (2003-06-17 05:13) [2]я думаю что ты бредишь...
← →
[NIKEL] (2003-06-17 05:37) [3]ей богу...
ну неужели не понятно, что надо программировать!
а не бросил кнопку на форму и все...
создаешь класс(доска, пешки) и описываешь его, что должен делать этот объект, как ходить и тд
один базовый класс - фигура, для него несколько виртуальных методов - типа Move(ходить), Check (проверка, куда ходить можно)
и т.д. а от него наследуешь остальные фигуры - пешки, короли, кони, и в них реализуешь все что надо, и тогда и доска сама будет говорить можно ли данной фигуре ходить туда или сюда...
короче надо программировать а не задираться - Object Pascal и так достаточно выверенный язык...
короче флейм
← →
Palladin (2003-06-17 05:41) [4]по поводу массивов мысль конечно немного отличается направленностью от остальной чуши, но дальше того "А как?" ты не пошел, даже подумать не соизволил, лишь предложил, что бы когда нибудь такое ввели в язык...
мне интересно, считаешь ли ты себя в таком случае вообще программистом?
две три недели назад на конференции "Общие вопросы", я писал функции работы с N мерными массивами, размерность которых задается в run-time, если хочешь можешь найти и посмотреть как это реализуется...
правда там не было функции для прогона массива в цикле, но ее не сложно организовать при помощи рекурсии...
это, к твоему сведению, называется алгоритмизация , тоесть программирование
← →
vidiv (2003-06-17 05:50) [5]А мне такой конструкции не хватает
var s:string;
...
begin
... // заполняю s
case s of
"str1": ...;
"srt2": ...;
else
...
end;
Для строк case не работает... а жаль... приходится IFами выкручитваться... может есть директива компилятора какаянить?
← →
Кен (2003-06-17 06:07) [6]> АлексейК (17.06.03 05:10)
> >А вот Дельфи, если массив кончился, то непонятно что ходить
> дальше нельзя и он выдаёт ошибку.
> А что ей остается делать если ты обращаешся к тому чего
> нет?
Игнорировать. Просто не выполнять ничего вызывающего такие ошибки.
Допустим вы описываете ход пешки. Вы не знаете где она стоит. Вы просто пишите что нибудь типа P[i,j]:="Пусто"; P[i,j+1]:="Пешка";
Старые её координаты i,j , новые i,j+1 . Всё вроде бы хорошо, но как сделать так, чтобы вас не доставала ошибка выхода за пределы доски ? Чтобы не описывать бесконечные проверки на выход за её пределы ?
> Отключи контроль будет игнорировать, хотя ошибка от этого
> в приложении не исчезнет.
А какой командой он отключается ?
> [NIKEL] © (17.06.03 05:37)
> ей богу...
>
> ну неужели не понятно, что надо программировать!
> а не бросил кнопку на форму и все...
А что по вашему означает "программировать" ? Это обязательно чисание гланд через ж**у ? Тогда пишите на чистом ассемблере.
На то и придуманы языки высокого уровня, чтобы этот процесс облегчить.
> один базовый класс - фигура, для него несколько виртуальных
> методов - типа Move(ходить), Check (проверка, куда ходить
> можно)
Да, только без описания чека для выхода за пределы массива можно ? Может Дельфи это само понять ? Можно этот Чек встроить в сам массив ? Навсегда ! Чтобы он исчез и не доставал меня никогда больше ?
← →
Кен (2003-06-17 06:21) [7]> Palladin © (17.06.03 05:41)
> две три недели назад на конференции "Общие вопросы", я писал
> функции работы с N мерными массивами, размерность которых
> задается в run-time, если хочешь можешь найти и посмотреть
> как это реализуется...
> правда там не было функции для прогона массива в цикле,
> но ее не сложно организовать при помощи рекурсии...
> это, к твоему сведению, называется алгоритмизация , тоесть
> программирование
Попытался найти через поиск - ненашёл.
Но я то нехочу ничего реализовывать ! Мне надо написать простейшую программку. Простейшую, если бы не этот геморой. Причём геморой стандартный. У всех такой же геморой кто с массивами сталкивается. Если бы там в Дельфи можно было бы чего нибудь отключить или переключить, чтобы это не доставало, жизнь бы упростилась.
← →
vidiv (2003-06-17 06:38) [8]А если массив представить в линейном виде и перебирать
← →
Кен (2003-06-17 06:49) [9]Код должен писать тот, кому он нужен. Правильно ? Если меня заинтересует выхожу я за пределы массива или нет, то я напишу проверку. Но почему, я должен писать проверку, если меня это не интересует ?
> vidiv © (17.06.03 06:38)
> А если массив представить в линейном виде и перебирать
В смысле ? В одномерный массив перевести ?
← →
vidiv (2003-06-17 06:57) [10]
Кен © (17.06.03 06:49)
> В смысле ? В одномерный массив перевести ?
Да. сейчас как раз попробую!
← →
Palladin (2003-06-17 07:02) [11]Диагноз: халявщик
← →
Кен (2003-06-17 07:03) [12]> vidiv © (17.06.03 06:57)
>
> Кен © (17.06.03 06:49)
> > В смысле ? В одномерный массив перевести ?
>
> Да. сейчас как раз попробую!
Но это же тоже финт. Можно сделать проще. Массив не 10х10, а 30х30 и работать только с его серединой. Тогда выходы за пределы не будут вызывать ошибки. Но хочется без финтов просто. Чтобы всё само собой правильно работало.
← →
Palladin (2003-06-17 07:08) [13]
> vidiv ©
да, так и делается...
размерности массива устанавливаются и требуемые индексы передаются в параметрах функций как array of integer
у меня прикольно получилось, только вот практического применения не нашел :)
← →
ZeroDivide (2003-06-17 07:59) [14]Не хватает Сишных конструкций
← →
Johnny Smith (2003-06-17 08:47) [15]Хотелось бы иметь макросы.
← →
Юрий Зотов (2003-06-17 08:58) [16]Препроцессор бы не помешал. Со всеми вытекающими...
← →
blackweber (2003-06-17 08:58) [17]
> Кен ©
Вроде человек с высшим образованием(если верить анкете, хотя я что-то сомневаюсь), а такую фигню лепишь.
Значит рано писать шахматы, раз с массивами не справиться.
← →
KSergey (2003-06-17 09:04) [18]> ZeroDivide © (17.06.03 07:59)
> Не хватает Сишных конструкций
а) каких именно?
б) впрочем, это не надо делать. Я думал тут народ хочет правда пусть пофлеймить, но "по делу", типа помечтать. А тут какой-то выскочка хочет готовую ф-цию распознавания изображения, хочет, чтобы дельфи сама за него писала шахматные программы и т.д. Вот только один к нему вопрос: а колбасу кто есть будет? Тогда уж дельфи, согласись? Ты то тут при чем вообще получаешься? Совершенно не при делах.
Есть у меня и некоторое обоснование бредовости твоих мыслей, вернее хотелось поначалу растолковать почему это бред, но что-то дочитав до конца все желания - объяснять расхотелось. Сложилось впечатление, что не поймешь.
PS: А почему картошку надо садить, да еще полоть и окучивать? А какого хрена она сама-то на растет. При том заметь: ее еще и варить, блин, надо... Ваще хамство сплошное...
← →
Юрий Зотов (2003-06-17 09:16) [19]> Кен
Извините, сразу видно, что на старых языках Вы не работали. Не горевать, а радоваться надо, что при выходе за границы массива возникает ошибка. Даже если, как Вы предлагаете, такие попытки игнорировать, программа все равно будет работать неверно, только вот причину Вы будете искать очень долго. А тут Вам на блюдечке преподносят и причину, и место ошибки.
Паскаль тем и хорош, что вопит по любому поводу. Если бы этого не было, ошибок в программах было бы на порядок больше, а искать их было бы на порядок сложнее. Такую фичу ценить, а не ругать нужно.
И в то же время тот же Паскаль дает Вам практически полную свободу, если Вы явно указываете компилятору, что действуете преднамеренно и обдуманно. Разве не здорово?
← →
Кот Бегемот (2003-06-17 09:17) [20]>Кен © (17.06.03 07:03)
>Чтобы всё само собой правильно работало.
Этим все сказано :)
← →
Darts (2003-06-17 09:40) [21]Не помешали бы и статические переменные.
← →
vidiv (2003-06-17 09:48) [22]А как правильно лук сажать?
← →
Palladin (2003-06-17 09:53) [23]
> Darts (17.06.03 09:40)
implementation
var
StaticVariable:integer;
← →
Digitman (2003-06-17 09:56) [24]
> Darts
> Не помешали бы и статические переменные
они тебе и не мешают, живут себе и живут, давно уже, без твоего ведома)
← →
KSergey (2003-06-17 10:09) [25]> Palladin © (17.06.03 09:53)
> implementation
> var
> StaticVariable:integer;
Это да, но рискну предположить, что Darts имел в виду статические переменные с областью видимости - функция (метод), а не модуль...
← →
ZeroDivide (2003-06-17 10:17) [26]var
User: TLamo;
Program: TDBSupperPupperMegaSegaAllInOne;
begin
try
program := TProgram.Create(User);
program.AddCompatibleUserInterface;
program.AddAllFunctions;
program.Run;
except
ShowMessage("Сам дурак");
end;
end;
← →
Darts (2003-06-17 10:29) [27]> KSergey © (17.06.03 10:09)
Да, это я имел в виду. Не хотелось бы забивать секцию реализации.
← →
Mirovodin (2003-06-17 10:40) [28]Поддерживаю Johnny Smith © - нужны макросы. Их "зачаточная" реализация есть в FreePascal. Хотелось бы увидеть её, хотя бы в этом виде, и в Delphi. А уж потом "дотянуться" до C-шных. Но вроде как в Preview новых версий Delphi это не будет :((( А жаль.
← →
Юрий Зотов (2003-06-17 10:48) [29]> статические переменные с областью видимости - функция (метод),
> а не модуль...
А как насчет вот этого:
function A: integer;
const
MyVar: Integer = 0;
begin
Inc(MyVar);
Result := MyVar
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
Caption := IntToStr(A)
end;
Запускаем, несколько раз кликаем по кнопке и видим, что MyVar есть... статическая переменная с областью видимости - функция, а не модуль!
← →
Digitman (2003-06-17 11:05) [30]Возможность использовать произвольные макросы и влекут за собой необходимость реализации того самого препроцессинга, о котором мечтают многие "паскалеры". Но это, думаю, сведет на нет преимущества Паскаля по строгости/недвусмысленности языковых конструкций, хотя, разумеется, возможности языка ощутимо расширит.
Борланд же пока сподобился реализовать лишь встроенные макросы а-ля IntToStr(), Str() и иже с ними, в основном - для форматного преобразования значений заранее неопределенного типа.
Чем, собственно, мы и пользуемся с успехом каждодневно, не задумываясь о "природе" этих операторов, и продолжаем эдак ностальгически хныкать о своих собственных макросах в приложениях)))
← →
k-man (2003-06-17 11:08) [31]В анкете Кена действительно написано что у него высшее образование
но разве не ясно что это вранье.. Хотя бы по его идиотским постам.. Он весь форум "Игры" взбесил своим бредом, а теперь за "Потрепаться" взялся.
> Кот Бегемот © (17.06.03 09:17)
Точнее Не скажешь....
← →
Darts (2003-06-17 11:13) [32]> Юрий Зотов © (17.06.03 10:48)
Спасибо, Юрий! Не знал, думал, что readonly. Хотя это зависит от директивы {$J}.
Еще раз спасибо.
← →
KSergey (2003-06-17 11:15) [33]> Юрий Зотов © (17.06.03 10:48)
Да, Вы правы. Помнится где-то читал про константы как статические переменные. Правда недавно попробовал - что-то не заладилось, не помню (помнится напрямую присвоить значение не удалось). Ну да ерунда.
Но ведь это, согласитесь, "фича". Явного определения статической переменной нет, а константы решают проблему лишь частично...
← →
Anatoly Podgoretsky (2003-06-17 11:16) [34]Проблема основная в плохом владении инструментом. И в частости объектной моделью.
← →
uw (2003-06-17 11:37) [35]>KSergey © (17.06.03 11:15)
Флажок Assignable typed constants в опциях компилятора D6. Вообще-то этой фичи не было разве что у Вирта.
← →
McSimm (2003-06-17 11:42) [36]
> А каких языковых конструкций в Дельфи вам нехватает ?
Очень простой вещи мне немножко не хватает. Ссылки на сам объект(не в смысле ООП) действия блока with, а не только на его члены.
Что-нибудь вроде ключевого слова this для блока with.
Например:
вместо
this := SomeObj.SomeProperty[SomeIndex];
if Assigned(this) then this.SomeMethod(...
написать:
with SomeObj.SomeProperty[SomeIndex] do
if Assigned( this) then SomeMethod(....
Ведь компилятор все равно создает эту ссылку, но, к сожалению, не дает к ней доступа. А было бы очень удобно.
← →
Mystic (2003-06-17 11:42) [37]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 ошибку выхода за пределы массива ловил неделю (оказалась в чужом коде). Всего-то на один элемент!
Кстати, при напиании шашек (то же относится и к шахматам) проверка на выход за пределы массива пишется не один десяток раз вручную...
Почему была бы удобна языковая конструкции, которая бы позволяла просто перебрать все элементы подряд. Было бы удобно, понятно и код бы сократился.
Экономится десять минут труда, а необходимость возникает считаные разы.
← →
uw (2003-06-17 11:51) [38]Что-то типа
for i: Integer = 1 to 17 do begin
end;
← →
KSergey (2003-06-17 12:25) [39]> uw © (17.06.03 11:51)
А вот это еще вопрос.
Привыкаешь к этому в ++, но еще не известно - хорошо ли это на самом деле. В плане качества кода.
← →
Ihor Osov'yak (2003-06-17 12:28) [40]2 McSimm © (17.06.03 11:42)
присоединяюсь
Еще возможности определять локальные переменные в любом месте кода (см. uw © (17.06.03 11:51) как частный случай). Но с предупреждением компилятора для случая, если это определение перекрывает (прячет) вышестоящую локальную переменную..
А вот с макросами в паскале - не согласен.. Тогда там такого намакросируют..
Также иногда не хватает статических полей классов, ну и см. Юрий Зотов © (17.06.03 10:48) - но не на уровне фичи, а так сказать, документировано.. Зы - статические поля класса можно обойти посредством финта, о котором говорил Юрий Зотов © (17.06.03 10:48), но хотелось бы это не как фичу, а как легальную возможностть..
← →
uw (2003-06-17 12:33) [41]>KSergey © (17.06.03 12:25)
По-моему неплохо. Ведь ввели же конструкцию
on e: Exception do
← →
stone (2003-06-17 12:34) [42]ИМХО, не стоит превращать структурированный отлаженный язык в синтаксическое болото. Все необходимое есть, если кому-то чего-то не хватает, подключаем мозги и руки. Если не хватает мозгов, то Дельфи тут ни при чем.
← →
uw (2003-06-17 12:38) [43]>Ihor Osov"yak © (17.06.03 12:28)
>Еще возможности определять локальные переменные в любом месте кода
Общий случай имхо не пройдет - вся структура языка будет искорежена.
← →
Zz_ (2003-06-17 12:38) [44]Жутко не хватает в Delphi Language unsigned
В D2 мучался с DWORD
В D6 нет unsigned int64
← →
Ihor Osov'yak (2003-06-17 12:40) [45]> не стоит превращать структурированный отлаженный язык в синтаксическое болото
Вопрос был: " А каких языковых конструкций в Дельфи вам нехватает ? "
Это немного иная вещь, чем прызыв "ату тормозов с Борланда! мы счас такое забацаем !!"
← →
Ihor Osov'yak (2003-06-17 12:44) [46]2 uw © (17.06.03 12:38)
> >Еще возможности определять локальные переменные в любом
> месте кода
>
> Общий случай имхо не пройдет - вся структура языка будет
> искорежена.
Локальные - значит в пределах процедур, функций и методов классов. Я что-то не вижу угрозы общей концепции. Что принципиально изменится, если я декларацию перемещу от заголовка к какой-то строчке кода? Ну а некоторые проблемы с перекрытием имен в случае бардачного кодирования - я уже говорил - "Но с предупреждением компилятора для случая, если это определение перекрывает"
← →
mrcat (2003-06-17 12:45) [47]McSimm © (17.06.03 11:42)
>Очень простой вещи мне немножко не хватает.
>Ссылки на сам объект(не в смысле ООП) действия блока with, а не >только на его члены.
присоединяюсь. когда таких конструкций:
this := SomeObj.SomeProperty[SomeIndex];
if Assigned(this) then this.SomeMethod(...
в программе тьма, начинаешь раздражаться ;)
← →
Ihor Osov'yak (2003-06-17 12:50) [48]2 mrcat © (17.06.03 12:45)
а какое предложение будет?
← →
uw (2003-06-17 12:58) [49]>Ihor Osov"yak © (17.06.03 12:28)
То, что предложил Юрий Зотов, - это совсем не на уровне фичи, а документированное языковое средство - типизированые константы typed constants. По сути это переменная внутри подпрограммы, сохраняющая свои значения от вызова к вызову.
Статические (классовые) переменные, те, что реализованы в С++, Java, C#, - это вещь другая. От этого я бы тоже не отказался.
>Ihor Osov"yak © (17.06.03 12:44)
>Локальные - значит в пределах процедур, функций и методов классов. Я что-то не вижу угрозы общей концепции.
Упрощенно структура языка такова: раздел констант, раздел переменных, раздел процедур и функций. А внутри подпрограммы - то же самое, но есть еще раздел операторов. При этом строится сравнительно простой и очень быстрый компилятор. Если в раздел операторов мы будем вставлять переменные, как в С++, получим, думаю, скорость компилятора C++.
← →
NailMan (2003-06-17 13:01) [50]Присоединяюсь к vidiv © (17.06.03 05:50)
Очень не хватает Case со строками.
А также:
прямого сравнения TGUID-ов. Чтобы было как у всех, по-нормальному if GUID1=GUID2 then
а не через ActiveX-задничную isEqualGUID или как там ее.
← →
Mystic (2003-06-17 13:08) [51]
> McSimm © (17.06.03 11:42)
Введение специального объекта для nil + замена условного поведения полиморфизмом? В общем, когда мне надоедает писать if Assigned(...) я так и поступаю :)
← →
Плохой человек (2003-06-17 13:10) [52]> Кстати, при напиании шашек (то же относится и к шахматам) проверка на выход за пределы массива пишется не один десяток раз вручную...
Проверка на выход пишется один раз в жизни, запихивается в модуль MyProc.pas и используется всю жизнь.
← →
Mystic (2003-06-17 13:26) [53]
> Плохой человек (17.06.03 13:10)
Я имел в виду немного не то...
← →
McSimm (2003-06-17 13:36) [54]>Mystic © (17.06.03 13:08)
Ты не понял. Assigned() это только для примера.
В общем случае неплохо бы иметь доступ к тому, что в with (а там, зачастую, вызов метода. И вызывать его несколько раз нет желания, приходится заводить явную переменную, хотя with это и сам прекрасно делает, а язык не позволяет использовать)
← →
Ihor Osov'yak (2003-06-17 13:37) [55]2 uw © (17.06.03 12:58)
>Если в раздел операторов мы будем вставлять переменные, как в С++, получим, думаю, скорость компилятора C++.
Различие в скорости компилятора обусловлена не возможностью декларации локальных прямо по тексту процедуры или отличием оной. Для реализации этого достаточно поддержать простенькие манипуляции со стеком в момент декларации и в момент ухода из области видимости + контроль джампов за пределы этой области.. Задача не архи какая сложная..
> это совсем не на уровне фичи, а документированное языковое средство - типизированые константы typed constants.
Документированое, но используемое нетрадиционно. Вследствии чего страдает наглядность и читабельность кода. Плюс в седьмой и шестой делфи им уже напрямую присваивания не сделаешь.. Нужно работать через указатели.. Поэтому говорю об такой технике, как о фиче. А было бы намного приятнее написать декларацию static и не морочить голову..
← →
Ihor Osov'yak (2003-06-17 13:39) [56]или отличием оной. -> или отсутствием оной, сорри..
← →
uw (2003-06-17 13:57) [57]>Ihor Osov"yak © (17.06.03 13:37)
>Документированое, но используемое нетрадиционно. Вследствии чего страдает наглядность и читабельность кода.
>Плюс в седьмой и шестой делфи им уже напрямую присваивания не сделаешь.. Нужно работать через указатели..
Что-то я тебя не понимаю. И Darts (17.06.03 11:13) уже все понял и использует {$J+}, и я в uw © (17.06.03 11:37) писал про флажок Assignable typed constants в опциях компилятора D6. Все работает напрямую. А главное - очень традиционно, в точности так, как это делается в С в случае с переменными static внутри функции.
← →
Ihor Osov'yak (2003-06-17 14:10) [58]2 uw © (17.06.03 13:57)
> использует {$J+},
Спасибо, не внимательно смотрел. Есть все-же прок в "потрепаться".. Зы - я-то в основном на пятом работаю, старые проекты переводить лень..
← →
Всеволод Соловьёв (2003-06-17 15:21) [59]кену
а зачем ты вообще занимаешся программированием? ведь все что именно ты можешь придумать-сделать уже написано, придумано и сделано до тебя! Так зачем же ты занимаешся изобретением велосипедов? не легче ли взять игрушку и погамится в нее, чем изобретать велосипед?
← →
SPeller (2003-06-17 16:08) [60]
> NailMan © (17.06.03 13:01)
> А также:
> прямого сравнения TGUID-ов. Чтобы было как у всех, по-нормальному
> if GUID1=GUID2 then
> а не через ActiveX-задничную isEqualGUID или как там ее.
Это вообще-то стандартная API-шная функция: загляните в Win32SDK. Вопрос ещё, конечно, в каком виде эти GUID"ы представлены.
← →
DiamondShark (2003-06-17 16:19) [61]По поводу переменной в with.
И что же такая переменная будет означать в случае
with Obj1, Obj2, ... ObjN do ...
?
А вот от такой бы формы with я бы не отказался:
with Form1.ActiveControl do
on b:TButton do ...;
on e:TEdit do ...;
else ...
end
← →
NailMan (2003-06-17 16:39) [62]To -> SPeller ©
Это вообще-то стандартная API-шная функция: загляните в Win32SDK.
Ну не помню я точно где, может и оттуда.
Вопрос ещё, конечно, в каком виде эти GUID"ы представлены.
Не понял.
Я сравниваю 2 переменные типа TGUID, который жестко определен как запись содержащая числа и массивчики байтиков.
ЗЫ: Да, точно! Вот что мне не хватает! Простое сравнение 2- записей. Не по полям или побайтным сравнением, а нормальнымif Rec1=Rec2 then
(записи ессно однотипные). Объясните кто-нибудь почему этого еще в паскале небыло? Присваивать записи можно, а сравнивать(естесственно сравнивать на равенство) низзя?
← →
MalkoLinge (2003-06-17 16:43) [63]Мне нужна
перегрузка операторов.
В частности перегрузка AS а еще лучне перегрузка опасного приведения типов !!!!!!!!!!!!!!!
Но вот лично я против Макросов, объявлений переменных в любом месте - так как компилятор (ИМХО) перестанет быть однопроходным...
← →
Игорь Шевченко (2003-06-17 16:46) [64]MalkoLinge © (17.06.03 16:43)
Очень извиняюсь, а как можно AS перегрузить ?
← →
Sandman25 (2003-06-17 17:13) [65]С эстетической точки зрения мне не хватает операторов
if ... then ... end if
while ... do ... end while
case ... of ... end case
для структурности.
Особенно запутывают ситуацию begin end"ы.
Еще было бы неплохо иметь макросы, локально-блочные переменные (не очень наглядно использовать одну и ту же i в нескольких for подряд, имеющих разные параметры). А из того, о чем еще не писали, очень хотелось бы иметь другой синтаксис для try/finally/except - слишком часто приходится использовать вложенные конструкции, в результате строка кода начинается чуть ли не с середины страницы. Использовать процедуры только для того, чтобы уменьшить отступ - не лучший выход ИМХО.
← →
vuk (2003-06-17 17:21) [66]Хотите case по строкам?
case ANSIIndexText( str, ["aaa", "bbb", "ccc"]) of
0:...; //aaa
1:...; //bbb
2:...; //ccc
else
...;
end;
Смысл тот же и не надо лишних сущностей.
to DiamondShark:
Кстати о птичках. Точно таким же образом предложенную Вами форму with можно сотворить (даже с учетом проверки типов предков), ведь по сути это не with, а case.
← →
DiamondShark (2003-06-17 18:11) [67]
> Sandman25 © (17.06.03 17:13)
С эстетической точки зрения -- Модула, или Оберон. Блочность красивше паскалевской.
> vuk © (17.06.03 17:21)
Это мне Оберон навеял. Там with несколько другой смысл имеет -- защищённое приведение типов и без изменения области видимости.
Т.е. конструкция
WITH ObjVar:Type DO
...
END;
эквивалентна дельфийскому
with (ObjVar as Type) do ...
А я ещё расширить постарался.
ЗЫ
для особо извращённых
try
raise Form1.ActiveCOntrol
except
on b: TButton do ... ;
on e: TEdit do ... ;
else ...
end;
← →
clickmaker (2003-06-17 18:19) [68]Я бы не отказался от
drink = (button == mbLeft) ? coffee : beer;
← →
vuk (2003-06-17 18:21) [69]to DiamondShark:
>Это мне Оберон навеял.
Я так и понял. :o)
← →
Юрий Зотов (2003-06-17 18:29) [70]> DiamondShark © (17.06.03 16:19)
> По поводу переменной в with.
> И что же такая переменная будет означать в случае
> with Obj1, Obj2, ... ObjN do ...
То же, что и обычно - в таких случаях любая конструкция относится к последнему объекту, а если неприменима к нему - то к предпоследнему и т.д. В данном случае this будет означать ObjN.
Но в данном случае такая переменная и не нужна, поскольку можно просто указать уже имеющуюся ссылку. Речь шла о случаях, когда такой ссылки нет. Мне тоже иногда ее не хватает.
← →
Sandman25 (2003-06-17 18:34) [71]DiamondShark © (17.06.03 18:11)
>С эстетической точки зрения -- Модула, или Оберон. Блочность красивше паскалевской.
Так я в основном работаю на Informix-4GL - довольно древний язык для работы с БД, но вот в этом отношении удобнее. Там еще есть конструкции EXIT CASE, EXIT WHILE, EXIT FOR, CONTINUE WHILE, CONTINUE FOR вместо безличных BREAK и CONTINUE Паскаля.
Особенно удобно бывает вот так:
WHILE true
...
FOR i=1 TO 10
...
CONTINUE WHILE; -- не FOR, а именно WHILE
...
END FOR
...
END WHILE
← →
vuk (2003-06-17 18:36) [72]Я вообще в случае с несколькими объектами стараюсь with не использовать - путаницы не будет. По большому счету, введение псевдонима для объекта в with меняет его смысл. Из оператора доступа к структуре он превращается воператор изменения имени переменной.
← →
MalkoLinge (2003-06-17 18:51) [73]
> Очень извиняюсь, а как можно AS перегрузить ?
Что мы делаем при AS пишу мнемокод
(Object as TClassType) = if Object is TClassType then
Result:=TClassType(Object)
else Raise
Я хочу чтобы в моем As было по другому :)
← →
Юрий Зотов (2003-06-17 18:51) [74]> vuk © (17.06.03 18:36)
> он превращается воператор изменения имени переменной.
Или его назначения вообще без всякой переменной:
with TStringList.Create do
try
...
Memo1.Lines.Assign( this)
finally
Free
end;
Пример не вполне удачен (в данном случае можно использовать Text), но смысл показывает.
← →
vuk (2003-06-17 18:58) [75]to Юрий Зотов:
Это все понятно. Суть все равно та же самая - неявной переменной дается другое имя, уже явное.
← →
Fantasist. (2003-06-17 20:10) [76]
> Поддерживаю Johnny Smith © - нужны макросы
> .....
> Препроцессор бы не помешал. Со всеми вытекающими...
А в чем проблема? У меня уже есть такой. Пока он не делает ничего сложного (подставляет вместо __LINE__ и __FILE__ номер строки, и название модуля), но это дело времени и не думаю, что большого, ибо синтаксический анализатор у меня уже есть.
Реализуется путем написания эксперта под Delphi IDE. Есть событие BeforeCompile.
← →
VD601 (2003-06-17 21:16) [77]ЮЗ, не пойму вашу фичу с Inc(MyVar). Компилятор вполне законно ругается Left side cannot be assgned to.
← →
uw (2003-06-17 23:24) [78]>VD601 (17.06.03 21:16)
Посмотри это: uw © (17.06.03 13:57)
← →
Fantasist. (2003-06-18 01:11) [79]А вообще, не хватает 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;
Да и сам синтаксис on e:exceptiontype do - слишком многословен. Гораздо красиве выглядело бы:
try
....
except (E:SysException)
...
except (E:OleException)
...
except (E:Exception)
...
end;
← →
Кен (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;
← →
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.87 MB
Время: 0.011 c