Кресты / Говнокод #8123 Ссылка на оригинал

0

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
  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 TarasB, (Updated )

Комментарии (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 и невозможность вызывать виртуальные методы в конструкторе (что насчёт Дельфи в этом плане?). В остальном он отличен.
                          Ответить
                          • > теория и практика -- разные вещи.

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

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

                            Это единственный косяк? Да ты ж нормальных языков не видел нихера.
                            Ответить
                            • Извиняюсь, что влезаю, напомните критерии нормальности, я забыл доводы из прошлых разговоров (
                              Ответить
        • >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# стал хуйнёй после версии 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 в другой массив\контейнер и прочие правильные методы.
                Ответить
            • Жаль только, что с многомерными массивами это не пройдет.
              Ответить
    • Присваивать можно.
      А вот инициализировать так красиво - нет. Только в Аде.
      Ответить
      • 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, или любой свой собственный контейнер, для высокоуровневых операций.

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

    К сожалению, в вузах в основном учат не С++, а скорее "Си с некоторыми элементами из С++", откуда и появляются такие примеры.
    Ответить
  • п.X)C V Y?TB$R)D"H?TO Y(I,Z"U I,U J?YE"EV"B$X W)B)VD?Q$F"H,Z?EV$T:P$I"D)I:T O"I R(Z$K$L"Y(O$H!U!E:S V"K,F"N,O(V(RZ:Y:EJ!E:S)F$Q$D.V!L(V.W.L$ISE!H$X$F"P$E!Z H:H:I"Z,T?U?N"Z!Q!O!I!T T O:KB LS!V$R)PG.Y F:D.U?B)J"QЧFBZNJACVZYIWYFWOBFKLNCBFIFRSSNDZLYQGOIITCUPNEQEKUVDDPMNLALMWJXEPRLDSAAGERPBNXTSWBJTBKNBUPJLONBDZBERWVGT
    Ответить

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

Помни, guest, за тобой могут следить!

    А не использовать ли нам bbcode?


    8