Ответы пользователя по тегу C
  • Как настроить локаль в Си?

    @res2001
    Developer, ex-admin
    В винде конировка консоли по умолчанию - 866. Сделайте исходники в этой же кодировке и локаль такую же.
    Но вообще это ущербный вариант. Т.к. кодировку консоли можно менять из вне, то смысла привязываться к ней нет.
    Делал как-то небольшой консольный проект на чистом WinAPI, делал исходники в UTF-8, затем определяю какая установлена текущая кодировка консоли и перекодирую в нужную кодировку. Таким образом получается код не зависимый от текущей установленной кодировки. В WinAPI все нужные функции есть.
    В никсах, в принципе, все то же самое.
    Ответ написан
  • Плохо ли смотреть готовый код задач по СИ, чтобы понять как это работает?

    @res2001
    Developer, ex-admin
    Просто надо начинать думать "как программист". Математики тут нет и алгоритм простейший. Алгоритм понятен сразу, как только вы смотрите на рисунок:
    для введенного числа 8
    1.первая строка - рисуем 2 решетки
    2.следующая строка рисуем решеток на 1 больше, чем на предыдущем шаге
    3.8 строка - после рисования решеток заканчиваем цикл.
    Решетки рисуются в цикле по одной. В конце каждой строки, после решеток, "дорисовываем" перевод строки.
    Как реализовать можете подсмотреть на первый раз, но дальше пытайтесь делать самостоятельно. Если совсем уж затык, то же можно взглянуть бегло на решение, чтоб понять принцип. А потом постараться самому реализовать.
    Нужно стараться делать задания самостоятельно - только то что осилил сам запомниться на долго.
    Ответ написан
    Комментировать
  • Язык Си (Керниган. Ритчи). Помощь с упражнением. Компилятор ругается?

    @res2001
    Developer, ex-admin
    ideone.com/QfgoV8

    Я исправил ваш код. Только он делает не совсем то что нужно, имхо. Как мне кажется, нужно считать количество вхождений каждого символа, а не вообще символов, а потом строить гистограмму. Так что доведите программу до нужной кондиции.
    Ответ написан
  • Зачем goto в исходниках Python?

    @res2001
    Developer, ex-admin
    Вызывается обработчик ошибок.

    В исходниках питона такое сплошь и рядом, они используют подобных подход для обработки ошибок (и еще в некоторых других вариантах) - в Си нет исключений.
    Просто вам попалась короткая функция, поэтому это режет глаз.
    В достаточно развесистой функции это кажется нормальным. Хотя можно было бы применить структурный подход, вместо goto.
    Ответ написан
    3 комментария
  • Что вы думаете насчет книги Брайана Кернигана "Язык программирования С"?

    @res2001
    Developer, ex-admin
    Книга Дейтелов то же очень не плоха. Но там и С++ то же есть. В K&R С++ нет.
    Ответ написан
    Комментировать
  • Как выводить кириллицу в программе на Си?

    @res2001
    Developer, ex-admin
    Когда пишите консольную программу для винды нужно учитывать:
    1.В какой кодировке в самом тексте программы ваши русские строки.
    2.Кодировка консоли может меняться. По умолчанию в виндовой консоли 866 кодировка, можно переключить на 1251.
    3.Консольное API и stdlib языка Си ничего автоматически не перекодирует.
    4.Компилятор ничего не перекодирует, ему вообще пофигу что у вас там в кавычках.
    5.Если выводите без перекодировки, то нормальный результат можно получить только если кодировка консоли совпадает с кодировкой ваших русских символов в исходнике.

    Что бы не зависеть от кодировки консоли можно:
    1.не выводить русские буквы
    2.Заморочится с перекодированием в кодировку консоли перед выводом. Это довольно легко, всего то пол суток чтения MSDN и тестов.
    Ответ написан
    Комментировать
  • Как построить АЧХ на языке "C" в eclipse для микроконтроллера?

    @res2001
    Developer, ex-admin
    Вообще свободные реализации БПФ есть, на вскидку: fftw и fftpack.
    fftpack - на фортране.

    В свое время пользовался вот такой реализацией. Это стандартное комплексное БПФ. Собирается без проблем (math.h, конечно должен у вас работать или сами реализовывайте sin и cos). Правда там используются 2 разных массива для действительной и мнимой части, тогда как сейчас используют структуру для представления комплексных чисел. Но это, я думаю, легко поправить.
    И на счет ваших проблем с math.h не очень ясно. Думаю в любом случае нужно с ними разобраться.
    Ответ написан
    Комментировать
  • Что лучше для новичка в программировании C или C++?

    @res2001
    Developer, ex-admin
    Учите плюсы, а Си подтянется, т.к. синтаксис один и тот же только без классов и шаблонов (и других штучек из последних стандартов). А нюансы можно оставить на потом.
    Си нужен, т.к. на нем огромное количество кода написано. Так или иначе, а системщику придется читать чужой код. То же ядро линукс, например, и т.п.
    Ответ написан
    Комментировать
  • Где и как хранится имя переменной?

    @res2001
    Developer, ex-admin
    Имя переменной нигде не хранится.
    Если по простому то: компилятор преобразовывает имя переменной в адрес и далее везде где было имя в коде появляется адрес.
    Если по сложнее, то для стековых переменных (локальные переменные функции) - это будет даже не адрес, а смещение относительно начала стека функции. А начало стека функции записано в один из регистров процессора. Адрес локальной переменной получается сложением регистра и смещения.
    Для глобальных переменных - адрес. Но и тут несколько сложнее, т.к. реальный адрес появляется только после того как ОС загрузит программу в память и тут работают в паре загрузчик ОС и компилятор.
    Ответ написан
    Комментировать
  • Как построить графики импульсной модуляции имея массив отсчетов?

    @res2001
    Developer, ex-admin
    1.Для Си можно MathGL попробовать или в том же Qt руками нарисовать (или найти подходящую библиотеку для Qt). Если у вас приложение на С/С++ с графическим интерфейсом, то подобный график и самому воспроизвести не трудно.
    2.Написать модуль для матлаб, на сколько помню там это не сильно сложно делается, правда массивы данных не передавал.
    3.Я для этих целей сделал обертку над библиотекой, реализующую модуль для Python и графики рисую теперь в питоне. В питоне можно сразу весь массив передавать, без конвертации, и средствами NumPy и Matplotlib отображать в графике.
    Ответ написан
    Комментировать
  • Как искать повторяющиеся слова в строке?

    @res2001
    Developer, ex-admin
    Как-то так по моему. Не проверял.
    void counter_of_all_word(int count, int max, char**mass_of_all_word,int *mass)
    {
      char **empty_mass = (char**)calloc(count, sizeof(char*));
      int *count_mass = (int*)calloc(count, sizeof(int));
      int i, j, k;
      for (i = 0; i < count; i++)
      {
         for(j=i;j<count;++j)
         {
            // Ищем в mass_of_all_word строку не существующую в empty_mass
            for(k=0;k<i;++k)
               if(strcmp(empty_mass[k], mass_of_all_word[j])
                   break;
            // Строка найдена - mass_of_all_word[j]
            if(k == i)
            {
                   empty_mass[i] = mass_of_all_word[j];
                   count_mass[i] = 1;
                   break;
            }
          }
          // Не существующие строки кончились 
          if(j == count)
             break;
    
          // Теперь считаем количество новых строк
         ++j;
         if(j < count)
             for (; j < count; j++)
               if(strcmp(empty_mass[i], mass_of_all_word[j])
                   ++count_mass[i];
      }            
    /*
    На выходе из цикла в empty_mass уникальные слова. Количество уникальных строк в i. В count_mass количество каждого уникального слова в mass_of_all_word.
    Осталось придумать как всю эту красоту вернуть вызывающей функции.
    
    Здесь я не копирую строки, а просто присваиваю указатель строки из mass_of_all_word в empty_mass. Если нужно копировать строки в empty_mass, то нужно выделить память под строку, затем функцией strcpy или memcpy скопировать строку.
    */
    }

    Сначала пытался разобрать ваши ошибки, но потом плюнул - проще написать код.
    И разберитесь с указателями и строками в Си, вы явно не понимаете как с ними работать.
    На счет возврата значений - послушайтесь совета Павел Каптур определите структуру с двумя полями - указатель на строку и счетчик количества и работайте с массивом структур. Тогда просто будете возвращать этот массив структур. При этом память под массив структур можно выделять по максимальному количеству (count) либо отдельно под каждую найденную строку (тогда нужно выделять память под массив указателей на структуры размером в count и отдельно под каждую структуру), либо делать связный список :-) В общем задачка вроде простая, но из нее легко сделать довольно сложную.
    И не забудьте потом всю эту память освободить.
    Ответ написан
    4 комментария
  • Почему в строке 35 структура объявлена таким образом?

    @res2001
    Developer, ex-admin
    Если вы про это строку:
    struct rusage before, after;
    То это не объявление структуры, а создание двух переменных типа struct rusage, а сама структура объявлена в одном из подключаемых заголовочных файлах.
    Ответ написан
    Комментировать
  • Как исправить функцию с переменным числом аргументов?

    @res2001
    Developer, ex-admin
    По моему с самими аргументами у вас все нормально.
    У меня есть похожий код (не мой), успешно работает.
    По моему при выделении памяти ошибка, а именно вот этот момент: sizeof(msg)) * sizeof(arguments)
    Думаю вместо этого нужно: strlen(msg)*sizeof(char)
    Ответ написан
  • Как реализовать транслитерацию на C++?

    @res2001
    Developer, ex-admin
    Обычно для перекодировки используют массив, код символа исходной строки является индексом массива.
    Как-то так. В случае UTF8 сложнее, т.к. для русских символов используется 2 байта, но то же решается примерно тем же способом. Ну это отступление про алгоритм.
    На счет кракозябр - не понятно что значит "открываю программу".

    Открываете исходник в студии? Значит у вас студии настроены на разные кодировки исходников на разных компах. Рекомендую везде настроить на UTF8 и в настройках проекта включите поддержку UTF8.
    Ответ написан
  • Как сделать разные цели в одном makefile?

    @res2001
    Developer, ex-admin
    Ну и сделайте так:
    ud-button:
    PROJECT_SOURCEFILES += ud-dag_node.c 
    DEFINES+=PROJECT_CONF_H=\"ud-button.project-conf.h\"
    CONTIKI = ../..
    CONTIKI_WITH_IPV6 = 1
    include $(CONTIKI)/Makefile.include
    
    ud-rpl_root:
    PROJECT_SOURCEFILES += 
    DEFINES+=PROJECT_CONF_H=\"ud-rpl_root.project-conf.h\"
    CONTIKI = ../..
    CONTIKI_WITH_IPV6 = 1
    include $(CONTIKI)/Makefile.include

    make запускать соответственно:
    make ud-rpl_root
    или
    make ud-button

    А для цели all можно написать так:
    all: ud-button ud-rpl_root
    Ответ написан
  • Как быстро разобратся в сишном коде?

    @res2001
    Developer, ex-admin
    Начните разбираться в коде, уже через неделю другую плотной работы станете довольно бегло понимать что пытался сказать разработчик своим кодом.
    Си сам по себе очень простой язык, самая сложная вещь в нем - указатели, стоит что-нибудь почитать на эту тему, все остальное не сильно отличается от других языков.
    Соберите софт с отладочной информацией и погоняйте под отладчиком, обычно отладчик выдает сообщения про утечки памяти при завершении программы, это может дать толчок для поиска мест где возможны утечки.
    Так же можно воспользоваться каким-либо анализатором кода. Но там, скорее всего, будет много второстепенных ошибок и из всего их обилия придется долго и нудно выделять те что действительно важны на данном этапе.
    Ответ написан
    Комментировать
  • Чем отличается char* от int*, float* и других в Си?

    @res2001
    Developer, ex-admin
    Размер указателя один и тот же, если вы это имеете ввиду.
    char* отличается от int* тем, что первый указывает на область памяти в sizeof(char) байт, а второй в sizeof(int) байт. Это важно, например для адресной арифметики.
    Например имеем:
    int ival[] = {0,1,2,3};
    char* pc = "This is a string";
    int* pi = &ival;

    Если мы делаем pc++, то к pc прибавляется sizeof(char), а в случае pi++ к pi прибавляется sizeof(int).
    А так же, когда мы делаем разъименование, то получаем в результате соответствующий тип:
    *pc - дает char
    *pi - дает int
    Если бы не было типизации указателей, то не было бы и адресной арифметики и разъименования. Посмотрите, например, что можно сделать с указателем на void.
    Ответ написан
    5 комментариев
  • Что означает эта строка? Ее предназначение?

    @res2001
    Developer, ex-admin
    Операция с присваиванием 0 именно в такой форме тут совершенно лишняя, т.к. fgets на предыдущем шаге и так уже записала 0 в конце строки. Если бы этого не было, то strlen не смогла бы вычислить корректную длину строки.
    Я бы еще понял что-то подобное: search_for[79]=0; - подстраховка от переполнения буфера, хотя и это излишне, если понадеяться на корректную работу fgets. Но ведь, скорее всего, мы не будем проверять каждую реализацию fgets, поэтому такой оператор кажется более логичным, чем тот что приведен в примере.
    Ответ написан
  • Почему перезаписываются данные в структуре?

    @res2001
    Developer, ex-admin
    Отладчик должен помочь в вашей беде.
    Ответ написан
    Комментировать
  • Как вызывать MultiByteToWideChar?

    @res2001
    Developer, ex-admin
    Юникодные константы объявляйте так:
    wchar_t* c=L"фывапр";
    И выводить на консоль с помощью wprintf, как писал Владимир Мартьянов
    Ответ написан
    Комментировать