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

    +148

    1. 1
    Block *** Cells;

    Лаконичная семантика C++.
    Глядишь на код -- и всё понятно: Cells - это указатель массива указателей на массивы указателей объектов класса Block.
    А устно с первого раза хрен выговоришь.

    Запостил: maniac, 30 Июля 2010

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

    • Встречаются иногда тройные указатели в реальной жизни программиста. Ничего не поделать.
      Ответить
    • где здесь с++?
      где здесь говнокод?
      И вообще это можно интерпретировать как сишный указатель на трехмерный массив.
      Ответить
      • C++ подразумевается, в том, что Block - это класс (но аффтар не соизволил этого продемонстрировать)

        зы: аффтор осуждает непонятные ему конструкции языка, которым он по всей видимости не очень владеет...
        (предположительно перешёл с паскаля или с какого-то языка, в котором нету явной работы с памятью)
        Ответить
        • Угу, с паскаля, но без фанатизма. ФП - вещь полезная.
          >>указателей объектов класса Block.
          Всё-таки соизволил. Словестно.
          Ответить
        • > предположительно перешёл с паскаля или с какого-то языка, в котором нету явной работы с памятью

          facepalm.jpg
          Ответить
      • Во-первых, двумерный массив, ежели на то пошло.
        Во-вторых, это пока ещё указатели на указатели и так далее, пока это всё не инициализировано. А каждый указатель на указатель массивов указателей объектов может быть инициализирован своей длиной. И получится, например, треугольный массив указателей, который до трёхмерного не дотягивает примерно полтора измерения.
        Ответить
        • Стоп-стоп-стоп. Чушь.
          Cells[x][y][z]
          До трех умеешь считать?
          Ответить
          • Массив объектов? Любопытно. Но, как я уже описал, Cells - это указатель массива указателей на массивы указателей объектов класса Block и никак иначе.
            Ответить
            • это одно и тоже, марш книжки читать прежде чем разводить демагогию про то, какие тебе массивы мерещатся
              Ответить
              • Мне не массивы мерещатся, а двухголовые страусы с фиолетовой шерстью и тяжелым бластером наперевес. А ещё они разговаривают со мной голосами имперских штурмовиков. В основном опохмелиться спрашивают.
                Ответить
          • ch, не в том фишка.
            для создания двумерной матрицы(NxM) объектов нужно выполнить такие действия:
            Block *** Cells = (Block ***) new Block[row_count];
            for (int i = 0; i < row_count; i++) {
               Cells[i] = (Block **) new Block[col_count];
               for (int j = 0; j < col_count; j++)
                  Cells[i][j] = new Block();
            }
            
            Cells[1][4]->SomeMethod();
            //вариант, демонстрирующий все 3 измерения:
            Cells[1][4][0].SomeMethod();
            Ответить
            • Оно самое. Плюс для каждого объекта можно вызвать свой собственный конструктор/конструктор с другими параметрами/не вызывать конструктора.
              Ответить
              • Ага, а потом гулять по куче безымянных полуинициализированных объектов как по минному полю. Так пишут только сишники и только с целью дальше в цикле все инициализировать и работать как с массивом.
                Ответить
                • обеспечение помехозащищённости - обязанность программиста;

                  если пишет не дурак, то там будут проверки:

                  if (Cells[i][k]) //проверяем был ли создан объект
                  {
                  // работаем с классом:
                  // если инициализация провалилась
                  // посыпятся либо ошибки(по Сишному),
                  // либо Эксепшены(по Цпп"шному)
                  }

                  так что это "минное поле" - не представляет особой угрозы...

                  а если пишет кто-то без опыта, то там даже с одиночным объектом могут быть проблемы ;)
                  Ответить
                  • угу, угу, только тогда указатели нужно еще инициализировать нулями, да еще лишние нулевые указатели в стеке, если случайно скопировать такую переменню, а потом для каждой копии вызвать delete, то будет краш. короче есть вещи которые не нужно делать, и это как раз тот случай.
                    Ответить
                    • 1% new инициализирует всегда нулями (ну, б если его не переопределять аллоком). т.е. в любом случае, если не выделить память под объект - то ссылка будет указывать на NULL

                      2% не обязательно вызывать delete для каждого элемента массива;
                      delete[] с этим прекрассно справляется
                      (правда вот на счёт вызовов деструкторов хз как там будет)
                      Ответить
                      • Че??!!11 То есть new char[123] отдаст строку забитую нулями? И delete[] вызовет delete для всех объектов на которые ссылаются указатели, содержавшиеся в массиве? Сслылка может указывать на 0?
                        Да вы ебанулись, парни(с)
                        Ответить
                        • #include <stdio.h>
                          int main(int argc, char* argv[])
                          {
                          	int count = 123;
                          	char *str = new char[count];
                          	for (int i = 0; i < count; i++) printf("%d", str[i]);
                          	scanf("%c", &count);
                          	return 0;
                          }


                          у меня почемуто всё в нули выводит...

                          NULL == (long) 0;
                          Ответить
                          • Теперь попробуйте отключить отладку.
                            А вообще, вы что-нибудь слышали об неинициализированной памяти ?
                            Ответить
                            • перекомпилил в релизе (если имелось ввиду отключить Дебаг режим) - результат тот же...

                              "об неинициализированной памяти"
                              я не слышал, но решил прогуглить: узнал новое про неинициализированны указатели и опасность их появления (спасибо)

                              но оное представляет опасность, если код пишет какой-то имбицыл, который вовсе не понимает что делает

                              зы: надеюсь вы поведаете еще что-то интересное (желательно с пруфлинком)
                              Ответить
                              • Это не тот сайт, по которому стоит программирование изучать.
                                Читайте лучше книжки хорошие.
                                Ответить
                                • в книгах ~50..70% лишнего текста, который объясняет и так понятные вещи...

                                  (когда-то решил прочитать трупастрауса - руководство по С++
                                  - полезной инфы почти не получил)

                                  так что в книги я не верю =(
                                  лучше уж какие-то сухие мануалы, без лишнего текста, типа:

                                  (проблема):
                                  (причины возникновения);
                                  (способы борьбы);
                                  (примечания);
                                  Ответить
                                  • Ты не найдешь таких (если уровень пункта "проблема" выше того же страутрупа и всяхуйняза21день++). Читай книжки, а из них делай выводы, это важнее. А этот сайт и правда не для таких поисков.
                                    Ответить
                                • зы: любой ресурс пригоден для изучения языка, если на оном говорится: "как нужно" или "как Не нужно" делать ;-)

                                  всё зависит от умения анализировать информацию
                                  ----------

                                  говонокод.ру - это не только развлекательный ресурс;

                                  тут можно узнать полезную инфу:
                                  - ошибки других (дабы не делать свои)
                                  - правки в коментах
                                  - анализ кода на гавно
                                  - интересные идеи реализации
                                  т.п.
                                  Ответить
                                  • >(когда-то решил прочитать трупастрауса - руководство по С++
                                    >- полезной инфы почти не получил) ...
                                    >...всё зависит от умения анализировать информацию
                                    Странно видеть две этих фразы от одного человека :)
                                    Ответить
                                    • честно говоря, я решил прочитать эту книгу уже после 2 лет выполнения практических заданий на
                                      С++

                                      по этому там почти ничего нового не узнал;
                                      Ответить
                        • Мне просто пофиг на детали глупых действий.
                          Вот например такие массивы используют потому итерирование по массиву бытрее, чем по контейнеру. Но если там половина нулевых указателей, нафиг это надо? Чтобы писать while(!++Cells); да?
                          Ответить
                          • честно, я даже представления не имею, зачем использовать двумерный массив объектов, часть из которых не инициализируется...
                            ------
                            мои посты были о том, что всякого рода ошибок можно избежать...

                            ну а вообще, лучше все эти ошибки присекать на этапе проектирования, дабы потом не приходилось делать заплатки...
                            Ответить
                            • все еще не
                              Ошибок также можно избегать до их появления, не применяя опасные идеи и техники, в конце концов если что не так, то сам программист за это и отвечает как ты уже сказал. К тому же ты уже успел выстрелить себе в ногу, предположив что что-то всегда инициализируется нулями при распределении памяти.
                              Ответить
            • >> для создания двумерной матрицы(NxM) объектов нужно выполнить такие действия:

              а чего минусы? тут что-то не так?..
              Ответить
              • Для создания двумерной матрицы достаточно одного цикла.
                А вот приведение типа :
                (Block ***) new Block[row_count];
                - это просто здец!
                Ответить
                • Ой мамочкиии... спасибо ;-)

                  ну вот, 2 года верил препу, что это правильный способ выделения памяти
                  а сейчас получив замечание - попробовал иначе, и познал истину
                  - всётаки, что не говорите, но тут можно получить некие знания... вот как сейчас ;)

                  new Block**[row_count];

                  пошёл думать, как тут 1 циклом обойтись...
                  Ответить
                • c 1 циклом можно создать двумерный массив Ссылок на объект...

                  а двумерный массив объектов(с вызовом конструктора) - через вложенный цикл(как мну писал), либо через 2 отдельных цикла;

                  иль я снова не прав?(
                  Ответить
    • maniac, ты главное &&&i не пытайся сделать))
      Не говнокод, полюбому. Цивильное обсуждение.
      Ответить
      • Пхыхыхы :-D
        Пусть и не говнокод, зато документацию нужно читать, даже если очень лень читать конструкции букафф типа "Cells - это указатель массива указателей на массивы указателей объектов класса Block". А то тут уже кому-то трехмерные массивы мерещатся.
        Ответить
        • А как тебе "массив массивов указателей"? Первое что в голову пришло.
          Ответить

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