На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Правила раздела:
1. Название темы - краткое описание кто/что против кого/чего
2. В первом сообщении - список параметров, по которым идет сравнение.
3. Старайтесь аргументировать свои высказывания. Фразы типа "Венда/Слюникс - ацтой" считаются флудом.
4. Давайте жить дружно и не доводить обсуждение до маразма и личных оскорблений.
Модераторы: Модераторы, Комодераторы
Закрыто archimed7592 11-03-2008: Лимит страниц. Продолжаем Delphi vs C++

Страницы: (117) « Первая ... 112 113 [114] 115 116 ... Последняя »  ( Перейти к последнему сообщению )  
> Delphi vs C++ , Часть 1
    Цитата Romkin @
    Корректно написанная програ займет гораздо больше, чем даже тебе кажется. В экселе еще и с интернационализацией форматов засада, что надо учесть. Но ты что, уже считаешь, что Delphi - это такая своеобразная замена VBA?

    Не надо мне особой корректности. Сойдёт что-то вроде
    ExpandedWrap disabled
      var app, wb, ws:variant;
      begin
      app = CreateObject('Application.Excel');
      wb = app.Workbooks.Add;
      ws = wb.Worksheets[1];
      ws.Range('B7').Value = 99;
      ws.Range('A3').Value = 'abc';
      end.
    Подкорректируйте до работоспособности.
    Если форматная строка такая проблема, то можно ничего не форматировать.
      Цитата
      Язык - некий абстрактный набор правил. Компилятор - конкретный инструмент, позволяющий создавать продукт с использованием языка.


      Кстати, если раньше Delphi - подразумевал IDE и компилятор, а язык назывался Object Pascal, то теперь Delphi - это еще и название языка. К компилятору у меня у самого есть масса претензий, однако к языку - значительно меньше :)
        Цитата linuxfan @
        Ты должен явно писать pCh := @s[1] (или @s[0], не помню, православная у них индексация строк или языческая).

        Вообще говоря, надо просто писать
        ExpandedWrap disabled
          procedure foo(s: string);
          var pCh: PChar;
          begin
            pCh = PChar(s);
            Inc(pCh);
          end;
        и счетчик не шевельнется: программист явно преобразовал тип, таперича он отвечает за последствия. Впрочем, в данном отрезке ничего страшного и не произойдет.

        Добавлено
        archimed7592, примерно так:
        ExpandedWrap disabled
          var app, wb, ws:variant;
          begin
          app = CreateOLEObject('Application.Excel');
          wb = app.Workbooks.Add;
          ws = wb.Worksheets[1];
          ws.Cells[2,7].Value = 99;
          ws.Cells[1,3].Value = 'abc';
          end.

        И что дальше?
          Цитата
          archimed7592, примерно так:


          Только знак присваивания у тебя фашистский стоит :)
            Цитата --Ins-- @
            Никак. Потому что это - не скомпилируется ;)

            А как сделать, чтобы компилировалось? Т.е. взять PChar от произвольной строки? Ах, да, наверное написать PChar(s) :lol:.


            Цитата --Ins-- @
            Думаю, что есть :) Но даже если нет - это не дает тебе право проводить между языком и компилятором знак равенства :) Это два совершенно разных понятия. Язык - некий абстрактный набор правил. Компилятор - конкретный инструмент, позволяющий создавать продукт с использованием языка.

            Это очень верное суждение, но... не в нашем случае :).
            На примере с С++: есть Стандарт(Его Величество), а есть куча разных компиляторов - т.н. conforming implementation. Но не все из них conforming - скажем, Borland C++ Builder 6 сильно далёк от стандарта(из-за своей древности). Т.о. если ты будешь критиковать конкретно BCB, то я скажу тебе выкинь BCB и обрати взор на Стандарт - там то-то и то-то можно делать так-то и так-то.
            В твоём же случае стандарта нет(чем вы нескромно гордитесь), но есть некотороая Language Specification(или Reference), котороая описывает все ньюансы языка. И там, со слов Ромкина, явно написано "для увереной работы as необходимо снабжать интерфейсы IID'ами". Т.о. если я захочу написать альтернативный Delphi, то я буду руководствоваться именно этими словами, и мой компилятор будет иметь все те же плохие черты, что и оригинал.
            И, если уж говорить о языке, то не кажется ли тебе, что все компиляторы для этого языка должны работать одинакого(по крайней мере в рамках спецификации), как это, например с С++?
              Цитата Flex Ferrum @
              Потому что разработчики предпочли предоставить свой собственный интерфейс и реализацию строки, наиболее подходящую для решаемой задачи, а не использовать имеющуюся. При этом были предложены способы преобразования одних строк в другие. Чем плохо?

              Тем, что нестандартно и вынуждает программиста явно работать с данной реализацией. Почему не применили имеющуюся реализацию?
                Цитата
                Т.о. если я захочу написать альтернативный Delphi, то я буду руководствоваться именно этими словами


                Руководствоваться - будешь, но тебе никто не запретит в совем компиляторе идентифицировать интерфейсы неявно :) Собственно некоторые языковые различия есть и в Delphi for Win32 и в Delphi.NET. В частности - в Delphi для Win32 в class helper ты не можешь объявить виртуальный метод, а в .NET - можешь :) А в более ранних версиях Delphi - вообще нет понятия class helper. Говорят же тебе - язык развивающийся.
                  Цитата Romkin @
                  Почему не применили имеющуюся реализацию?

                  По нескольким причинам.
                  1. Либо так исторически сложилось.
                  2. Либо она могла не отвечать (по тем или иным причинам) требованиям задачи.
                  3. Либо по велению своей левой пятки. :)
                    Цитата Flex Ferrum @
                    Ничего не понял. Кто на ком стоял? На псевдокоде можешь показать - что именно ты сделал?

                    ОК. Прмерно:
                    ExpandedWrap disabled
                      type
                        IFoo = interface
                        ['{3DFE8A08-9485-4F64-A95C-90E9CF9BDE30}']
                          procedrue Proc1;
                        end;
                        IBar = interface
                        ['{A666283E-9303-4657-9B61-E6880F580796}']
                          procedure Proc2;
                        end;
                       
                        TMy = class(..., IFoo, IBar)
                          FBar: IBar;
                          procedure Proc1; // явно реализуем IFoo
                          property Bar: IBar read FBar implements IBar;
                          constructor Create;
                        end;
                      ...
                      constructor TMy.Create;
                      begin
                        FBar := <Чего-то>;
                      end;

                    Где чего-то - это создание класса, или загрузка библиотеки c вызовом процедуры, которая вернет указатель на IBar, или, наконец, coCreateInstance. Области видимости я проигнорировал :)
                    После этого последнего телодвижения у меня получился объект, реализующий IFoo и IBar, то есть, нет проблем:
                    ExpandedWrap disabled
                      var
                        Foo: IFoo;
                        Bar: IBar;
                      begin
                        Foo := TMy.Create;
                        Foo.Proc1;
                        Bar := (Foo as IBar);
                        Bar.Proc2;

                    Прошу заметить, что все, что должно быть известно - это описание интерфейса с IID и способ, как его получить.
                      Цитата
                      В твоём же случае стандарта нет(чем вы нескромно гордитесь),


                      И я думаю - это правильно. Так как если введение стандарта будет иметь смысл - уверен, это будет сделано. На данный момент в этом смысла мало, так как отрасль у нас молодая, бурноразвивающаяся. Если язык не будет успевать с ней в ногу - он устареет и умрет. Вводить стандарт - это тормоз в развитии языка. И делать это "для галочки" по меньшей мере глупо. Это все равно, что взять лопату и копать себе могилу.
                        Цитата Romkin @
                        Прошу заметить, что все, что должно быть известно - это описание интерфейса с IID и способ, как его получить.

                        Понятно. Еще один привет от технологии COM - а именно, реализация COM Aggregation. Знаем такое. :) В С++ такое тоже возможно, правда для этого совсем не обязательно явно наследоваться от интерфейса, реализуемого через агрегат. :) А сколько при этом остается за кадром - это мама дорогая... :) Куда уж тут zero-cost features... ;)

                        Добавлено
                        Плюс, конечно, в том, что вам не приходится при этом заморачиваться со всякими inner- и outer-объектами, синхронизации контроля времени жизни (дело в том, что AddRef, выполняемый для полученного таким образом интерфейса Ibar должен выполняться для объекта TMy, Release, соответственно, также). Ну и т. д. Приколов тут очень много - мелкомягкие постарались. :)
                          Цитата
                          реализация COM Aggregation

                          А что, агрегация вне технологии не имеет смысл?

                          Цитата
                          правда для этого совсем не обязательно явно наследоваться от интерфейса

                          Ну и в Delphi в общем-то не обязательно. Можешь для QueryInterface написать свою реализацию. Но в Borland на этот счет о нас уже позаботились.

                          Добавлено
                          Цитата
                          Ibar должен выполняться для объекта TMy


                          Все верно. Тут нужно либо самому вложить такое поведение в агрегат (не путаю термины?), либо унаследовать его от TAggregatedObject, где все это уже реализовано.
                            Цитата --Ins-- @
                            А что, агрегация вне технологии не имеет смысл?

                            Имеет, конечно, но, я думаю, ноги растут именно оттуда. Подозреваю, что при этом inner-объекту делается специальный вызов CoCreateInstance (с ненулевым параметром pOuter), и прочее. Что, кстати, с точки зрения языка лишено смысла, т. к. реализацию интерфейса посредством композиции (на языковом уровне) можно реализовать и иначе. Ибо в данном случае класс, реализующий интерфейс, совсем не обязан быть CoClass'ом (что требуется для корректной работы CoCreateInstance). Ну и прочее...
                              Цитата Flex Ferrum @
                              Еще один привет от технологии COM - а именно, реализация COM Aggregation.

                              Да. Только я не подключаю СОМ, если работаю с внутренним объектом. И почему именно СОМ aggregation? Delphi aggregation!
                                Цитата --Ins-- @
                                (не путаю термины?)

                                В данном случае проще оперировать терминами inner и outer. Так понятнее. :)

                                Добавлено
                                Цитата Romkin @
                                И почему именно СОМ aggregation?

                                Потому что
                                Цитата --Ins-- @
                                Все верно. Тут нужно либо самому вложить такое поведение в агрегат (не путаю термины?), либо унаследовать его от TAggregatedObject, где все это уже реализовано.

                                ;)
                                Реализовать это на уровне языка можно и более прозрачным способом. :)

                                Добавлено
                                Видишь, я даже не зная деталей того, как это непосредственно реализовано в Delphi, "бью в яблочко" своими предположениями. Догадайся с трех раз - почему? :)
                                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                0 пользователей:
                                Закрыто archimed7592 11-03-2008: Лимит страниц. Продолжаем Delphi vs C++



                                Рейтинг@Mail.ru
                                [ Script execution time: 0,1250 ]   [ 15 queries used ]   [ Generated: 3.05.24, 19:23 GMT ]