1. Си / Говнокод #15843

    +127

    1. 1
    2. 2
    3. 3
    4. 4
    5. 5
    #define PIXEL_PARTS_NUM 3
    
    typedef struct _pixel {
            char parts[PIXEL_PARTS_NUM];
    } pixel;

    Запостил: evg_ever, 24 Апреля 2014

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

    • Где здесь говнокод, evg_ever?
      Ответить
      • Структура из одного поля
        Ответить
        • Зато type-safe.
          Ответить
        • Ну может быть ее из функции возвращать хотят?
          Ответить
        • Зато если её передать в функцию, то передастся структура, а не какого-то хуя только указатель на первый элемент.
          Ответить
          • Ну и вернуть из функции можно, в отличие от массива.

            А еще - типа безопасность: эту структуру нельзя случайно передать в функцию, которая принимает char *.
            Ответить
          • Ты взрослый мальчик и должен уметь пользоватся презервативом адресной арифметикой. Ато начинатется, сперва обернем массив, потом внедрим в обьект методы что возвращают количество элементов, потом понадобятся методы выборки, а потом и изменения размера "на лету" - то все от лукавого.
            Ответить
      • в первой строке. как если бы графику вот так легко можно переносить с одного color space'а в другой.
        Ответить
    • На счет структуры из одного поля не соглашусь. Это хак.
      char parts[0] - Error.

      struct _pixel {
      char parts[0]; //OK!
      }
      Ответить
      • Щито, на этом статические проверки условия в крестах основаны, на том, что массив нулевой длины нигде не может существовать.
        Ответить
        • Это в крестах минимум 1. А в сишке внутри структур можно описать массив нулевой длины. Я когда-то даже поюзал эту фишку вот так:
          typedef struct foo_ {
              size_t count;
              item items[0];
          } foo;
          
          foo * alloc_foo(size_t count) {
              return malloc(sizeof(foo) + sizeof(item) * count);
          }
          Ответить
          • struct Foo (size_t count)
            {
              item[count] items;
            };

            такой суржик
            дискриминант указывается при создании объекта - то есть при создании на стеке при объявлении, при создании в куче - при выделении памяти
            Ответить
    • TarasB:
      Если, не ошибаюсь,
      struct Foo (size_t count)
      {
        item[count] items;
      };

      это С++? Я могу ошибаться, но кажется, что в С++ структуры представлены в виде объектов с паблик полями и без методов?
      Ответить
      • В обоих случаях ошибаешься. Это Ада с синтаксисом сей и в С++ структуры могут иметь методы, а отличаются только тем что по умолчанию там public, а в классах private.
        Ответить
        • С наследованием по умолчанию еще аналогичная шняга. У структур оно по умолчанию публичное.
          Ответить

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