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

    CityCat4
    @CityCat4
    Внимание! Изменился адрес почты!
    Можно, в принципе, передавать пять указателей, но это криво и громоздко. В таких случаях делают, как сказал tugo - структуру, передать указатель на структуру и в функции делать с ней, что надо
    Ответ написан
    Комментировать
  • В чем разница двух этих кодов?

    CityCat4
    @CityCat4
    Внимание! Изменился адрес почты!
    Потому что в первом коде четыре вызова client.println(), которых во втором нет. Насколько быстро выполняется один вызов? А во втором обычные символьные сравнения да присваивания.
    Ответ написан
    Комментировать
  • Как сделать безлимитный массив?

    CityCat4
    @CityCat4
    Внимание! Изменился адрес почты!
    Так "безлимитный" или "сколько хочет"? "Безлимитный" подразумевает "растущий по мере добавления элементов". Теоретически можно реализовать с постоянным realloc-ом, только зачем? "Сколько хочет" полразумевает, что юзер задал некое количество элементов массива, а потом получили память под его хранение и адресовали начало.

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

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

    CityCat4
    @CityCat4
    Внимание! Изменился адрес почты!
    Особо переходить никуда не надо, просто не использовать обьектную модель. stdio вместо iostream, printf и scanf вместо cout и cin - и т.д.
    Ответ написан
    Комментировать
  • Маленький диапазон char?

    CityCat4
    @CityCat4
    Внимание! Изменился адрес почты!
    числа от 1-9 - это минимум 2-3 символа (0 = \0)

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

    CityCat4
    @CityCat4
    Внимание! Изменился адрес почты!
    Подробно и без лишнего - взаимоисключающие условия :)
    Обычно компилируют так:
    gcc -o myprog myprog.c
    И получаем бинарник с именем myprog :)

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

    CityCat4
    @CityCat4
    Внимание! Изменился адрес почты!
    Код писать лениво, опишу так
    Числа хранятся (на обычных 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
    Внимание! Изменился адрес почты!
    Гуглить
    гуглить
    и гуглить
    свою задачу настоящим образом!
    Ответ написан
    Комментировать
  • Как записать такую математику языком си?

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

    CityCat4
    @CityCat4
    Внимание! Изменился адрес почты!
    Да довольно просто, если спросить гугл показать школьный учебник по тригонометрии.

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

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

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

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

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

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

    CityCat4
    @CityCat4
    Внимание! Изменился адрес почты!
    Это плохо. Указатели - основа С, без понимания того, как работают указатели, будет ооочень трудно.

    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
    Внимание! Изменился адрес почты!
    Именно данное сообщение не означает ничего. Кроме того, что при выполнении компиляции файла(ов) исходного текста для мишени libbitcoin_server_a-checkpoints.о возникла ошибка. Какая - а фиг его знает, ищите в логах :)
    Ответ написан
    Комментировать
  • Что изучать в первую очередь? С(СИ) или С++?

    CityCat4
    @CityCat4
    Внимание! Изменился адрес почты!
    Смотря чем хотите заниматься.

    Системщик, программист МК, встраиваемых систем, драйверописатель - пишет на С
    Прикладник, разработчик юзерских программ с UI, пищалками и свистелками - на C++
    Ответ написан
  • Язык Си (Керниган. Ритчи). Помощь с упражнением. Компилятор ругается?

    CityCat4
    @CityCat4
    Внимание! Изменился адрес почты!
    Вас в гугле забанили? Исправляйте ошибки - перестанет ругаться. Я ошибки вижу - они элементарные. Но подсказывать не буду. Читайте доки - они рулез :D
    Ответ написан
    6 комментариев
  • Почему в Си допускается переполнение массива?

    CityCat4
    @CityCat4
    Внимание! Изменился адрес почты!
    Потому что С - низкоуровневый язык. Как уже говорили, a[b] - всего лишь иная форма записи *(a+b), что позволяет делать мнооооожество финтов ушами :) man memmove например почитайте :) - это вообще адЪ :) Существует множество либ, содержащих например те же strcpy, strcat, strstr, но обвешанные различными проверками - кому надо, тот их использует.
    Ответ написан
    1 комментарий
  • Какова адресация элементов структуры в си?

    CityCat4
    @CityCat4
    Внимание! Изменился адрес почты!
    отключать оптимизацию при компиляции через -O0 (первый символ - буква O, второй - цифра "ноль"!). Это отключит механизмы оптимизации размещения обьектов в памяти и еще много чего, что не дает нормально отлаживаться.
    Можно явно задать выравнивание элемента на границу байта, слова, двойного слова - через #pragma pack. В данном случае нужно позаботиться, чтобы структура была выравнена на границу int - в зависимости от того, какой у данного контроллера int - в два байта, в четыре...
    Ответ написан
    Комментировать