Ответы пользователя по тегу C
  • В какого типа переменных хранить адреса?

    @dima20155
    you don't choose c++. It chooses you
    Что значит боитесь случайно обратиться к указателю?
    Сделайте указатель констатнтным, где это нужно,чтобы вы могли лишь посмотреть значение по указателю, но не могли изменить значение по указателю
    Напишите класс-обертку, которая не возволит случайно изменить значение по указателю (переопределить operator* -> и так далее)

    Возвращаясь к вашему вопросу: храните в любой переменной, которая может адресовать всю нужную вам память, но имейте в виду, что в век 64битных процессоров указатель должен иметь тип uint64_t большинстве современных платформ, иначе вы потеряете возможность адресовать большую часть памяти (если, конечно, ваша целевая платформа не MCU или что-то в этом роде)
    Ответ написан
    Комментировать
  • Как запускается программы в Linux?

    @dima20155
    you don't choose c++. It chooses you
    How Linux run program:
    https://0xax.gitbooks.io/linux-insides/content/Sys...

    При большом желании вы можете даже пойти и найти исходники и посмотреть как это выглядит с точки зрения кода

    Кстати, вот и исходники date
    https://github.com/coreutils/coreutils/blob/master...
    Ответ написан
    1 комментарий
  • Как присвоить динамическому массиву типа void* значение в Си?

    @dima20155
    you don't choose c++. It chooses you
    Во-первых, malloc возвращает void *, поэтому приводить ничего не нужно.

    value[1] = 10; // Ошибка
    *(value + 1) = 10; // Ошибка

    Данные выражения вызывают ошибку потому что sizeof(void) не определен.
    https://stackoverflow.com/questions/1666224/what-i...
    Вы не можете скопировать массив не зная размер его элемента и количество элементов или исходный размер массива в байтах.

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

    @dima20155
    you don't choose c++. It chooses you
    Если вы хотите выводить элементы структуры, то пусть самурая - переопределить
    operator<<
    примерно так:
    std::ostream operator<<(std::ostream& os, const S1& s) {
        os << "s.a: " << s.a << ", s.b: " << s.b;
    }


    Шаблон вам здесь не пригодится, поскольку только ваша структура содержит поля a и b.
    Любой другой класс/структура содержит другие поля, а соответственно, данная шаблонная функция вызовет ошибку компиляции для них из-за отсутствия соответствующих полей.

    Шаблоны полезны там, где есть общий интерфейс, например, можно написать шаблонную функцию, которая проходится по контейнеру и выводит его значения (поскольку многие STL контейнеры итерируемы и этот функционал имеет единый интерфейс)
    Ответ написан
    Комментировать
  • Не открывается exe файл после компиляции gcc. Что делать?

    @dima20155
    you don't choose c++. It chooses you
    Что значит не открывается?
    Если у вас приложение, которое выводит "hello world", то вы просто не успеете увидеть, результат, как оно мгновенно закрывается. Если я прав, то используйте std::getchar(); (или её С аналог) в конце.
    Ответ написан
    2 комментария
  • ++i быстрее чем i++?

    @dima20155
    you don't choose c++. It chooses you
    ++i инкрементирует и возвращает ссылку на переменную i.
    i++ создает временную переменную и сохраняет в неё текущее значение, инкрементирует значение переменной i, возвращает временную переменную.

    Как видно у нас тут есть лишнее действие с переменной.
    Но если вы просто напишите
    ++i;
    i++;
    то компилятор достаточно умный, чтобы понять, что можно заменить одну инструкцию на другую.

    Написал код, который подтверждает мои слова:
    https://godbolt.org/z/GvMejj1bd
    Смотрите именно вывод ассмеблер.
    Для удобства чтения разделил все nop инструкциями
    Ответ написан
    Комментировать
  • Почему scanf_s("%[^3]", str) при считывании символа '3' просто останавливается на этом символе, а не переходит к следующему?

    @dima20155
    you don't choose c++. It chooses you
    Потому что так реализовано:

    [set]
    matches a non-empty sequence of character from set of characters.
    If the first character of the set is ^, then all characters not in the set are matched. If the set begins with ] or ^] then the ] character is also included into the set. It is implementation-defined whether the character - in the non-initial position in the scanset may be indicating a range, as in [0-9]. If width specifier is used, matches only up to width. Always stores a null character in addition to the characters matched (so the argument array must have room for at least width+1 characters)


    Ссылка

    Если вам не нужно "зависать" на символе, то используйте другой формат, например %c, %s (симолы/строки)
    Ответ написан
    7 комментариев
  • Почему происходит SEGFAULT?

    @dima20155
    you don't choose c++. It chooses you
    Интересный случай.
    Стоит изучить как индексируется __m128.
    https://stackoverflow.com/questions/12624466/get-m...

    Upd1: Интересный факт. Кажется, что GCC не выравнивает __m128d
    Попробуйте __m128d_u
    https://godbolt.org/z/eqKd9v63n
    Ответ написан
    Комментировать
  • Какие навыки требуются Junior программисту микроконтроллеров?

    @dima20155
    you don't choose c++. It chooses you
    1. Прежде всего, нужно знание схемотехники, но в вашем случае этот этап можно вычеркнуть.
    2. Естественно, знание основ С и С++ (синтаксиса, базовых конструкций). Советую вам использовать в своих проектах С++, поскольку зачастую вы сможете писать в стиле С без каких-либо проблем, а при необходимости воспользоваться фичами/библиотеками для С++.
    3. Навыки hardware и software отладки. Здесь просто нужна практика с любимой IDE.
    4. Понимание указателей, типов памяти (статическая, динамическая, автоматическая, регистровая). Как память выделяяется и прочее.
    5. Знание базовых структур данных. Это немного скользкий пункт, поскольку С++ предоставляет хорошую (хотя и весьма минималистичную) стандартную библиотеку STL, в которой есть большинство из необходимых структур данных, но они используют довольно много дополнительной аллокации памяти, поэтому если пишете под что-то 8битное, то имейте это ввиду.
    6. Знание git на базовом уровне сейчас важно для джуна любой IT специализации.
    7. Неплохо бы иметь базовое представление о том как устроен микроконтроллер и его архитектура.
    8. Неплохо бы понимать RTOS (FreeRTOS - классика жанра), а главное зачем он нужен, а когда он не нужен или вреден.
    9. Лично мне всегда в работе пригождается python, но это всегда сторонние задачи/автоматизация.

    P.S. Нашел ещё вот такой RoadMap.
    P.S.S. Получилось довольно объемно. Но пункты 2-5 по сути можно объединить в один. Все это можно изучить написав парочку проектов для классической STM32 + HAL.
    P.S.S.S. Сам начинал как hardware разработчик. Путь embedded разработчика начального уровня не был сложным для меня и занял не очень много времени.
    Ответ написан
    Комментировать
  • Как скопировать информацию из файла в структуру?

    @dima20155
    you don't choose c++. It chooses you
    Данные в файле - символы
    Сериализация массива чатов будет работать нормально, а вот int сертализуется с большой вероятностью в нечитаемые символы, поэтому либо перепишите сериализацию/десериализацию, либо читайте символы и кастуйте их в правильные данные
    Ответ написан
    Комментировать
  • Как переписать функцию с C на JS?

    Комментировать