• В чём суть шутки про ноги в С/С++?

    sergey-gornostaev
    @sergey-gornostaev Куратор тега C
    Седой и строгий
    "Выстрелить себе в ногу" - это идиома англоязычного мира, означающая причинение себе вреда необдуманными действиями. Языки C и C++ достаточно низкоуровневые языки, чтобы на них можно было делать опасные вещи. При этом первый вообще никак не контролирует действия программиста и позволяет написать любую ересь, а у второго такое количество тёмных уголков, в которых можно ересь сделать случайно, что не все знают даже спецы с десятилетиями опыта. Эти два совокупных фактора превращают программирование на Сях и Плюсах в изготовление приспособлений для стрельбы по собственным ногам.
    Ответ написан
    Комментировать
  • В чём суть шутки про ноги в С/С++?

    zoonman
    @zoonman
    ⋆⋆⋆⋆⋆
    Это есть книга такая
    71AE90J735L._SX377_BO1,204,203,200_.gif

    В продолжение веселья https://www-users.cs.york.ac.uk/susan/joke/foot.htm
    Ответ написан
    Комментировать
  • Член класса/структуры типа uint8_t * или int8_t *, оптимизация?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Тут проблема не в том, что член класса char*, а в том, что запись идет в char*, и из-за strict aliasing правил - это может быть запись куда угодно, в том числе в &this. Кешировать пришлось бы любой член структуры, любого типа.

    Эту же проблему можно воспроизвести в меньшем масштабе, если у вас в цикле есть запись в int* и чтение какой-то другой не меняющейся int переменной. Особенно, когда переменная в куче и указатель пришел в параметре функции. Вот компилятор офигеет и будет на каждой итерации ее загружать в регистр заново. Опять же, потому что ну не может он понять, что вот этот вот указатель не указывает на вот эту вот переменную.

    Частично это можно решить кешированием, можно попробовать поменять типы кое где. Но делать это не стоит - это та самая преждевременная оптимизация, о которой писал Кнут. Лучше алгоритм хороший и структуры данных правильные в вашей программе выберите. А уже дальше, если профилирование покажет, что вот тут вот узкое место, то можно смотреть на ассемблерный код и думать, как убедить компилятор геренировать что-то более быстрое.
    Ответ написан
  • Почему в VIM не работает перемещение вверх и вниз?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Перемещение по стрелками и буквам ( j k ) вниз и вверх не работает.

    в любом файле или в одном конкретном? Может быть этот файл состоит из одной единственной строки? Что о нём говорит wc -l <имя файла>?
    Ответ написан
    Комментировать
  • Как соеденить массив строк в одну строку и разделить пробелами?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Если это С++ и вы используете std::string, то можно строки тупо суммировать через +=.

    Если по условию задания вам надо делать все руками, то нужно выделить память, чтобы все поместилось, а дальше можно воспользоваться strcat_s, memcpy или вообще посимвольно копировать.
    Ответ написан
    Комментировать
  • Как получить число?

    @rPman
    (текущее_значение - минимальное_значение) / (максимальное_значение - минимальное_значение)=[0..1]
    Ответ написан
    3 комментария
  • В чём отличие параметров команды mklink (/J, /D, /H)?

    DamianLewis
    @DamianLewis
    Hard Links - можно создавать только на файлы, Junction Points — только на директории, Symbolic Links — на файлы и директории. Это основное и главное отличие между ними. Подробнее можете прочитать тут Ссылки в Windows, символьные и не только. Там также есть ссылки на другие источники.
    Ответ написан
    2 комментария
  • Как сортировать данные структуры по дате, если дата задаётся символьной строкой?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Как сортировать данные структуры по дате, если дата задаётся символьной строкой?

    Строки вида yyyymmdd можно сортировать с помощью qsort сравнивая их функцией strcmp.
    Ответ написан
    Комментировать
  • Comparison between pointer and integer. Как решить?

    @Mercury13
    Программист на «си с крестами» и не только
    Несколько вариантов.
    1. pnumber превратить в string
    2. strncmp(s[0].pnumber, std::size(s[0].pnumber), "2") == 0
    3. std::string_view(s[0].pnumber) == "2"
    Прости, глючу, и там. и там нужны двойные кавыки
    Ответ написан
    2 комментария
  • Как кастовать не в си стиле?

    Комментировать
  • Почему выбрасывает Segmentation fault при объявлении простой переменной?

    sergey-gornostaev
    @sergey-gornostaev Куратор тега C
    Седой и строгий
    Потому что вы даже вывод не освоили. Должно быть printf("%d\n", a);
    Ответ написан
    1 комментарий
  • Как проверить корретность битовой маски?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    У вас не битовая маска, так как b и c содержат один и тот же бит 2 и отличить c от b|c невозможно. 2|6 === 6. В битовой маске все уникальные некомбинированные флаги должны быть степенями двойки.
    Работать с вашим набором можно, но флаги придётся складывать через +, а проверять своей функцией, наподобие такой:
    function flags($value) {
        if (!in_array($value, [0, 1, 2, 3, 6, 7, 8, 9])) {
            return false;
        }
        $result = [];
        if (in_array($value, [1, 3, 7, 9])) {
            $result[] = 'a';
        }
        if (in_array($value, [2, 3, 8, 9])) {
            $result[] = 'b';
        }
        if (in_array($value, [6, 7, 8, 9])) {
            $result[] = 'c';
        }
        return $result;
    }
    Ответ написан
  • Потенциальные проблемы программиста без послешкольного образования?

    CityCat4
    @CityCat4
    //COPY01 EXEC PGM=IEBGENER
    Недавно писал ответ сюда

    Сто тысяч подобных вопросов - и всегда имеют в виду одно и то же - "я ведь правда умнее всех, что не получил вышку, но работаю в ИТ"?

    Да нифига не правда.

    Не, можно ничего не делать, продолжать считать себя самым умным и жить дальше - особенно, если фриланс, если он приносит доход, если есть реальная возможность смотреть на все свысока. Но жизнь такая штука - сегодня он есть, а завтра что-то случилось - и его (дохода от фриланса) - нет. А время идет. Хыры считают - в 25 быть без вышки нормально, в 30 - начинают коситься, в 35 и далее - делают бровки домиком и спрашивают "А почему?". И тут ты начинаешь что-то блеять и мычать про то, что вышка не дает знаний. Да, она их не дает (почти). Она дает другое. Она показывает, что ты обучаем :)
    Ответ написан
    5 комментариев
  • На чём написан язык программирования C?

    wataru
    @wataru
    Разработчик на С++, экс-олимпиадник.
    Учтите, что язык программирования - это просто набор спецификаций и правил. Он написан на английском языке.

    Если же вас интересует на чем запрограммированы компиляторы языка С, то самые популярные нынче развивающиеся компиляторы написаны на C и C++ соответственно:
    gcc: https://github.com/gcc-mirror/gcc
    clang: https://github.com/llvm/llvm-project/tree/main/clang

    Вы спросите, а как компилятор языка Си написали на самом Си? Ответ прост - первые компиляторы были написаны на ассемблере. Они были очень простыми и тупыми, возможно не умели понимать все тонкости языка. Когда появился достаточно работающий компилятор с минимальным набором функций, можно было переписать его на Cи и скомпилировать первым компилятором. После этого стало можно компилировать компилятор на Си самим собой.

    Точно также в компиляторы добавляют новые возможности языка - реализуют код компиляции этих вещей без их использования в исходниках и получают компилятор, который умеет их компилировать. Потом можно исходный код компилятора переписать с использованием этих новых функций, используя полученный ранее исполняемый файл компилятора.

    А так, наверно, есть куча неподдерживаемых устаревших компиляторов Си на всевозможных языках.
    Ответ написан
    2 комментария
  • Какие функции из библиотеки string.h использовать для решения задачи?

    CityCat4
    @CityCat4 Куратор тега C
    //COPY01 EXEC PGM=IEBGENER
    strstr()
    strcpy()
    может быть понадобится
    strchr()
    strcmp()
    Ответ написан
    Комментировать
  • Как перевести кастомный набор команд для serialport (RS485) в байты?

    hint000
    @hint000
    у админа три руки
    Отбой, не надо ссылки на доки. Нагуглил и рассказываю.
    Протокол Modbus.
    Как из "A", например сделать, 0x34 0x31
    ASCII("A")=41h
    Теперь "41" (без суффикса "h") раскладываем на два символа:
    ASCII("4")=34h
    ASCII("1")=31h

    https://www.modbus.org/docs/PI_MBUS_300.pdf
    страница 6;
    а также про CRC, страница 16.
    Ответ написан
    7 комментариев
  • Как переопределить операторы != и == в с++ для структуры?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Операторы должны возвращать bool и принимать константные ссылки на структуры.

    Но вообще-то раз вы итерируетесь по списку, вы сравниваете итраторы, а не структры. Поэтому достаточно просто использовать страндартную конструкцию:
    for (auto it = requests->begin(); it != requests->end(); ++it)


    И не надо ничего переопределять. Вы перепутали end и back. Первый возвращает итератор, а второй - элемент.
    Ответ написан
    2 комментария
  • Почему происходит ошибка сегментации и как её избежать?

    RiseOfDeath
    @RiseOfDeath
    Диванный эксперт.
    Долго не мог понять что не так. (увы нет компилятора под рукой)

    В общем чисто "на глаз", если я не ошибся нигде:
    Если вы делаете два вызова с буфером размера 3. (а реальная длинна строки 5), то втором вызове ваша функция вернет вам NULL и вы (вероятно) нигде это не проверяете (проверьте на всякий случай что я тут не ошибся)

    Поясню - если буфер длиннее файла, то вы столкнувшись с тем что больше нечего читать т.е. при прочтении 0 байтов (а у вас их именно 0 будет прочитано, если файл кончился) возвращаете NULL вместо того, чтобы вернуть то, что смогли прочитать или еще что-нибудь сделать
    И, к стати, допускаете утечку - вы под line выделили память, но в случае ошибки не очищаете ее и никуда не возвращаете.

    см. https://man7.org/linux/man-pages/man2/read.2.html

    Ну и опустим тот момент что у вас строка будет распилена на несколько если не влезет в заданный размер буфера.

    Как вариант читать строку пока не кончится, по мере исчерпания буфера вызывать realloc (например с шагом в BUFFER_SIZE). Если буфер будет чуть больше полученой строки это не трагедия (опять же, если вдруг все-таки трагедия - realloc в помощь).
    Ответ написан
    Комментировать
  • Почему берутся проблемы с совместимостью массивов и контейнеров?

    @Mercury13
    Программист на «си с крестами» и не только
    Учите матчасть!
    Версия для буфера памяти предполагает, что данные хранятся в непрерывном буфере nm×double (то есть длина mn, элемент double).
    Но vector<vector> — он НЕ непрерывный буфер.
    Есть непрерывный буфер n×vector<double> — центральный вектор. И каждая из n строчек по отдельности — непрерывный буфер m×double. Относительно друг друга в памяти они могут располагаться как угодно.

    Как исправить? — проще всего
    double s = 0;
    for (i...) {
      s += Sum(m, &a[i][0]);
    }

    Можно через шаблоны работать, но это уже сложнее и я сам не смогу это с листа написать, что уж говорить про первокура.
    Ответ написан
    Комментировать