1. C++ / Говнокод #8123

    +160

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    #include <iostream>
     
    int main()
    {
    int a[4] = {1,2,3,4}; 
    int (&b)[4] = a; 
    int c[4] = {5,6,7,8}; 
    a=c; 
    std::cout<<b[0];
    }
    
    prog.cpp: In function ‘int main()’:
    prog.cpp:8: error: invalid array assignment

    Да, похоже С++ не настолько высокоуровневый, чтобы поддерживать такое понятие как присваивание массивов.

    http://www.gamedev.ru/flame/forum/?id=153265&page=2#m20

    Запостил: TarasB, 08 Октября 2011

    Комментарии (63) RSS

    • плюсанул.

      хотя маразмы геймдева начинают доставать потиху.

      ЗЫ std::vector специально для этих целей существует.
      Ответить
      • Только начинают?
        Ответить
      • показать все, что скрытоЭто маразм крестов, а не геймдева.
        Ответить
        • а учится программировать на языке уже как необязательно?

          т.е. типа синтакс пролистал и уже готов как специалист?

          это ж даже в страуструпе написано: std::vector есть крестовый массив.
          Ответить
          • показать все, что скрытоКакое отношение имеет ваш пост к обсуждению данной темы?
            Ответить
          • > std::vector есть крестовый массив.
            да? даже для случая, когда размер массива известен заранее и не будет меняться?
            Ответить
            • если размер массива известен заранее, и хочешь одно выделение памяти съэкономить:
              [code=cpp]
              struct blablabla {
              int data[4];
              };
              [code]
              Ответить
              • показать все, что скрытоАга, а вот массив, обёрнутый в структуру, уже можно присваивать.
                АХРЕНЕТЬ
                И не надо тыкать в незнание стандарта. Если в стандарте написано, что говно воняет, то оно от этого не перестанет вонять.
                Ответить
                • Чет я не понял, что значит если обернутый, то можно присваивать?
                  Ответить
                  • то и значит, говностандарт
                    Ответить
                  • показать все, что скрытоЕсли переменные a,b,c имеют тип int[4], то присваивать нельзя. А если struct{int s[4]}, то можно.
                    Короче, я хуею с кривости этого "ублюдочного недоязычка" (эпитет не мой).

                    А ещё если в функцию передать int[4], то передастся указатель, а если структуру, то весь массив скопируется на стек.
                    Ответить
                    • Если для структуры не переопределен оператор присваивания, то происходит копирование не статических членов-данных.
                      Ответить
                  • в С++ массив есть примитивная структура из С. в С можно присваивать переменные и структуры - массивы нужно копировать.

                    для обратной совместимости с С, в С++ массив работает аналогично.

                    для С++ приложений, есть кучи классов контейнеров, в которых само собой разумется присваивание определено.
                    Ответить
                    • показать все, что скрытоДля обратной совместимости с С, в С++ яйца натянуты на аналогичное место в районе ушей.
                      Ответить
                      • Обратная совместимость -- практическое решение, а твой вой про натянуность -- тупое фанбойство. Не хочешь -- не используй. С++ большой, универсальный язык, но это не значит, что в любой момент времени нужно использовать абсолютно всё, что им предлагается, а потом ныть.
                        Ответить
                        • Это практическое решение напоминает человека, который не хочет содрать пластырь с раны резко и сразу. Он сдирает его медленно и с мучениями, потому что он боится сделать резкое движение.
                          ЛУчше бы один раз забили на совместимость и сделали нормальный язык, чем мучались.
                          Ответить
                          • >ЛУчше бы один раз забили на совместимость
                            таких никому ненужных "идеальных" язычков -- хуевы тучи, пылятся лежат на полках. теория и практика -- разные вещи.

                            >сделали нормальный язык
                            В чём С++ "ненормальный"? Единственный косяк -- это отсутствие constructor chaining и невозможность вызывать виртуальные методы в конструкторе (что насчёт Дельфи в этом плане?). В остальном он отличен.
                            Ответить
                            • >constructor chaining
                              в C++11 появилось
                              Ответить
                            • > теория и практика -- разные вещи.

                              Ну и? Сейчас, когда столько кода на крестах, уже поздно что-то менять, да. Надо было раньше думать головой.

                              > Единственный косяк

                              Это единственный косяк? Да ты ж нормальных языков не видел нихера.
                              Ответить
                              • Извиняюсь, что влезаю, напомните критерии нормальности, я забыл доводы из прошлых разговоров (
                                Ответить
                                • Критерии нормальности - это то, что написано кровью программистов.
                                  Ответить
              • чеза говнокот? засунь его себе в жопу
                Ответить
          • >std::vector есть крестовый массив.
            устарели твои данные, атец. std::array есть крестовый массив. (:
            Ответить
        • кажется Тарас единственный в этой теме понимает, что кресты - говно (:
          Ответить
        • Вот если говорить о языке, то ИМХО в нем многовато всяких достаточно низкоуровневых заморочек
          Ответить
          • Моя любимая заморочка - то, что классы не отделены от структур, как в Шарпе, и можно при их пересылке что-нибудь слегка потерять.

            Вот, по Дьюхерсту (кстати, как и топик, тоже связан с проваливанием массива в указатель):

            void apply( B array[], int length, void (*f)( B & ) ) {
            for( int i = 0; i < length; ++i )
            f( array[i] );
            }
            // . . .
            D *dp = new D[3];
            apply( dp, 3, somefunc ); // еблысь!

            Вот это - адов пиздец.
            А топикстартер лишь показал, что ещё не вырос из коротких хеллоуворлдных штанишек.
            Ответить
            • Ну так C# лет на 20 моложе C++. Учли чужие ошибки (и наделали своих).
              Ответить
              • У меня иногда впечатление, что гуру C++ тонко троллят поборников чистоты ООПы. Например, говорят нам, что множественное наследование реализаций - бяка, а они возьми и слепи наследование классами самих себя через шаблоны (CRTP, если кто не в курсе, goo.gl/u86EU).
                Ответить
                • >наследование классами самих себя через шаблоны
                  Это не возможно. А то что вы продемонстрировали: это передача шаблона потомка предку. Нет ничего странного.
                  Ответить
                  • Ага, я ошибся. Так как там базовый класс получает информацию о схеме класса-наследника, то правильнее так:

                    В C++ твой базовый класс наследует тебя!!!

                    Вообще же, если посмотреть на пример со статическим полиморфизмом, видны уши говнооптимизации, которую лучше поручить компилятору.
                    Ответить
                    • >В C++ твой базовый класс наследует тебя!!!
                      Надеюсь он не занимается со мной сексом? (:
                      Ответить
                      • Он может трогать твои приватные члены.
                        Ответить
                        • Также подумалось: может ли он делать это, если ты не назвал его другом?
                          Ответить
                          • Обычно, когда кто-то назвал кого-то своим другом, то он больше не трогает его приватные члены. (:
                            Ответить
                            • Друзья уже не те... http://en.wikipedia.org/wiki/Friends_with_benefits
                              Ответить
                              • >Друзья уже не те...
                                Реально? Правда что ли, после того, как назвали друг друга друзьями раньше можно было продолжать получать доступ к приватным членам?
                                Ну всё. Строю машину времени, тем более один раз я это уже делал:
                                http://no-lifer.ru/uploads/posts/2010-10/1287991848_ccc.jpg
                                Ответить
              • К сожалению, C# стал хуйнёй после версии 2.0 (ну ещё var'ы окей).
                Ответить
            • 1)Передавай массив по ссылке и можно будет посчитать его длинну.
              2)Передавай длину массива посредством шаблонного параметра, выводимого компилятором и будет известна его длинна.
              Ответить
              • Ошибка в другом.
                Ответить
                • Ну тут сам виноват. Кастит указатель на массив классов разного размера.
                  Ответить
                  • Дело в том, что язык это позволяет :) Плюсы любят терять тип массива, заменяя его указателем на первый элемент. А его уже совершенно легально можно кастить в любой из базовых классов. Полиморфизом!
                    Ответить
                    • Если правильно писать, то это не останется незамеченным на этапе компиляции:
                      http://ideone.com/ml3Mh
                      http://ideone.com/DtaYh
                      C++ это в первую очередь дисциплина
                      Но в принципе все и так здесь знают, что я думаю про С++ на самом деле. (:
                      Ответить
                      • Во, заметь, теперь мы таки используем классы только через ссылки, как и положено вменяемому языку. Видимо, разработчики шарпа тоже на чем-то подобном шишек набили.
                        А дисциплина... Ты видел хоть один язык, где элементарный apply делается через такую жопу?!
                        Ответить
                        • Используйте std::алгоритмы - никаких жоп, лишь обычные для С++ привлекательные попки. (:
                          Ответить
                • Если не заниматься грязными извращениями:
                  http://ideone.com/jKNhE
                  ,то все прекрасно работает, как видите:
                  http://ideone.com/J5CKU
                  И находит логическую ошибку во время компиляции:
                  http://ideone.com/mohDQ

                  Если хочется что-то откастовать в другой тип в массиве\контейнере, то добро пожаловать в массив\контейнер указателей или через std::transform в другой массив\контейнер и прочие правильные методы.
                  Ответить
              • Жаль только, что с многомерными массивами это не пройдет.
                Ответить
                • Что за паника на корабле?
                  Меньше слез, больше дела:
                  http://ideone.com/4Ds7S
                  Может можно и в одну функцию.
                  Ответить
    • Потому что массив не является l-value O_o.
      Ответить
    • А в дельфи можно?
      мимоинтересуюсь
      Ответить
      • Присваивать можно.
        А вот инициализировать так красиво - нет. Только в Аде.
        Ответить
        • int a[4] = {1,2,3,4};//длинно, делай так:
          int a[] = {1,2,3,4};//аналогично можно и со структурами, и с массивами структур, а теперь и для контейнеров в C++11 и даже для одиночных переменных о_О
          Ответить
    • Иногда, такое впечатление, что стоит кто-то над душой _С++_ - ненавистника и в ультимативной форме понуждает, под страхом физической или моральной расправы, использовать его в своей ежедневной деятельности программиста.
      НЕ осилил или НЕ нравиться - НЕ используй!

      Однако, если программист, заявляет что ЯП — говно, то, как программист(в смысле творец), он обязан предложить созданный им лучший вариант — иначе, НЕ программист он боле, но балабол оголтелый (маркетолог с ярко развитыми и резко выраженными коммуникативными навыками) и веры ему НЕТ такому, пустозвону время уничтожающему.
      Ответить
    • Пишите на фортране и будет вам счастье. Там можно так:
      integer, dimension(4) :: a=(/1, 2, 3, 4/)
      integer, dimension(4) :: b=(/5, 6, 7, 8/)
      a = b
      a[1:3] = b[2:4]
      Ответить
    • Сырые массивы в С++ -- просто легаси совместимости с Cи. Вы можете использовать std::vector, или любой свой собственный контейнер, для высокоуровневых операций.

      Никто не принуждает никого использовать сырые массивы вне интеропа со старыми Си-интерфейсами.

      К сожалению, в вузах в основном учат не С++, а скорее "Си с некоторыми элементами из С++", откуда и появляются такие примеры.
      Ответить
    • показать все, что скрытоvanished
      Ответить

    Добавить комментарий