Ответы пользователя по тегу C
  • Каким образом задать динамический массив символов (строку) если не известен изначальный размер вводимой строки?

    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))

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

    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 комментарий