Ответы пользователя по тегу C
  • Указатель или Индекс элемента?

    BacCM
    @BacCM
    C++ почти с рождения
    Квадратные скобки это более удобный и читабельный вариант записи
    a[i] обозначает ровно *(a+i)

    Поэтому законен и валиден код

    1[a] = 42;

    Для обращения в первому элементу массива например.

    Иногда нет необходимости аводить отдельную переменную для индекса, и тогда код без скобок может быть предпочтительнее:

    size_t i = 0;
    while (a[i] != 0) {
      a[i] = 3;  /// <- тут если без оптимизации лишняя операция с индексами :)
      ++i;
    }
    
    // или
    
    while (*a != 0) {
      *a = 3;
      ++a;
    }
    // правда тут надо понимать, что a изменилась после цикла
    Ответ написан
    Комментировать
  • Ошибка при чтении из файла в си.Что делать?

    BacCM
    @BacCM
    C++ почти с рождения
    1. Стоит проверять что возвращает функция чтения fscanf.
    Она явно не смогла прочитать число из потока.
    У тебя в файле после последней единицы что-то есть типа возврата строки, пробела или чего-то подобного.

    2. Уже к чистоте кода держите переменные ближе к месту использования. temp сразу перед fscanf и ещё и чем нибудь инициализировать. Тогда как минимум в подобных случаях будет не последнее значение, а "маркер"
    Ответ написан
  • Следует ли начинать изучение C++ с C?

    BacCM
    @BacCM
    C++ почти с рождения
    Лучше начинать с C++. Иначе на C++ будете писать как на Си с классами.
    Правда в любом случае будет больно. Например в современном C++ про ручное выделение и управление памятью можно не думать. Есть всякие хорошие вещи типа идиом RAII, шаблонов и перегрузки функций. Неплохая стандартная библиотека (и boost для тех кому надо). Перейти на C в большие проекты - будет больно, очень больно. Но лучше так чем наоборот.
    Ответ написан
    2 комментария
  • Как упростить сравнение 4 чисел с помощью if?

    BacCM
    @BacCM
    C++ почти с рождения
    Чем проще написать тем лучше. Если значений только четыре и не предполагается это количество менять. То просто написать условие. Но лучше эту проверку вынести в правильно названую функцию, чтобы читающий код понимал что происходит.
    Ответ написан
    Комментировать
  • Чем отличается обявление int* a от int *a в Си?

    BacCM
    @BacCM
    C++ почти с рождения
    В С как и большинстве языков, пробелы в коде можно игнорировать. Они являются просто одним из разделителей лексем. Притом некоторые лексемы разделяются и без разделителей.
    Ответ написан
    Комментировать
  • Всегда ли нужно использовать тип int?

    BacCM
    @BacCM
    C++ почти с рождения
    Всё зависит от целей. В подавляющем большинстве случаев можно использовать int и не беспокоиться о перерасходе памяти.
    Задумывается стоит если таких переменных миллиарды или ресурсы очень ограничены.
    Я бы скорее задумывался о возможности переполнения, не всегда результат операции с переменными конкретного типа в него помещается. Это важнее, чем мистическая экономия.
    И еще важно чтобы типы в выражении соответствовали друг другу и ожиданию программиста.
    Ответ написан
    Комментировать
  • Как разобрать код SimpleTerminal?

    BacCM
    @BacCM
    C++ почти с рождения
    1) Возможно это происходит при каких-то опциях компиляции? Типа берется некий дефолтный файл, а в других случаях какой-то иной.

    2) Потому что там сразу первым делом argv++
    Ответ написан
  • "Нечитаемый" код?

    BacCM
    @BacCM
    C++ почти с рождения
    Ну начнем с того, что строку можно перевернуть не выделяя дополнительной памяти. Во вторых возвращать из функции указатель на выделенный блок памяти без лишней необходимости не стоит. Иначе как минимум нужно будет сделать функцию освобождения этого блока.
    Что касается циклов. Делать так можно, если никого в команде это не напрягает, но на мой взгляд не нужно. Просто современные компиляторы отлично оптимизируют код, и практической необходимости в подобных упражнениях нет, а ошибиться гораздо легче. Не зря в новые стандарты добавлены циклы по диапазонам и прочие плюшки.
    Ответ написан
    2 комментария
  • Почему выполнение программы завершается с ошибкой?

    BacCM
    @BacCM
    C++ почти с рождения
    Если код на с++ то забудьте про char* как что-то связанное со строками.
    Ответ написан
    Комментировать
  • Как правильно разделить Си проект на файлы?

    BacCM
    @BacCM
    C++ почти с рождения
    Ну как минимум использование перекрестных переменных уже нелогично. Лучше функциями это обернуть. Как бы инкапсулировать в модуль.
    Правильный способ это на бумаге нарисовать модули/объекты системы и обозначить как они взаимодействуют между собой и внешним миром. И уже исходя из этого разбивать. В идеале чем больше модуль похож на черный ящик тем лучше с точки зрения системности.
    Как лакмусовая бумажка может использоваться то, что из одного модуля вдруг надо копаться в кишках другого, или знать о том как там что-то реализовано.
    Как пример именно для Си - стандартная библиотека. Открываешь файл получаешь указатель на структуру FILE но тебе, абсолютно не важно какие там поля, создается она по malloc или заранее созданный объект из некоего массива таких объектов. Это уже скрыто реализацией. Есть функции которые работают с этим указателем и всё.
    Как плохой пример "не очень черного ящика" можно рассмотреть strtok строка которая передается на вход будет модифицироваться и портится, что может быть не очевидным из семантики. Но сделано в угоду скорости и использования памяти.
    Ответ написан
    2 комментария
  • Можно ли использовать переменные в функцие system?

    BacCM
    @BacCM
    C++ почти с рождения
    Как уже предлагалось выше:
    int main(void)
    {
    	int i = 1;
    	system(("echo $" + std::to_string(i)).c_str());
    	return 0;
    }


    Ну либо, если компилятор не знает таких новомодных штук как to_string
    то заменяется на itoa, sprintf, stringstream и т.д. по вкусу...

    А так действительно стоит почитать книжки умные.
    Ответ написан
    Комментировать
  • Есть ли разница между char* и char[число] при передаче аргументов функции?

    BacCM
    @BacCM
    C++ почти с рождения
    Компилятор скорее всего ругаться не будет, но ты можешь зато использовать sizeof, хотя это достаточно спорный момент, т.к. всё равно в аргументах есть явный размер.
    Не помню чтобы реально хоть раз была практическая необходимость "передавать" массив заранее известного размера. Только если этот массив, какие-нибудь координаты или пара значений.
    Ответ написан
  • C++ как инкапсулировать глобальную функцию в обьект?

    BacCM
    @BacCM
    C++ почти с рождения
    Отдельный модуль cpp/h
    #include включена только в этот h
    И на все нужные функции свои врапперы, с проверкой дополнительного флага, вызывался ли инит.
    Ответ написан
    Комментировать
  • С или С++ для микроконтроллеров. Почему С?

    BacCM
    @BacCM
    C++ почти с рождения
    Так исторически сложилось. Почти всё с чем имел дело имеют сносные компиляторы для C и с кучей недочетов для C++.

    Получается на C++ в этой среде не сильно большой запрос, а потому толком не оптимизировано, каряво. Как следствие разработчики предпочитают C.

    В последнем большом проекте под OMAP я выбрал C++ т.к. вроде бы хорошо поддерживается CCS от TI. Но по началу много услышал нелестного на эту тему от команды. Пока придумали как обойти все грабли, кучу времени убили.
    Ответ написан
    Комментировать
  • Почему этот код возвращает такой странный ответ?

    BacCM
    @BacCM
    C++ почти с рождения
    Просто без отладчика в уме "выполни" свою программу и увидишь, что никогда не попадаешь в тело if
    Ответ написан