Ответы пользователя по тегу C
  • Почему Segmentation fault?

    CityCat4
    @CityCat4 Куратор тега C
    //COPY01 EXEC PGM=IEBGENER
    Чего удивительного-то?
    Node* new_node;
    завели указатель на структуру Node. Который указывает в никуда, то есть по случайному адресу, который там будет записан. Нужно вот так:
    Node* new_node = (Node *) calloc((sizeof(Node),1);
    Это сразу и память выделит и проинициализирует ее нулями.
    Ответ написан
    Комментировать
  • Как прочитать конкретные байты из файла используя язык С?

    CityCat4
    @CityCat4 Куратор тега C
    //COPY01 EXEC PGM=IEBGENER
    man open
    man seek
    man read
    man close

    :D
    Ответ написан
    Комментировать
  • Быстродействие за счет ногопоточьности в процессорах с помощью pthread, Cи?

    CityCat4
    @CityCat4 Куратор тега C
    //COPY01 EXEC PGM=IEBGENER
    Ээээ... язык С, регистры, многопоточность, pthread... каша какая-то. В С конечно, можно работать с регистрами - и через register и через асмовые вставки. Но только та многопоточность, которая доступна в pthread, она к регистровой многопоточности никакого отношения не имеет. Оптимизацию на уровне регистров можно делать на асме, на микроконтроллере - но в программе на С вся она будет попереломана нафиг компилятором :)
    pthread и вообще совершенно другую задачу решает.
    Ответ написан
  • Какая есть среда разработки на С?

    CityCat4
    @CityCat4 Куратор тега C
    //COPY01 EXEC PGM=IEBGENER
    Netbeans, KDevelop (но последний только в линухе и только в KDE)
    Ответ написан
  • Как передать в функцию переменные и вернуть их?

    CityCat4
    @CityCat4 Куратор тега C
    //COPY01 EXEC PGM=IEBGENER
    Можно, в принципе, передавать пять указателей, но это криво и громоздко. В таких случаях делают, как сказал tugo - структуру, передать указатель на структуру и в функции делать с ней, что надо
    Ответ написан
    Комментировать
  • В чем разница двух этих кодов?

    CityCat4
    @CityCat4 Куратор тега C
    //COPY01 EXEC PGM=IEBGENER
    Потому что в первом коде четыре вызова client.println(), которых во втором нет. Насколько быстро выполняется один вызов? А во втором обычные символьные сравнения да присваивания.
    Ответ написан
    Комментировать
  • Как сделать безлимитный массив?

    CityCat4
    @CityCat4 Куратор тега C
    //COPY01 EXEC PGM=IEBGENER
    Так "безлимитный" или "сколько хочет"? "Безлимитный" подразумевает "растущий по мере добавления элементов". Теоретически можно реализовать с постоянным realloc-ом, только зачем? "Сколько хочет" полразумевает, что юзер задал некое количество элементов массива, а потом получили память под его хранение и адресовали начало.

    Массив в С - одно-, двух-, N- мерный - это всего лишь область памяти, указатели в которой передвигаются вручную по нужным принципам. Это не перл.
    Ответ написан
    Комментировать
  • В каких случаях пишут на C вместо C++?

    CityCat4
    @CityCat4 Куратор тега C
    //COPY01 EXEC PGM=IEBGENER
    С++ не мог и не должен был вытеснить С просто потому что у них разные задачи и разные области применения :) Вас же не удивляет почему городские полотерки не вытеснили автомобили-внедорожники?
    Ответ написан
    Комментировать
  • Как перейти с C++ на C?

    CityCat4
    @CityCat4 Куратор тега C
    //COPY01 EXEC PGM=IEBGENER
    Особо переходить никуда не надо, просто не использовать обьектную модель. stdio вместо iostream, printf и scanf вместо cout и cin - и т.д.
    Ответ написан
    Комментировать
  • Маленький диапазон char?

    CityCat4
    @CityCat4 Куратор тега C
    //COPY01 EXEC PGM=IEBGENER
    числа от 1-9 - это минимум 2-3 символа (0 = \0)

    Бред.
    Читайте про типы данных. У вас в голове такая каша из char и *char, что даже страшно представить.
    '0' - 0x30, '1' - 0x31 и т.д. до '9' - 0x39.
    И 0 != '0' ни в коем случае.
    char - один символ. Диапазона 0-255 ему вполне хватает. Вам нужен массив из 33-х символов (почему 33-х? Попробуйте сами ответить на этот вопрос. Пока не ответите, дальше двигаться бессмысленно)
    Ответ написан
    Комментировать
  • Как компилировать код на C?

    CityCat4
    @CityCat4 Куратор тега C
    //COPY01 EXEC PGM=IEBGENER
    Подробно и без лишнего - взаимоисключающие условия :)
    Обычно компилируют так:
    gcc -o myprog myprog.c
    И получаем бинарник с именем myprog :)

    Это в самом наипростейшем случае. В случае более посложнее используется Makefile, где много чего прописывается.
    Ответ написан
    Комментировать
  • Как считать два байта числа?

    CityCat4
    @CityCat4 Куратор тега C
    //COPY01 EXEC PGM=IEBGENER
    Код писать лениво, опишу так
    Числа хранятся (на обычных x86) "задом наперед". То есть если число - int (32-битное) - оно займет 4 байта, причем самый старший байт будет "в хвосте". Для примера - есть буфер, содержащий 01 02 03 04, hex разумеется (Ваш пример неудачен). Если в буфере int - то какое это число? Правильно 0x04030201.
    Поэтому ничего никуда разворачивать не надо, магия С - в адресной арифметике!
    tydedef struct {
    short int a;
    int b;
    } wrk_buf;
    
    wrk_buf my_buf;
    read(desc, (void *) &my_buf, 1000);

    После чего можно будет просто обращаться к полям структуры - как к обычным переменным. Понятно, что файл нужно сначала открыть, получить его размер - 1000 - условное число.
    Ответ написан
    Комментировать
  • Грамматика для языка Си?

    CityCat4
    @CityCat4 Куратор тега C
    //COPY01 EXEC PGM=IEBGENER
    Гуглить
    гуглить
    и гуглить
    свою задачу настоящим образом!
    Ответ написан
    Комментировать
  • Как записать такую математику языком си?

    CityCat4
    @CityCat4 Куратор тега C
    //COPY01 EXEC PGM=IEBGENER
    Сложности могут быть только с первым выражением - я сейчас не помню, есть ли в стандартных функциях ln(), или же придется какую-то библиотеку искать. Про котангенс - в предыдущем вопросе, пишется простяцкая функция (а можно и без), последний вообще решается на стандартных функциях
    Ответ написан
  • Как в си найти котангенс?

    CityCat4
    @CityCat4 Куратор тега C
    //COPY01 EXEC PGM=IEBGENER
    Да довольно просто, если спросить гугл показать школьный учебник по тригонометрии.

    ctg N = cos N/sin N
    ctg N = 1 / tg N (потому что ctg N * tg N = 1)

    cos(), sin(), tg() - стандартные математические функции
    Ответ написан
    Комментировать
  • Сколько памяти занимает int в C?

    CityCat4
    @CityCat4 Куратор тега C
    //COPY01 EXEC PGM=IEBGENER
    Влияют обычно несколько факторов.
    - архитектура. x32, x64, другие процы - в них int может быть разного размера
    - выравнивание в памяти. Можно задать прагму, которая будет принудительно выравнивать все на некую границу. Это используется редко, но помнится как-то мне было надо, чтобы области были гарантированно выровнены на 4 байта.

    Для наиболее частого случая - int - 4 байта, short int - 2 байта, char - 1 байт
    Ответ написан
    Комментировать
  • Какие различия программирования под UNIX и Linux?

    CityCat4
    @CityCat4 Куратор тега C
    //COPY01 EXEC PGM=IEBGENER
    Сначала нужно определиться, что есть для Вас "системное программирование".
    Написание собственных демонов, использование очередей, нитей, общих областей памяти, сокетов, каналов? Сможете, хотя не факт, что примеры приведенные в книге, заработают в некоей конкретной версии линуха - маны читать все равно придется, они явно будут новее книги.
    Написание драйверов, системных вызовов, модулей ядра? Нет, нужно будет читать маны именно по kernel-hacking
    Ответ написан
    Комментировать
  • Как задать размер массива через аргументы функции?

    CityCat4
    @CityCat4 Куратор тега C
    //COPY01 EXEC PGM=IEBGENER
    В памяти массив все равно одномерный будет, хоть тресни ;) N-мерность нужна для удобства доступа.
    Ответ написан
    Комментировать
  • В чем различие void func(char * var) от void func(char **var)?

    CityCat4
    @CityCat4 Куратор тега C
    //COPY01 EXEC PGM=IEBGENER
    Это плохо. Указатели - основа С, без понимания того, как работают указатели, будет ооочень трудно.

    char *var - указатель на переменную типа char. Сама var содержит адрес, шестнадцатеричное число, размер его зависит от реализации, от ОС, от платформы etc. Этот адрес указывает на область памяти длиной 1 байт (потому что char *), соответственно в эту область можно поместить 1 байт. Если поместить туда скажем переменную типа short int (два байта), то можно получить опять же в зависимости от того, как получали под нее память либо затирание соседней переменной (что не всегда плохо и очень часто используется для обнуления областей), либо SIGSEGV, то есть нарушение защиты памяти, запись в область памяти не выделенную программе.
    char ** var - указатель на указатель на переменную типа char. Сама var, как и раньше содержит адрес, но теперь этот адрес указывает на область памяти размером с указатель (он фиксированный в пределах реализации) и по этому адресу записан адрес области, в которую можно поместить 1 байт (со всеми вытекающими последствиями).
    Зачем такие извращения? Ну, например для упрощения вызова функции - передавать один параметр или же 4-5. Обработка списков, деревьев и всего, что строится на их основе. Данная конструкция очень распространена, рекомендую проработать пару демок в отладчике - с дотошным разбором, где что находится, как откуда и куда извлекается...
    Ответ написан
    3 комментария
  • Почему ошибка "recipe for target 'XXX.o' failed" при компиляции?

    CityCat4
    @CityCat4 Куратор тега C
    //COPY01 EXEC PGM=IEBGENER
    Именно данное сообщение не означает ничего. Кроме того, что при выполнении компиляции файла(ов) исходного текста для мишени libbitcoin_server_a-checkpoints.о возникла ошибка. Какая - а фиг его знает, ищите в логах :)
    Ответ написан
    Комментировать