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

    −10

    1. 1
    2. 2
    3. 3
    4. 4
    5. 5
    6. 6
    7. 7
    val = atoi(curstr);
    count = 0;
    while (val) {
                buf[count] = (val & 0x7f);
                val = val >> 7;
                count++;
    }

    Ноль не число.
    Отсюда:
    https://dxr.mozilla.org/mozilla-central/source/security/nss/cmd/oidcalc/oidcalc.c

    Запостил: PAAMAYIM_NEKUDOTAYIM, 05 Октября 2018

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

    • SEO-пост.

      Метки: #atoi #ноль #c #то_ли_дело_php
      Ответить
    • То ли дело Forth:
      6.1.0570   >NUMBER                          "to-number"                               CORE
                        ( ud1 c-addr1 u1 -- ud2 c-addr2 u2 )
                        ud2 is the unsigned result of converting the characters within the
                        string specified by c-addr1 u1 into digits, using the number in BASE,
                        and adding each into ud1 after multiplying ud1 by the number in BASE.
      
                        Conversion continues left-to-right until a character that is not
                        convertible, including any "+" or "-", is encountered or the string is
                        entirely converted.  c-addr2 is the location of the first unconverted
                        character or the first character past the end of the string if the
                        string was entirely converted.  u2 is the number of unconverted
                        characters in the string.  An ambiguous condition exists if ud2
                        overflows during the conversion.
      
                   See: 3.2.1.2 Digit conversion.
      Ответить
      • Forth кладёт в стек сразу несколько значений: само сконвертированное число, адрес ошибки и количество несконвертированных знаков? Просто я не знаю, как читать эту диаграмму.
        Ответить
        • В скобках записана стековая нотация, слева от "--" состояние стека до выполнения слова, справа –— после, вершина стека справа. ud –— беззнаковое целое размером 2 ячейки, c-addr — адрес, выровненный на границу символа, u —– беззнаковое целое одна ячейка.
          c-addr1 u1 –— определяет строку со счётчиком –— адрес начала и длина.
          ud2 –— ud1 + сконвертированное число, при конвертации используется база в переменной BASE, строка конвертируется слева-направо до неконвертируемого символа, включая "+" и "-" , c-addr2 —– адрес первого несконвертированного символа или адрес следующего символа после конца строки, u2 —– число несконвертированных символов.
          Пример:
          https://tio.run/##lYs9DoIwHMX3nuI5q0Rs7Ojk7AlMTG2KDAimLbuweB9jE6MEr/DviSroCZze731llXH5/[email protected]Ic2XOhB3QzhGlrqQbehGcjTkzzoTj3DuqxPB23A/[email protected]/[email protected]
          Ответить
          • Вопрос: нахуя мне всё это???
            Ответить
          • Спасибо.
            Ответить
            • Пожалуйста! Надеюсь эта информация была полезна для Вас.
              Ответить
              • Как же круто, когда есть общий стек! Не нужно заранее выделять память под возвращаемые значения, как в сишке. Не нужно объявлять составные типы (структуры, массивы, классы), как в языках более высокого уровня. Просто в самой функции занимаешь в стеке столько места, сколько тебе нужно.
                Ответить
                • Их как минимум 2 –— для данных и для развратов, и оба можно спокойно юзать.
                  Ответить
                • Несмело позволю себе заметить, что в "PHP" памятью управлять не надо - сиди, программируй и теки.
                  Ответить
    • а что тут не так?
      Ответить
      • Фрагмент функции, которая принимает на вход строку, содержащую десятичные числа, разделённые точками, а на выходе выводит те же числа, но уже в шестнадцатеричной системе и разделённые запятой.

        Ошибка заключается в том, что если одно из чисел равно нулю, то цикл while (val) будет пропущен и оно на выход не попадёт.
        Ответить
      • Кстати, решение проблемы, предложенное пользователем ЛОР, тоже содержит недоработку:
        if(curstr[0] != '0')
                while (val) {
                    buf[count] = (val & 0x7f);
                    val = val >> 7;
                    count++;
                }
            else
        	buf[count++] = 0x00;

        Отсюда: https://www.linux.org.ru/forum/development/12981204

        Кто найдёт, в чём говно, тому ничего. Хотя возможно, что для программы oidcalc сойдёт.
        Ответить

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