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

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Откуда диапазон значений, тоже понятно. Но что конкретно происходит при попытке выйти за этот диапазон?
    Почему при вычислении степеней двойки в какой-то момент выводится минимальное значение, -32768, а затем - одни нули?

    Точно понятно?

    2^0 == 0b0000000_00000001 == 1 (16 младших разрядов)
    ...
    2^14 == 0b01000000_00000000 == 16384 (16 младших разрядов)
    ...
    2^15 - 1 == 0b01111111_11111111 == 32767 (16 младших разрядов)
    2^15 == 0b100000_00000000 == -32768 (16 младших разрядов)
    2^15 + 1 == 0b100000_00000001 == -32767 (16 младших разрядов)
    ...
    2^16 - 1 == 0b11111111_11111111 == -1 (16 младших разрядов)
    2^16 == 0b1_00000000_00000000 == 0 (16 младших разрядов)
    2^16 + 1 == 0b1_00000000_00000001 == 1 (16 младших разрядов)

    Что происходит при других операциях со слишком большими числами?

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

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

    1) понять, что эти функции будут принимать и что возвращать
    2) перенести код ввода в первую функцию
    3) написать вторую функцию
    Ответ написан
    Комментировать
  • Как включить в статическую библиотеку все зависимости из других стат.библиотек в CMake проекте?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Проект создаёт статическую библиотеку mylib, но в неё не включена требуемая реализация boost, то есть при линковке приложения с mylib нужно явно указывать, что нужно линковать boost.

    Так обычно библиотеки и делают -- ни одна нормальная библиотека не тащит с собой часть другой.
    А вот для того, чтобы указать, что у библиотеки есть зависимости используют pkg-config. Такая библиотека устанавливает в системе свой архив (*.a), свои заголовочные файлы (*.h) и описание для pkg-config (*.pc). Пользователь библиотеки вызывает pkg-config --libs <имя библиотеки>и получает список ключей для линковки.
    Ответ написан
    Комментировать
  • Как увидеть float или double в двоичном формате?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    $ cat > dump-fp.c <<EOF
    #include <inttypes.h>
    #include <string.h>
    #include <stdio.h>
    
    void dump_float(float v)
    {
        uint32_t i;
        memcpy(&i, &v, sizeof(i));
        printf("0x%08"PRIx32"\n", i);
    }
    
    void dump_double(double v)
    {
        uint64_t i;
        memcpy(&i, &v, sizeof(i));
        printf("0x%016"PRIx64"\n", i);
    }
    
    int main(void)
    {
        dump_float(1.0f);
        dump_double(1.0l);
        return 0;
    }
    EOF
    $ gcc dump-fp.c -o dump-fp 
    $ ./dump-fp 
    0x3f800000                                                                                                                                                                                                                                                                     
    0x3ff0000000000000
    Ответ написан
    3 комментария
  • Как исправить ошибку "stdio.h: No such file or directory "?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Как исправить ошибку «stdio.h: No such file or directory »?

    Понять почему она возникает:
    - запустить компиляцию с опцией -v: gcc -v helloworld.c -o helloworld
    - найти в выводе строки
    #include "..." search starts here:
    #include <...> search starts here:

    - посмотреть что за каталоги идут после них, есть ли эти каталоги в твоей системе
    - посмотреть, есть ли в твоей системе stdio.h, и если есть, то где
    - написать сюда результаты выполнения предыдущих шагов.
    Ответ написан
  • Почему линковщик не видит функцию из статической библиотеки?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Выкинуть -L из -L/./lib/libmy2.a.
    -L/./lib/libmy2.a говорит "искать библиотеки в каталоге /./lib/libmy2.a, но во-первых это не каталог, а во-вторых нигде не говорится, что нужно линковать с библиотекой libmy2.a.
    Ответ написан
    4 комментария
  • Как прочитать конкретные байты из файла используя язык С?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Мне нужно прочитать из заголовка адрес точки входа

    Обычно заводят структуру описывающую заголовок, читают в неё заголовок целиком, а потом достают интересующий член структуры. В частности, на linux для ELF определения заголовков Elf32_Ehdr и Elf64_Ehdr можно найти в /usr/include/linux/elf.h
    Вместо чтения в память из файла можно замэпить часть файла в адресное пространство процесса, см. man mmap.
    Ответ написан
    Комментировать
  • Лучшая IDE для разработки под AVR на C?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    vim + avr-gcc + make + gdb
    Ответ написан
    Комментировать
  • Лексер для подсветки синтаксиса языка заданного грамматикой BNF?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    qF5rfVj.png

    Эта грамматика легко сводится к регулярным выражениям flex.

    как построить лексер для грамматики BNF

    парсер для грамматики нужен, если ты собираешься подсвечивать конструкции языка.
    Ну и вообще bison для этого есть, раз уж ты с flex'а зашёл.
    Ответ написан
    Комментировать
  • Как передать память из Си в ассемблер?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Неправильный констрейнт:
    [arr] "m" (arr)

    вместо "m" должно быть "r". "m" означает память на которую ссылается выражение, "r" -- само выражение.
    Ответ написан
  • Где я ошибаюсь, в описании алгоритма crc32/BZIP2?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Руководство по которому я изучал CRC, реально клёвое: www.ross.net/crc/download/crc_v3.txt
    Обычно путаница возникает с представлением данных (big/little endian) и тем, с какой стороны считать биты.
    Ответ написан
  • Вывод char из массива?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    text[t] = word1; // Пытаемся ее сохранить в массив
    выводить будет только последнее значение все i-раз. Никак не могу понять в чем проблема, подскажите пожалуйста

    Так ведь это присваивание не строку сохраняет, а указатель на один и тот же буфер word1, который переписывается новой строкой в каждой итерации первого цикла. Если хочется сохранить строку -- надо копировать. Например так:
    for(t = 0; t < 5; t++){
    
        scanf_s("%s", word1, 32);
        
        // Проводим некоторые операции со строкой //
        
    
        text[t] = strdup(word1); // Пытаемся ее сохранить в массив предварительно попытавшись скопировать
      }
    
      for (t = 0; t < N; t++) {
        printf("\n %d. %s \n", t, text[t]); // Пытаемся вывести
        free(text[t]); // Пытаемся освободить
      }
    Ответ написан
    Комментировать
  • Каким образом задать динамический массив символов (строку) если не известен изначальный размер вводимой строки?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    пробовал через указатель, но не вышло.

    Что пробовал, как не вышло?
    Ответ написан
    Комментировать
  • Как на СИ преобразовать вводимое дробное или целое число в внутренний формат(спт/сфт) и вывести его?

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

    Что такое спт/сфт? С Плавающей Точкой -> С Фиксированной Точкой?
    Просто умножить на 2^(количество битов в дробной части представления с фиксированной точкой) и взять целую часть от результата. Например, для представления с фиксированной точкой 16.16:
    float x = 76.625;
    uint32_t fix = (int32_t)(x * (1 << 16));

    Вывести его проще всего приведя к типу float и поделив на 2 ^ (количество битов в дробной части представления с фиксированной точкой):
    printf("%f\n", (float)fix / (1 << 16));
    Ответ написан
    1 комментарий
  • Как создать хэш таблицу с помощью си?

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

    Да.

    По крупицам собираю информацию в гугле относительно динамических списков и массивов структур, но картина пока не складывается :(


    38000000 результатов, нифига себе "по крупицам".

    Подскажите как это реализовать и\или где можно почитать о создании таких вот вещей?

    Тут уже читал?
    Ответ написан
  • Как заставить iconv работать?

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

    Я в вашем коде вижу две ошибки и несколько странных мест. Ошибки:
    - вы создаёте конвертор на каждый вызов parse_callback, но закрываете его только по событию EVENT_RUNE.
    - вы выделяете память (два calloc в parse_callback) и не освобождаете её. При том, что динамическая память вам вообще здесь не нужна.
    Странные места:
    - printf("result: '%s'\n", converted_start); в converted_start -- utf8...
    -
    fprintf(stdout, "debug: event = RUNE, data = %c\n", iso);
    iso -- это во-первых массив, а во-вторых, массив символов CP866.
    Как минимум один (а скорее всего оба) из этих printf не выведет того, что вы ожидали.

    parse_callback можно переписать следующим образом:
    void parse_callback( struct parser_event *pe, void *userdata )
    {
        switch ( pe->event ) {
    
            case EVENT_RUNE: {
                char *iso = &pe->rune;
                char out[10] = {0};
                char *converted = out;
                size_t ibl = 1;
                size_t obl = sizeof(out);
                iconv_t foo = iconv_open("CP866", "UTF-8");
                int ret;
    
                if((int) foo == -1) {
                    if (errno == EINVAL) {
                        fprintf(stderr,
                                "Conversion is not supported");
                    } else {
                        fprintf(stderr, "Initialization failure:\n");
                    }
                    break;
                }
                ret = iconv(foo, &iso, &ibl, &converted, &obl);
    
                // if iconv fails it returns -1
                if(ret == (iconv_t)-1) {
                    perror("iconv");
                } else {
                    // otherwise the number of converted bytes
                    printf("%i bytes converted\n", ret);
                    printf("result: '%s'\n", out);
                }
                iconv_close(foo);
                fprintf(stdout, "debug: event = RUNE, data = %c\n", pe->rune);
                break;
            }
    
            case EVENT_FONT:
                fprintf( stderr, "FUCK FONT\n");
                fprintf( stdout, "debug: event = FONT, data = %d\n", pe->font_id );
                break;
    
            case EVENT_ERROR:
                fprintf( stderr, "FUCK ERROR\n");
                fprintf( stdout, "debug: event = ERROR\n" );
                break;
    
            default:
                fprintf( stdout, "debug: event = UNKNOWN\n" );
        }
    }
    Ответ написан
  • Не могу найти ошибку в использовании 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))

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