• Как убрать мусор из char массива?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Что у вас за операция пересечения?

    Первая проблема - вы берете максимальную длину двух строк в size и потом проходитесь циклом до size по обеим строкам. Но ведь более короткой строки там просто нет - вы обращаетесь к не вашей памяти.

    Вам надо проверять, есть ли обе строки по индексу i, прежде чем сравнивать их.

    Вторая проблема - вы создаете result размером ровно на количество совпадений, а пишете туда в цикле до size. Т.е. если у вас вообще ни одного совпадения, то массив result будет пустым, но вы там можете хоть 10000-ый элемент записать, если строки достаточно длинные.
    Ответ написан
    Комментировать
  • UTF-8 - для чего нужен 0 после единиц в ведущем байте?

    @galaxy
    Для чего нужен 0, если теоретически единиц достаточно для определения границ символа?

    Для удобства. По стартовому байту последовательности (кодирующей символ) можно определить ее длину в байтах: сколько единичных страших битов, столько и байт в последовательности. Ноль обозначает конец серии единичных старших бит. Если бы не было этого нуля, невозможно было бы сказать, сколько старших бит установлено в стартовом байте (пришлось бы считывать байты дальше до тех пор, пока не встретится следующий стартовый байт или однобайтовый символ).
    Т.е. допустим, вы видите такую последовательность (второй байт просто для иллюстрации, внимание на первый):
    11110001 10xxxxxx
    Если нуля бы не было, то это два байта, кодирующие символ Юникода 110001xxxxxx? Или это три байта, кодирующие символ 1001xxxxxx...? Или четыре, символ 001xxxxxx...?
    Не получится понять, не считав до начала следующего символа.
    Ответ написан
    Комментировать
  • С чего начять новичку в СИ?

    includedlibrary
    @includedlibrary
    Си можно начать изучать с книги "Язык программирования Си" Кернигана и Ритчи. Или с "Head First C" (я начинал с неё). Потом можно почитать про новые фичи стандарта c11.
    Если вы хотите низкоуровневым программированием заниматься, то для начала нужно прочитать "Архитектура Компьютера" Таненбаума. Ещё есть очень хорошая книга "Цифровая схемотехника и архитектура компьютера" от Сары и Дэвида Харрис.
    Потом читать спецификации на железки, под которые вы хотите писать код.
    Ответ написан
    1 комментарий
  • Почему некорректно находит произведение чисел?

    @res2001
    Developer, ex-admin
    Почему вы в функции с переменным количеством аргументов не используете стандартный механизм для работы с аргументами в подобных функциях (#include <cstdarg>)?

    Поставьте отладочный вывод в цикл, где выведите значение count, а заодно и *ptr и comp. То же самое можно быстро посмотреть в отладчике затратив минуты 3 на все. Выводите значение floatов с большим количество знаков после запятой (10-15).
    Вы будете удивлены тому, что во float 3.0 это не обязательно равно 3, ну и т.д. То же самое относится к любым типам с плавающей точкой.
    Передавайте первым аргументом uint32_t, вторым и следующим float. Тогда все будет нормально. Код, конечно, придется немного переделать.
    Ответ написан
    3 комментария
  • Как проверить переменную любого ссылочного типа на null?

    vabka
    @vabka
    Токсичный шарпист
    Имеются ввиду и объекты и строки и массивы и т.п.

    Кажется, у вас немного каша в голове. В C++ все типы передаются по значению.
    Для передачи по ссылке используются ссылки (&) и указатели.
    Вот указатель можно сравнить с nullptr, а любое другое значение не может быть null-ом.
    Ответ написан
    Комментировать
  • Как проверить переменную любого ссылочного типа на null?

    @res2001
    Developer, ex-admin
    По стандарту ссылка не может указывать на несуществующий объект (NULL), поэтому, если вы сделаете так:
    if (&refTypeParam == null)
    Компилятор запросто может выкинуть этот код в процессе оптимизации, т.к. условие по стандарту никогда не выполнится.
    Вещи типа этой:
    int &v = *(int*)NULL;
    это неопределенное поведение по стандарту. Но на сколько я знаю, такое вполне прокатывает.
    https://stackoverflow.com/questions/4364536/is-nul...
    Ответ написан
    1 комментарий
  • На чём создавать программы под Windows и прочие?

    vabka
    @vabka
    Токсичный шарпист
    Если вы хотите писать на си, то посмотрите в сторону GTK
    Или в сторону Qt (C++)

    Советую использовать всётаки C++, тк с ним хоть немного меньше кода придётся писать, и он будет понятнее
    Ответ написан
    3 комментария
  • Python vs C. Какой из них быстрее?

    vabka
    @vabka
    Токсичный шарпист
    Хорошо написанный, и скомпилированный в -o3 код на си, как правило, будет быстрее и эффективнее аналогичного кода на питоне.
    В вашем случае неизвестно, почему вы могли получить такие результаты (даже не сказано, какие)

    А какой используется интерпретатор?
    А как был скомпилирован код на си?
    На одном и том же железе происходил запуск? Условия равны?
    Чем print на питоне отличается от сишного printf?
    Как вообще происходил замер? Было ли учтено время на запуск интерпретатора?
    Сколько было замеров? Может в случае с си был аномально медленный прогон?

    UPD: Короче хз, как вы там меряли, но вот мой вариант
    Для C я использовал Tiny C compiler, чтобы дать питону фору (будет учитываться время на компиляцию), да и оптимизации тут будут не такие дикие, как в GCC
    Чтобы не тестировать скорость вывода на экран - вывод я перенаправил в /dev/null (Хз что это за заклинание такое, но я его нашёл на SO)
    Запускал всё на WSL2 по одному разу, но в принципе результат очень даже стабилен.
    Вот результат:
    vabka@DESKTOP-7AFIA69:~/repos$ time (python3 test.py) 2>&1 1>/dev/null
    
    real    0m0.381s
    user    0m0.359s
    sys     0m0.016s
    vabka@DESKTOP-7AFIA69:~/repos$ time (tcc -run test.c) 2>&1 1>/dev/null
    
    real    0m0.081s
    user    0m0.047s
    sys     0m0.031s
    vabka@DESKTOP-7AFIA69:~/repos$ cat test.c
    #include <stdio.h>
    
    int main() {
      int i = 0;
      while(i < 1000000) {
        printf("%d\n", i);
        i++;
      }
      return 0;
    }
    vabka@DESKTOP-7AFIA69:~/repos$ cat test.py
    i = 0
    while i < 1000000:
      print(i)
      i += 1
    
    vabka@DESKTOP-7AFIA69:~/repos$

    Питон получился в 4 раза медленнее.

    Вот ещё результат без /dev/null:
    Для C:
    real    0m58.757s
    user    0m1.094s
    sys     0m11.078s


    Для питона:
    real    1m1.762s
    user    0m2.953s
    sys     0m13.594s


    Результат тоже хуже, но тут очень много времени тратится на вывод в консоль, по тому разница почти не видна.
    Ответ написан
    7 комментариев
  • Python vs C. Какой из них быстрее?

    wataru
    @wataru
    Разработчик на С++, экс-олимпиадник.
    Попробуйте сделать вывод в файл. Запускайте с "> output.txt". У меня си работает в несколько раз быстрее (меньше секунды), питон - пару секунд.

    Вывод в консоль тормозит, потому что при компиляции через mingw идет как бы эмуляция линуксовой консоли, которая преобразуется в виндовую. Питон же наверняка работает нативно. Если вы интерпретатор питона из исходников на mingw соберете, то будет работать столько же. В этом примере вы разницу не намеряете, потому что тут вы в основном тестируете скорость вывода в консоль. Замените вывод на вычисления, или что-то другое полезное, и у си будет в разы быстрее питона.
    Ответ написан
  • Где здесь путаница?

    @res2001
    Developer, ex-admin
    Зачем это
    r[j] = '\0';
    в цикле? Вынесите из цикла.
    Путаницу в куче я вижу только в том смысле, что памяти выделяется больше, чем нужно. Можно этот момент подрихтовать.
    Сам цикл я бы реализовал немного по другому - так чтобы в одной итерации цикла добавлялись сразу 2 символа из строки и один symbol. В этом случае нужно будет еще обработать оставшийся хвост, если количество символов не четное.

    Добавлено: Проглядел отсутствие освобождения памяти. Оно необходимо, конечно.
    Ответ написан
  • Программы и игры на C?

    sergey-gornostaev
    @sergey-gornostaev Куратор тега C
    Седой и строгий
    Можно ли создать качественную полноценную программу на языке "C"?

    Nginx, PostgreSQL, JVM, Python и т.д. и т.п. Половина технологического ландшафта в мире написана на Сях без плюсов.
    Ответ написан
    Комментировать
  • Как правильно остановить программу?

    gbg
    @gbg Куратор тега C++
    Любые ответы на любые вопросы
    Для того, чтобы посмотреть вывод программы, ее вовсе не надо останавливать - достаточно настроить IDE так, чтобы она не закрывала терминал после завершения программы.

    Если сильно хочется, можно использовать вот такой код:
    #include <ios>      // Required for streamsize
    #include <iostream>
    #include <istream>
    #include <limits>   // Required for numeric_limits
    
    void myflush ( std::istream& in )
    {
      in.ignore ( std::numeric_limits<std::streamsize>::max(), '\n' ); // опустошаем все что есть в буфере
      in.clear();
    }
    
    void mypause() 
    { 
      std::cout<<"Press [Enter] to continue . . ."; // собственно, пауза
      std::cin.get();
    }

    Источник
    Использование же system("pause") - костыль, к использованию не годится никогда.
    Ответ написан
    Комментировать
  • Как узнать что функция вернула double число?

    gbg
    @gbg Куратор тега C++
    Любые ответы на любые вопросы
    C++ - строго типизированный язык. Функция, задекларированная как double, всегда вернет double.

    Чтобы на ваш вопрос можно было нормально ответить, ознакомьтесь с тем, что такое Проблема X-Y
    Ответ написан
    Комментировать
  • Существует ли метод хранения объектов на c++, похожий на map со способностью дублировать ключи?

    Adamos
    @Adamos
    Для озвученной задачи имеет смысл использовать не мультимап, а std::map< date_t, std::vector< Event > >
    Ответ написан
    Комментировать
  • Что означает traits_type::eof()?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    type_traits - это имя параметра шаблона, который задан в родительском классе streambuf.

    type_traits::eof() - возвращает код конца файла, для текущего параметра шаблона.

    Вся эта шаблонная магия взялась для того, чтобы можно было читать из файла или char, или wchar, или еще черт знает что, в зависимости от кодировки. Раз читаемые символы могут быть какими угодно, то и код конца файла нужен свой собственный для разных типов символов. Поэтому eof() является частью type_traits в streambuf.
    Ответ написан
    Комментировать
  • Asus zenfone max pro m1 не включается, мастера тут есть?

    15432
    @15432
    Системный программист ^_^
    у вас есть оборудование для выпаивания, реболла и замены BGA чипов? микроскоп, трафареты, паяльная станция?

    в домашних условиях самое простое - купить новую плату на разборе и заменить её в телефоне, и то бывают ситуации, когда даже разобрать и собрать телефон - целое приключение
    Ответ написан
    3 комментария
  • Как насильно использовать только одно ядро для вычислений, чтобы не париться насчёт одновременного доступа к памяти?

    gbg
    @gbg Куратор тега C++
    Любые ответы на любые вопросы
    Никак, вам это не поможет. Пока вы не изучите модель памяти и модель многопоточости, вы не поймете, почему ваша идея - 0/10.
    Ответ написан
    3 комментария
  • Как организовать сравнение переменной с элементом массива?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    В общем случае тут нужен бинарный поиск. Задаете вашу таблицу в виде двух массивов. Первый - значения которые вы ищете, второй - ответы для них. Отсортированные по первому массиву.

    Бинарным поиском находите в первом массиве индекс значения и выдаете ответ из второго массива по тому же индексу.

    Подкручивая бинарный поиск можно округлять искомое значение до табличного вверх или вниз.
    Ответ написан
    Комментировать
  • Почему мои вопросы блокируют?

    607c238d838e7861612020.png
    Ответ написан
    Комментировать
  • Почему мои вопросы блокируют?

    0xD34F
    @0xD34F
    Очевидно же - они правила нарушают. Будете продолжать в том же духе - заблокируют не только вопросы, но и вас самого. Так что на вашем месте, я бы сейчас перешел по ссылке и ознакомился с тем, как тут принято себя вести.

    И, кстати, здесь не форум.
    Ответ написан
    Комментировать