Ответы пользователя по тегу C
  • Не могу найти ошибку в использовании long double в C?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Но в итоге все равно какие-то совсем другие цифры получаются.

    Т.е. вы знаете наверняка, что y имеет другое значение? Потому что, на мой взгляд, логика изменения y в цикле немного странная.
    Ответ написан
    2 комментария
  • Что подразумевается под проверкой на денормализованные числа в коде?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Подскажите пожалуйста, какую функцию здесь выполняет строка return ((bitset.intRepresent & (bitset.intRepresent-1)) == 0); // denormalized number - как она проверяет число на денормализованое значение?

    Никак не проверяет. Этот код -- барахло.
    Смотрим сюда и пишем:
    #include <stdint.h>
    #include <string.h>
    
    int isPowOf2(double number)
    {
        uint64_t v;
        uint64_t m;
    
        memcpy(&v, &number, sizeof(v));
        m = v & ((UINT64_C(1) << 52) - 1); // m holds the mantissa bits
    
        switch ((v >> 52) & 0x7ff) { // check the exponent bits
        case 0: // 0 or denormal
            if (m == 0) // 0 is represented by exponent and mantissa both 0
                return 0; // 0 is not a power of 2
            else // denormal number has all its bits in the mantissa
                return m & (m - 1) == 0; // a power of 2 has exactly one 1 bit in m
    
        case 0x7ff: // infinity or NaN
            return 0; // neither is a power of 2
    
        default: // ordinary number always has leading 1 which is not recorded in the mantissa
            return m == 0; // a power of 2 has exactly one 1 bit and we know that it's not in m
        }
    }
    Ответ написан
    Комментировать
  • Как присвоить integer элементу массива символ char?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    memset(arrayC, '-', sizeof arrayC);

    Делает не то, что вы ожидаете. sizeof arrayC будет равен размеру указателя, поскольку в функцию массив передаётся как указатель, несмотря на то, что в прототипе написано int arrayC[3][3].
    if( x == arrayI[i][j])

    Вы не показали как инициализирован массив arrayI, поэтому неизвестно, когда это условие сработает.

    Как присвоить элементу любому этой матрицы любой символ?

    Ровно так как вы и делаете -- arrayC[i][j] = 'W';
    Ответ написан
    5 комментариев
  • Дублирование кода в целях makefile, как избежать?

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

    Можно написать макрос-генератор целей. Изменяющиеся параметры можно передать как параметры макроса, внутри на них можно ссылаться по номеру. Например так:

    define generate-targets
    $(1): 
     make -j5 TARGET=unwired BOARD=$$(BOARD)/$$(CPU) -f makefiles/Makefile.$$@
     ../bootloader/generate-metadata/generate-metadata $$@.bin 0x0 0x01A00001 1
     srec_cat firmware-metadata.bin -binary $$@.bin -binary -offset 0x100 -o $$@-ota-image.bin -binary
     rm $$@.hex
    
    $(1)-fb: $(1)-CLEAN
      ../../tools/backdoor-bootloader.py -e -w -v $(1)-firmware.hex
    
    $(1)-f: $(1)-CLEAN
     /Applications/ti/Uniflash/flash_cc1310.sh $(1)-firmware.hex 
    
    $(1)-ota: $(1)
     scp $(1)-ota-image.bin root@192.168.20.187:/root/unwired_smarthome
    
    endef


    Внутри макроса нужно экранировать $ заменяя его на $$.
    Этот макрос можно вызывать в нужном месте следующим образом:

    $(eval $(call generate-targets,ubrige))

    Сгенерированный в этом месте код будет эквивалентен коду из вопроса.
    Ответ написан
    Комментировать
  • Как это скомпилировать?

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

    Проще всего -- установив -dev пакет в своей ОС:
    apt-get install libfcgi-dev
    gcc -o main main.c -lfcgi -pthread

    Если установить -dev не позволяет религия или другие ограничения, нужно указать компилятору откуда брать libfcgi, так же как вы указали откуда брать fcgiapp.h:
    gcc -I /home/user/lessons/tests/include -L/home/user/lessons/tests/lib -o main  main.cpp -ldl -lfcgi -lpthread

    Путь ...tests/lib -- условный, вам надо будет указать каталог в который установлена libfcgi.a либо libfcgi.so
    -lpthread

    Вместо -lpthread правильнее писать -pthread: -lpthread только линкует с libpthread, -pthread в добавок к этому определяет макрос _REENTRANT для исходников которые компилируются с этой опцией.
    Ответ написан
    2 комментария
  • Как обезопасить функцию от прерывания?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    P.S. выделение памяти в прерываниях зло и т.д. ага.

    Дело говоришь. Вообще какая-либо существенная работа в обработчике прерывания -- зло. Избегай этого по возможности.

    Так вот, что бы не проставлять кучу __disable_irq(); __enable_irq();

    А никак иначе. Но обычно есть возможность делать не disable/enable а save+disable/restore, т.е. запрещать прерывания, одновременно возвращая текущее состояние запрета и восстанавливать это состояние.
    Ответ написан
    5 комментариев
  • Как найти логарифм числа произвольной точности на C (в Linux)?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Ответ написан
    Комментировать
  • Как задать размер массива через аргументы функции?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Но не дает задавать так размеры ("m и n должны иметь константное значение). Как тогда это можно сделать?

    С99 позволяет. Используйте уже С99, 18 лет прошло с момента его принятия.
    Связанный вопрос/ответ про передачу многомерного массива прямо через аргументы функции: Как засунуть n — мерный массив в аргумент функции?
    Ответ написан
    Комментировать
  • В чем разница между syscall setreuid в C/C++ и asm?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    в чем проблема то тогда

    а по ходу нельзя из elf64 вызывать системные вызовы через int 0x80. Так что либо замени int 0x80 на syscall (и, кстати, _NR_exit для x86_64 -- это 60), либо используй nasm -static -f elf32 и ld -m elf_i386 (и тогда _NR_setreuid будет 70).
    Ответ написан
    3 комментария
  • Какие оптимизации используются в языках С и С++?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Мне не нужен полный список низкоуровневых оптимизаций, таких как размещение переменных в регистры, а нужны такие, как вычисление константных выражений или раскрытие простых методов (get/set). Какие оптимизации в C и C++ различаются? В частности, рассматриваю gcc.

    gcc -Q --help=optimizers выведет список всех включенных в настоящий момент (другими опциями командной строки) оптимизаций. Что каждый из -f* ключей означает можно посмотреть тут: https://gcc.gnu.org/onlinedocs/gcc/Optimize-Option...
    Ответ написан
    1 комментарий
  • Почему не работает sscanf?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Чтобы работало с приведённой строкой, формат должен быть таким:
    sscanf(mycharp, "%[^'*']*,%[','^]", o, s);
    Исходный формат не работает, потому что обработка %[^'*'] остановится на входном символе *, и так там и останется, потому что последующая часть форматной строки не поглощает этот символ.
    Кроме того, вы, мне кажется, понаставили лишних апострофов внутри квадратных скобок. В форматной строке они интерпретируются буквально, т.е. формат "%[^'*']" означает "символы, кроме апострофа, звёздочки или апострофа". Вот так тоже должно работать:
    sscanf(mycharp, "%[^*]*,%[,^]", o, s);
    Ответ написан
    3 комментария
  • Почему в Си допускается переполнение массива?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Почему строковый массив может переполняться без какой-либо ошибки?

    Потому что диагностика такой ошибки не требуется от реализаци. Есть реализации диагностирующе такие ошибки, например gcc + ASAN.
    Ответ написан
    Комментировать
  • Как построить АЧХ на языке "C" в eclipse для микроконтроллера?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    потому что он не может различить функции sin(),sqrt() и т.д даже с подключенной библиотекой math.h

    С математикой, конечно, лучше разобраться. Например попробовать подсунуть ключ -lm линковщику.

    Но, по правде говоря, вам ведь не нужны функции sin и cos, вам нужны только их значения для фиксированных аргументов. Табличку значений вполне можно заполнить и вывести где угодно и использовать как массив в коде выполняемом на контроллере.
    Ответ написан
    Комментировать
  • Почему не работает семафор?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Может быть добавить Local\\ к имени семафора?
    Ответ написан
    6 комментариев
  • Почему не работает код?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Что я делаю не так ?

    for(int i2=(sizeof mas/sizeof mas[0]-1);i2>=0;i2--){
    if(mas[i2]>mas[i2-1]){

    Что происходит в условии if и дальше в цикле при i2 == 0?
    Ответ написан
    Комментировать
  • Функция sin в Си. Как взять sin от значения в переменной?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    "undefined reference to ..." означает, что символ не найден во время линковки.
    Нужно добавить -lm в команду линковки, потому что реализация sin находится в библиотеке libm. О чём, кстати, говорит man sin.
    Первый вариант работает, потому что значение sin(50) можно вычислить во время компиляции, что компилятор и делает.
    Ответ написан
    1 комментарий
  • Как сделать layer 2 dissector wireshark?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Как передать в диссектор кадр целиком? Чтобы оно не выделяло Ethernet заголовок при парсинге пакета?

    Зарегистрироваться не на "ethertype" а на "eth" или на "frame"?
    Ответ написан
    Комментировать
  • Как правильно использовать gettext в C?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    man setlocale предлагает
    int main (int argc, char * const argv[], char * const argp[])
    {
        setlocale(LC_ALL, "");
        ...
    }

    совместно с переменной окружения LC_ALL или LANG.
    Ответ написан
  • Проблемы с фукнцией atoi?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Maqsat Batyrqul: atoi -- функция из стандартной библиотеки С, она работает с С-строками. С-строка это последовательность символов в памяти, заканчивающаяся символом конца строки -- символом с кодом 0.
    Написав *temp = s[i], или что то же самое temp[0] = s[i] вы скопировали i-й символ из строки s на первое место в строке temp. Проблема изначального кода в том, что указатель temp не инициализирован, а значит может указывать в любое место в памяти. Т.е. вы скопировали символ в любое место в памяти. Мест в памяти в которые можно записывать существенно меньше, чем мест, в которые записывать нельзя. По счастливому стечению обстоятельств temp в вашей программе указывал в место, в которое записывать нельзя, в результате чего вы видели Segmentation fault при попытке записать туда.
    В отличие от char *temp, запись char temp[2] определяет не указатель, а массив. Массив -- это непрерывный участок памяти. Если массив не константный, в него можно писать. Имя массива в большинстве случаев ведёт себя как указатель на первый элемент массива. Инициализировав массив нулями вы получили два нулевых символа в памяти, в которые можно писать. В цикле вы заменяете первый символ в этом массиве на i-й символ из массива s, второй символ остаётся неизменным -- символом с кодом 0, т.е. символом конца строки. Т.е. массив temp в цикле представляет собой С-строку единичной длины, которую можно передавать на вход atoi.
    Ответ написан
    Комментировать
  • Как пользоваться stdint.h?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    uint_fast64_t number = 184467440737095511615;

    В этом месте нужно написать
    uint_fast64_t number = UINT64_C(184467440737095511615);

    Даже присваиваться не хочет, как такое выводить тоже не понятно.

    В inttypes.h есть макросы для форматирования типов из stdint.h в printf, вам нужен PRIuFAST64:
    printf("%"PRIuFAST64"\n", number);

    Ну и да, для криптографии этих типов скорее всего будет мало. Порекламирую https://gmplib.org/ для разнообразия.
    Ответ написан
    Комментировать