Ответы пользователя по тегу C
  • Чем принимать REST API HTTPS запросы?

    @res2001
    Developer, ex-admin
    Т.е. вам нужен HTTP сервер на Си.
    libonion - только Линукс, SSL есть.
    haywire - кросс-платформенно, по моему он не умеет SSL.
    Ответ написан
    Комментировать
  • Почему в VS программа на СИ работает неправильно, хотя в онлайн компиляторе все в порядке?

    @res2001
    Developer, ex-admin
    У вас куча операций с файлами, любая может вернуть ошибку. У вас в коде нет ни одной проверки ошибок.
    Были бы проверки ошибок, возможно это вам бы помогло.
    В reverseOrder() - используется рекурсия, по тексту заданий я вообще не понял, где там можно было бы применить рекурсию. Возможно ошибка где-то тут.
    В 1.3 вы странно вычисляете count - strlen() возвращает количество символов уже без учета нулевого символа. Зачем вы еще вычитаете 1?

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

    @res2001
    Developer, ex-admin
    Немного усложните программу, например написав парочку функций, которые определяют еще несколько переменных и что-нибудь в них пишут. В main() вызовите эти функции, а затем объявите test и выведите его значение. Вот тогда у вас гарантированно образуется мусор. При компиляции, нужно еще предотвратить оптимизацию компилятором (опция -O0), а то он может выкинуть вызовы функций, если посчитает, что они не влияют на дальнейшее выполнение программы.

    Что бы понять происходящее, почитайте как работает стек.
    Автоматические переменные определяются на стеке. Одно и то же место на стеке в разное время выполнения программы могут занимать разные переменные. Если вы не инициализируете автоматическую переменную, то она принимет то значение, которое уже лежит в области памяти, которую она занимает. Из-за того, что переменные имеют разный размер, то часто, например текущая 4 байтовая переменная (int) может занимать память, в которой до этого были 2 двух байтовые переменные, или любые другие вариации.
    Стек выделяется при загрузке программы (или при старте потока). В ходе выполнения программы стек не освобождается и не перевыделяется, поэтому мусор (данные от старых автоматических переменных) в нем образуется постоянно. При выходе автоматической переменной из области видимости фактического освобождения памяти не происходит - просто изменяется указатель на стек (регистр sp), т.е. при этом не происходит даже обращения к памяти. Поэтому все ранее сохраненные в стеке значения в памяти остаются. И когда вы определяете новую переменную без инициализации, она занимает ранее освобожденное место и принимает какое-то значение (мусор), которое ранее было сохранено в эту область памяти.
    Ответ написан
    Комментировать
  • Как сделать модуляцию звука?

    @res2001
    Developer, ex-admin
    Т.е. вы хотите низкочастотный звук перенести в высокие частоты?
    Перенести можно, но вряд ли из этого выйдет что-то удобоваримое
    В теории это так.
    Можно попробовать что-нибудь типа такого:
    1.Делаем ДПФ
    2.Добавляем между первым и вторым отсчетами результата ДПФ столько нулей, сколько необходимо для достижения новой частоты дискретизации. Не забываем про вторую половину спектра.
    3.Делаем обратный ДПФ
    Не знаю, что получится :-) это немного измененный алгоритм интерполяции через ДПФ. Там нулевые отсчеты добавляются в конец (поэтому сдвига спектра не происходит).
    Делать надо, видимо, небольшими временными отрезками (0.5 - 1 секунда), затем результат складывать. Возможно надо будет брать сигнал с перекрытием. Но не факт, у меня не было опыта работы с речевыми сигналами.
    Чтоб реализовать даже мой простой алгоритм надо немного понимать как все это работает.
    Ответ написан
  • Установка cURL на CodeBlocks на MinGW на Windows?

    @res2001
    Developer, ex-admin
    Установите msys2 - это оболочка для mingw со своим менеджером пакетов.
    Любой имеющийся в репах пакет устанавливается так же как в линуксе - одной командой.
    В msys2 можно установить одновременно и 32 битный и 64 битный mingw, а так же clang.
    mingw установленный в msys2 легко прикручивается к любой IDE.
    Ответ написан
    1 комментарий
  • Можно ли связать код Си(c++) и Python?

    @res2001
    Developer, ex-admin
    У Бизли есть неплохое введение в написание модулей на Си. Можете начать с него, а за деталями в родную документацию.
    Раз вы собрались рисовать графики, то, видимо нужно передавать в питон большие массивы данных.
    Для этого можно реализовать в модуле buffer protocol. numpy умеет работать с такими массивами.
    Так же можно создавать в модуле сразу массивы numpy, для этого надо использовать Numpy C API.
    Ответ написан
    Комментировать
  • Как работать с комплексными числами в си?

    @res2001
    Developer, ex-admin
    В VS куцая реализация комплексных чисел.
    Там нет реализации типа complex и нет полноценного понятия "i".

    Из-за этого вы не можете объявлять и инициализировать комплексные числа так как в вашем примере (и в стандарте).
    Для инициализации комплексных чисел можно использовать макросы: _FCbuild(re, im)/_CBuild(re,im)
    приставка F - для float, С - для double.
    Само по себе комплексное число объявлено так: double _Val[2];
    И другие варианты для float и long double.

    Нет реализации встроенных операций (+-*/), т.е. нельзя написать z1 + z2 - будет ошибка компиляции.
    Для умножения реализована функция, остальные операции реализуйте самостоятельно.
    Но в библиотеке есть набор математических функций для комплексного аргумента, что уже хорошо.

    Фактически, вы можете не использовать предлагаемый микрософтом тип _C_float_complex (или аналоги), а использовать более понятную собственную реализацию, например такую как предложил Павел Математические библиотечные функции буду с ней работать нормально (при определенных условиях), только нужно будет постоянно приводить типы.

    В общем открывайте complex.h из состава VS и изучайте, он достаточно простой.

    PS: В gcc полная реализация в соответствии со стандартом.
    Ответ написан
    Комментировать
  • Как ограничить смещение битов?

    @res2001
    Developer, ex-admin
    Вам нужен циклический сдвиг?
    Придется реализовывать самому - просто проверьте перед сдвигом последний бит, если он равен 1, то после сдвига прибавьте 1 к числу.
    if(m_d[i] & 0x80) {
      m_d[i] = (m_d[i]<<1);
      ++m_d[i];
    } else {
      m_d[i] = (m_d[i]<<1);
    }
    Ответ написан
    Комментировать
  • Оцените код. Как можно заменить goto?

    @res2001
    Developer, ex-admin
    Почитайте что-нибудь о структурном программировании.
    Что бы лучше понять методы структурного программирования, просто запретите себе использовать goto. Вы быстро с ним освоитесь, когда будете пытаться придумать способ обойтись без goto.
    Ответ написан
    Комментировать
  • Функция автоматические подгоняющая длину строки на C?

    @res2001
    Developer, ex-admin
    Причем здесь Си?
    1.у вас скриптовый Си подобный язык - это совсем не то что Си
    2.Си окон не рисует и ими не управляет
    3.Как вы себе представляете подгон длины строки (сокращать слова, заменять на более короткие синонимы, добавь свой вариант)? Си тем более этим не занимается. Это уже лексический анализатор какой-то. Оно вам надо?

    Может вы просто определитесь с примерным количеством символов в строке (которое влазит в удобный вам размер окна) и будете формировать строки нужной длины сами?
    Ответ написан
    Комментировать
  • Как сделать функцию преобразующую степень и коэффициенты многочлена в готовое уравнение?

    @res2001
    Developer, ex-admin
    Вам же элементарно нужно строку сформировать.
    В цикле по массиву koef бежим:
    1.если коэффициент не 0:
    1.1.выводим сам коэффициент из массива
    1.2.Если коэффициент не последний: выводим строку "x^" + str(degree - i)
    Ответ написан
    Комментировать
  • И снова clang: Почему (при оптимизации) реализация на указателях получилась хуже чем с использованием оператора [ ]?

    @res2001
    Developer, ex-admin
    В первом случае первая итерация цикла выполняется вне цикла (отсюда и больше размер). Во втором варианте все итерации выполняются в цикле.
    Код внутри цикла один и тот же. Скорость исполнения будет одинакова.
    Разница только в том, что первый вариант на несколько байт больше размером.
    Кстати, gcc показывает идентичный код в обоих случаях.

    Предлагаю еще такой вариант:
    int str_cmp1(const char *s, const char *t)
    {
     while (*s == *t++ && *s != '\0')  ++s;
        return *s - *t;
    }
    Ответ написан
    9 комментариев
  • Как получить результат функции в main при работе с матрицами?

    @res2001
    Developer, ex-admin
    Обратите внимание на то как объявлена функция:
    int sum (int n, int matrix[n][n])
    И на то как вы ее вызываете:
    sum_of = sum(matrix[][]);
    Надеюсь дальше разберетесь сами.
    Ответ написан
    Комментировать
  • Что делать если не работает библиотека?

    @res2001
    Developer, ex-admin
    Добавьте в свойства проекта путь к заголовочным файлам этой библиотеки: Configuration properties->C/C++->General->Additional Include Directories
    Ответ написан
    Комментировать
  • Как задать значение данным в структуре на Си?

    @res2001
    Developer, ex-admin
    Что такого страшного вы нашли в структурах по сравнению с обычными массивами не в структурах?
    c.doctor[0] = 3.14;
    c.doctor[15] = 6.28;
    c.bank[5] = 0;
    strcpy(& c.name[0], "Yes");
    Ответ написан
    Комментировать
  • Как создать и использовать динамический массив?

    @res2001
    Developer, ex-admin
    Пусть N - количество элементов в массиве:
    #include "stdlib.h"
    
    ...
    
    int * arr = (int*)malloc(sizeof(int) * N);
    ...
    for(int i = 0; i < N; ++i)
       printf("%d ", arr[i]);
    printf("\n");
    free(arr);

    Тут опущена для краткости проверка ошибок выделения памяти/
    Ответ написан
  • C. Откуда мусор в конце строки (char)?

    @res2001
    Developer, ex-admin
    1. Вы полностью игнорируете размер прочитанных данных, которые возвращает recv.
    recv - не обязуется прочитать то количество данных, которое вы ей передаете как размер буфера. Она возвращает реально прочитанное количество данных.

    2. При получении информации по сети не гарантируется, что отправляемые данные придут все за один раз (и так же прочитаются recv), они могут фрагментироваться, задерживаться, сцепляться со следующими пакетами и т.п.
    Разбор полученных данных ложится на принимающую сторону.

    3. В данных, возвращаемых recv, обычно нет нулевого символа в конце строк. Т.е., если вы ждете строку, то для дальнейшей работы с полученными данными как со строкой вы должны сами обозначить конец строки - принудительно проставить нулевой символ. Для этого в приемном буфере у вас должно быть предусмотрено место для нулевого символа при любом размере полученных данных.
    Без этого большинство функций, работающих со строками будут давать не правильный результат.

    4. Если вы ждете строго определенный размер данных, то вы должны в коде предусмотреть чтение сокета до тех пор, пока не вычитаете нужное количество данных. При этом вызовов recv может быть несколько (см.п.1, 2).

    5. Если вы ждете в прочитанных данных какого-то завершающего символа (конца строки как в FTP), то вы должны самостоятельно проверять наличие этого символа(ов) - recv за вас это не сделает. Если в текущих полученных данных от recv нет конца строки - это не значит, что произошла ошибка. Это значит, что прочитаны не все данные и нужно еще их дочитывать.
    Ответ написан
    Комментировать
  • Как работает rand()?

    @res2001
    Developer, ex-admin
    Как написано в мануале так и работает.
    Что конкретно вас интересует?
    Ответ написан
  • Как не переноситься на следующую строку после scanf?

    @res2001
    Developer, ex-admin
    Если не зарываться сильно в "API той или иной ОС", то можно считывать посимвольно, не scanfом, а getcharом, но тогда придется вручную осуществлять весь контроль ввода, конвертировать числа и т.д. и т.п.
    Но это можно сделать в рамках стандартной библиотеки.
    Ответ написан
    Комментировать