Ответы пользователя по тегу C
  • Как сделать модуляцию звука?

    @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ом, но тогда придется вручную осуществлять весь контроль ввода, конвертировать числа и т.д. и т.п.
    Но это можно сделать в рамках стандартной библиотеки.
    Ответ написан
    Комментировать
  • C, Gtk+, Glade - какую бесплатную распределённую БД посоветуете с этим чудом?

    @res2001
    Developer, ex-admin
    Любую.
    Интерфей с Си есть у всех БД, а остальное из вашего списка никак на выбор не влияет.
    Ответ написан
    Комментировать
  • Как увеличить 2 элемент массива в си?

    @res2001
    Developer, ex-admin
    ++kdm[1];
    или
    kdm[1] = 29;
    Ответ написан
    Комментировать
  • Как работать с делением и типами в Си?

    @res2001
    Developer, ex-admin
    Заранее не известно же каким будет результат, целым или вещественным.

    Если есть шансы, что результат вычислений может быть не целым (и вам реально нужен вещественный результат в этом случае, т.е. с остатком), то нужно использовать вещественные операции для вычисления выражения, а не целые.
    Часто бывает необходимо отбрасывать остаток, тогда намеренно используют целочисленную арифметику.

    В отличии от языков с динамической типизацией, в С/С++ программист сам должен контролировать тип результата выражения и там где нужно делать преобразования типов явно для получения результата нужного типа.
    И это не недостаток языка.
    Ответ написан
    Комментировать