Задать вопрос
  • Что такое Статический и Динамический массив?

    @res2001
    Developer, ex-admin
    Память под статический массив выделяется на стеке. При выходе из области видимости стек очищается и память под массивом освобождается автоматически (не нужна операция освобождения памяти, операция есть, но о ней позаботится компилятор самостоятельно).

    Память для динамического массива выделяется в динамической памяти (в куче) (new[]). Когда массив становится не нужным память должна быть освобождена (delete[]), иначе произойдет утечка памяти.

    В связи с вышеизложенными принципиальными отличиями, есть несколько следствий:
    1. Имя статического массива это не указатель. Это можно понять например сравнив, что возвращает sizeoff() для статического массива и для динамического. Хотя в некоторых ситуациях компилятор ведет себя так, как будто имя статического массива это указатель, например: можно передать имя статического массива в функцию, принимающую указатель.
    2. У динамического массива нет имени. Операция new[] возвращает указатель. Имя есть у указателя.
    3. Внимание! Оба варианта массивов имеют фиксированный размер. Изменять его нельзя!
    То что в std::vector вы можете укладывать кучу элементов постепенно, не указывая нигде предварительного размера является следствием того, что std::vector скрывает от вас всю работу, которую он при этом делает. При добавлении нового элемента, для которого нет места, он выделяет память для нового массива большего размера, копирует старый массив в новый, удаляет старый массив, добавляет новый элемент. Если идет интенсивная работа с push_back(), то это может ОООЧЕНЬ дорого стоить. std::vector - это удобно, но необходимо всегда помнить, за счет чего достигается это удобство. std::vector - это не динамический массив - это обертка над ним для более удобной работы с динамическим массивом.

    В языке Си (C99) есть такая штука как Variable Length Array (VLA) - это статический массив с изменяемым размером. Т.е. вы можете, например, в функции объявить int arr[N], где N будет передаваться в функцию как параметр.
    В стандарте С++ VLA нет! Но, например, тот же gcc с опциями по умолчанию разрешает его использования в С++ проектах. С опциями, заставляющими gcc более жестко следовать стандарту, он может запрещать использовать VLA в С++ проектах. Но не рассчитывайте, что все компиляторы будут так делать. Например микрософтовский компилятор в принципе не умеет в VLA (хотя я уже пару лет не проверял это).
    VLA может показаться классной штукой.
    Но, например, в ядре Линукс в свое время проводили целую компанию по выпиливанию VLA из исходников. Торвальдс высказывался негативно про VLA. Все это при желании можно нагуглить.
    Стоит помнить, что размер стека ограничен, а VLA то же выделяется на стеке. Кроме того выделение памяти для обычного статического массива это просто увеличение счетчика стека на константу (и все, одна операция сложения регистра с константой, а компилятор одной операцией выделяет память для всех переменных в текущей области видимости). С VLA все сложнее с выделением и удалением. Так же sizeof() для обычного статического массива это операция времени компиляции (при выполнении будет уже заранее известная константа), для VLA - это полноценный вызов функции.
    Ответ написан
    1 комментарий
  • Прыгаю с языка на язык, с одной сферы в другую, как сфокусироваться на одном языке?

    sergey-gornostaev
    @sergey-gornostaev
    Седой и строгий
    Клиповое мышление, недисциплинированность, безволие. Надо работать над собой.
    Ответ написан
    2 комментария
  • Какие ошибки в данном коде?

    Adamos
    @Adamos
    Компилятор же тычет носом в строчки, где проблема.
    А проблема в том, что программист небрежен и не пользуется IDE, которая ткнула бы его носом более предметно - где он забыл фигурную скобку, где кавычки, а где - упомянуть класс, метод которого вызывает. Вот и все три ужасные ошибки.
    Ответ написан
    1 комментарий
  • Как убрать мусор из 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?

    Имеются ввиду и объекты и строки и массивы и т.п.

    Кажется, у вас немного каша в голове. В 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 и прочие?

    Если вы хотите писать на си, то посмотрите в сторону GTK
    Или в сторону Qt (C++)

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

    Хорошо написанный, и скомпилированный в -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 комментария