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

    +13

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    bool[] Inmask;
    ....
            private void discreteOIForm_Load(object sender, EventArgs e)
            {
                if (icpI_measure.Connect() && icpO_measure.Connect())
                {
                    Inmask = new bool[1];
                    Inmask[Convert.ToInt32(0)] = true;
                }
            }

    Новоприбывший сотрудник откладывает вот такое. Это он сделал после совета использовать маски. Вы когда-нибудь видели массив из одного элемента? Я тоже нет.

    Запостил: phys-tech, 07 Мая 2013

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

    • Это конечно же C#, уважаемые. Привык, что на плюсах пишем.
      Ответить
      • Хорошо, а то я уже спросить хотел, где же здесь С++, уважаемый.
        Ответить
    • > Вы когда-нибудь видели массив из одного элемента
      Да, видел, в жабьем коде, в котором автор (видимо сишник) хотел передать инт по ссылке ;)
      void some(int[] a, /* еще параметры */) {
          a[0] = a[0] + 42;
      }
      
      int[] a = new int[1];
      some(a, /* еще параметры */);
      Ответить
      • AtomicReference<Integer> уже не айс? Или даже AtomicInteger.
        Ответить
        • >AtomicReference<Integer> уже не айс
          Слишком много накладных расходов. Не для того их изобрели.
          Ответить
          • На самом деле нет.

            Посмотрите в исходник AtomicInteger. Операции get и set там - всего лишь тривиальный геттер и сеттер для volatile int. Если пользоваться только ими, никаких накладных расходов не будет. Вспомогательный объект используется только для нетривиальных операций типа incrementAndGet.
            Ответить
            • Правильно. Но volatile отключает некоторые оптимизации. В целом это конечно некритично, и имеет право на жизнь.
              Но имхо массив предпочтительнее.
              Ответить
            • К тому же разница в краткости:
              int[] a= {42};
              AtomicInteger a1=new AtomicInteger(42);
              Ответить
            • мне кажется такое использование немного странным.
              Ответить
        • Я думал, так делают только китайцы
          http://govnokod.ru/9295
          Ответить
        • Ну в том контексте где это юзалось - ну совсем не айс. Причем что массив, что референс. Там парсили двоичный файл примерно вот таким способом:
          // один пример
          int[] off = new int[1];
          off[0] = 0;
          name = Utils.strd(buf, off);
          data = new byte[buf.length - off[0]];
          System.arraycopy(buf, off[0], data, 0, data.length);
          
          // другой пример
          z = Utils.int16d(buf, 0);
          subz = Utils.int16d(buf, 2);
          id = Utils.ub(buf[4]);
          И вот вместо этих strd, прочей ереси в Utils, и магических смещений стоило бы запилить класс, в котором были бы инкапсулированы массив и офсет, и были бы адекватные методы для чтения байтов, слов и строк...
          Ответить
      • >в жабьем коде, в котором автор (видимо сишник) хотел передать инт по ссылке ;)
        Будто что-то плохое. Часто использую при возврате из замыканий, анонимных классов. int не сойдет, потому что final, а массив - самый раз.
        Ответить
      • инт по ссылке? какое извращение
        Ответить
    • "Вы когда-нибудь видели массив из одного элемента?"

      в древние времена, массив из одного элемента, как параметр функции, в жабе был почти официальный способ как эмулировать указатель на указатель. не в курсе как оно там сейчас, но во времена JDK 1.0 я это реально видел.
      Ответить
      • >как оно там сейчас
        И поныне часто так пишут. Правда нынче часто удобнее завести женерик-методы для построения ссылки, пары, тройки.

        Но раньше так и было:
        массив из одного элемента - ссылка.
        из двух объектов - пара.
        И выше. Кортежи-кортежики. Только кастинг вручную.
        Возврат из методов нескольких значений, передача в анонимные классы.
        Ответить
      • Ссылок ксати дохера всяких: Soft, Weak, ThreadLocal, Atomic.
        И без статических билдеров не очень удобно с этим хозяйством управляться.
        Ответить

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