Задать вопрос
Ответы пользователя по тегу C
  • Что лучше начать читать про API linux или про ядро Linux?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Linux API. Исчерпывающее руководство

    С него. Потому что это именно то, что нужно чтобы научиться "программировать под линукс".
    Ответ написан
    Комментировать
  • На Си функции не могут быть вложенными друг в друга?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    В соответствии со стандартами языка -- не могут. Но есть расширения (в частности, у gcc), позволяющие определять функции вложенные в другие функции.
    Зачем? Вложенные функции -- это лямбды, которые были до лямбд С++.
    Ответ написан
    Комментировать
  • Препроцессоры вставляют файл целиком через #include или частично?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Препроцессоры "глупые" и пихают весь код из подключенных заголовочных файлов, или только тот, что нужен программе после вставляет компоновщик?

    Да.

    Т.е. препроцессоры глупые и пихают весь код из подключенных заголовочных файлов. Но дело в том, что в заголовочных файлах C кода как такового почти нет. Обычно там определения типов и объявления функций. Определения функций скомпилированы и находятся в библиотеках. И компоновщик достаёт из библиотек и линкует только те функции, которые реально используются.

    P.S. Т.е. если перефразировать вопрос, то он бы звучал так: можно ли выборочно подключать только необходимые функции из подключаемых библиотек?

    Это происходит по умолчанию.

    Если первой строчкой кода записать #include <stdio.h>

    Загляни ради интереса в stdio.h и попробуй найти там определение (не объявление) функции printf.
    Ответ написан
    2 комментария
  • Как скопировать значение переменной окружения через указатель в СИ?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Как скопировать значение

    Для этого надо понимать структуру данных. Структура переменных окружения такова: есть символьный массив содержащий текст всех переменных, и есть массив указателей, содержащий указатели на начало каждой переменной в первом массиве. Копировать указатели из второго массива но не копировать сами переменные бесполезно.

    С другой стороны, в этом задании вообще не нужно ничего копировать. И пользоваться strtok тоже не нужно. Нужно искать длину названий переменных. Сделать это можно так:
    #include <string.h>
    
    void ShortNames(char **arr, int num)
    {
        int i;
        for (i = 0; arr[i]; ++i) {
            int len = strchr(arr[i], '=') - arr[i];
            if (len <= num)
                printf("%.*s\n", len, arr[i]);
        }
    }
    Ответ написан
  • Как задать поведение препроцессора C в GCC?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Смысл его прост: отменить действие макроса в определенной части кода, а по ее истечении восстановить этот макрос.

    Таким образом этого сделать нельзя. Потому что в месте где написано #define temp func значение макроса func не подставляется. В temp попадает буквально слово func. После #undef func содержимое макроса func будет потеряно. Это поведение предписано стандартом, мне неизветсны опции компилятора, которыми его можно было бы изменить. См. eelis.net/c++draft/cpp.replace#10 и eelis.net/c++draft/cpp.rescan

    Но если внести ещё один уровень косвенности, то можно сделать чтобы это работало. Например:
    #define foo bar
    #define func foo
    ...
    #undef func
    ...
    #define func foo
    Ответ написан
    3 комментария
  • В чем проблема в коде?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    пока z не сделаетется в 1024/1000000*255*20 секунд ждем
    while (z < 21) 
    {   
        if (TCNT0 == 255) 
        {
            z++;    
        };
    };

    Русским языком говоря , нажал кнопку подождал примерно 5.2 с

    Не, ты тут подождал какое-то другое время. Потому что если в таймер заходит clkio/1024, то TCNT будет равен 255 далеко не один цикл.

    Код не работает в протеусе и сыплет ошибками

    Ну так он же пишет тебе адрес, PC=0x005e, посмотри что по этому адресу происходит.
    Ответ написан
  • Почему при удалении файла fwrite не возвращает ошибку?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    В процессе выполнения программы удаляю файл и вижу, что fwrite продолжает возвращать количество записанных байт, при этом файла нет, и он не пересоздается.

    Ты не файл удаляешь, а только его имя из каталога. Файл остаётся до тех пор, пока не будет закрыт последний дескриптор указывающий на него. Все процессы открывшие файл до удаления его имени будут иметь к нему доступ до тех пор. В этом можно убедиться заглянув в /proc/<pid>/fd твоего процесса.
    Ответ написан
    5 комментариев
  • Каким образом здесь происходит упаковка структур?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    каким образом тут спаковалась структура?

    На картинке явно первое поле (31 байт), второе поле (16 байт), дырка в 1 байт, третье поле (4 байта), четвёртое поле (4 байта).
    Ответ написан
  • Как изменить исходный код vlc что бы дописывать в лог временные метки фильтра motiondetect?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    В структуре picture_t которая передаётся в Prepare* и в Filter есть поле date, возможно оно вам поможет.
    Ответ написан
    Комментировать
  • Откуда появляется ошибка?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    mid = high + low;
    guess = arr[mid];

    Первая очевидная ошибка здесь: сумму надо бы разделить пополам.

    else if (guess < item)
      low = mid - 1;

    Вторая очевидная ошибка здесь: mid может быть равен 0, а значит low может вылезти за пределы массива снизу.

    С условием выхода из цикла поиска при отсутствии искомого значения в массиве тоже не всё ОК.

    int arr[length];
    Если length = 2147483647, то программа вообще отказывается работать.

    Ты пытаешься разместить массив размером 8ГБ на стеке. Как видишь, это не очень хорошая идея.
    Ответ написан
    1 комментарий
  • Как в gcc сохранять объектные файлы(в другой папке)?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Как в gcc сохранять объектные файлы

    Опция -o -- путь к результату, препроцессирования/компиляции/линковки. Научи свой Makefile подставлять правильный путь в эту опцию.
    Ты скажешь "а у меня 100500 исходных файлов компилируется разом". Ответ -- а не надо так делать. Компилятор всё равно вызывается каждый раз новый. Напиши правило компилирующее один файл в нужный каталог -- и выполни его по разу для каждого исходника. Например так:
    NAME = calc
    
    SRC = main.c \
      parser.c \
      ft_lib/ft_atoi.c \
      ft_lib/ft_putchar.c \
      ft_lib/ft_putnbr.c
    
    BUILDDIR=build
    OBJ = $(addprefix $(BUILDDIR)/,$(subst /,_,$(patsubst %.c,%.o,$(SRC))))
    
    FLAGS = #-Wall -Wextra -Werror
    
    all: $(NAME)
    
    $(NAME): $(OBJ)
      gcc $(OBJ) -o $(NAME)
    
    define CC_RULE =
    $(BUILDDIR)/$(subst /,_,$(patsubst %c,%o,$(SOURCE))): $(SOURCE)
      gcc $(FLAGS) -c $< -o $@
    endef
    
    $(foreach SOURCE,$(SRC),$(eval $(call CC_RULE,$(SOURCE))))
    
    clean:
      rm -f $(OBJ)
    
    fclean:
      rm -f $(NAME)
    
    re: fclean all


    Смотри: я сделал список объектников из $(SRC), написал генератор CC_RULE, который для любого исходника генерирует правило компиляции его в объектник под $(BUILDDIR) и вызвал его для всех исходников в $(SRC).

    Это забавное развлечение, но гораздо практичнее воспользоваться существующей системой сборки: autotools/CMake/...
    Ответ написан
    4 комментария
  • База Данных на СИ. Почему не компилирует далее?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    scanf_s("%[^/n]s", b.book_name);
    printf_s("Enter the price and quantity\n"); // Не появляется далее это.

    Не появляется, потому что у тебя в предыдущей строке ерунда написана.
    Ответ написан
  • Как правильно обращаться с массивом строк в си,си++?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    char *grps[] = {""};
    Но получается так, что в grps храниться только первая gr, а последующие не записываются.

    Ты понимаешь, что у тебя в массиве grps -- один единственный элемент, и запись всех элементов после первого происходит мимо этого массива, куда-то на стек, портя другие данные?

    grps[k] = new char[8];
    ...
    String^ st = gcnew String("");

    А если твой вопрос не про С, то поправь теги.
    Ответ написан
    6 комментариев
  • Как добавить мнимую единицу на языке Си?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    как добавить мнимую единицу?

    complex_t I = {0., 1.};
    Ответ написан
    Комментировать
  • Почему при вводе нечислового значения цикл работает бесконечно?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    В чем проблема?

    В том, что данные читаемые scanf -- это поток. Если формат (в вашем случае %f) не может извлечь данные из потока, они остаются там.
    Чтобы сбросить данные которые невозможно прочитать можно использовать scanf("%*[^\n]");:
    while (scanf("%f", &firstNum) == 0) {
          printf("Enter a NUMBER: ");
          scanf("%*[^\n]");
      }


    Эта конструкция читает текущую строку до символа конца строки в пустоту.
    Ответ написан
    Комментировать
  • Почему возникает эта ошибка?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    в видео видно в чем ошибка

    в коде видно где исправить.
    Ответ написан
    8 комментариев
  • Вакансии C Junior developer?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    вообще такое бывает в 2020 году?

    Бывает летняя практика/internship, рекомендую начать с этого.
    Ответ написан
    Комментировать
  • "undefined reference to" при линковке, что делать?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Хотелось бы скинуть на русском или на английском но увы, у меня линковщик почему-то говорит на украинском

    export LANG=C в консоли где выполняется линковка должен решить эту проблему.

    невизначене посилання __stack_chk_fail_local

    можно компилировать исходник на C с ключами -fno-stack-protector -fstack-check=no чтобы компилятор не вставлял проверки и вызовы этой функции. См.
    Ответ написан
    Комментировать
  • Как сделать или как работает listen localhost?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    я думаю что наверное надо делать bind на 127.0.0.1, но так ли это?

    Да. INADDR_LOOPBACK -- специально макрос для этого адреса есть.
    Ответ написан
    Комментировать
  • Как формируется размер бит полей?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Если по логике 33/8=4

    Если логика математическая, то 33/8 = 4 1/8. И эту одну восьмую тоже надо где-то хранить.
    Ответ написан
    2 комментария