Задать вопрос
Ответы пользователя по тегу C
  • Почему нельзя использовать указатель без объявления переменной?

    15432
    @15432
    Системный программист ^_^
    Так создавайте указатель сразу с местом, куда записывать, компилятор такое умеет - массив называется.
    int pvar[1];
    Почти тот же самый указатель, только теперь на стеке было дополнительно выделено место, и он в него указывает. Только изменять место, куда указывает, нельзя.
    Ответ написан
  • Сервер на Си, как и зачем?

    15432
    @15432
    Системный программист ^_^
    На Си легко "выстрелить себе в ногу" и упустить утечки памяти, переполнение буфера, гонки данных в параллельных потоках. Убедился в этом при создании похожего проекта.

    Почитать - если стремитесь к максимальному быстродействию, разберитесь как работать с epoll и неблокирующими сокетами. Для работы по HTTP почитайте спецификацию и какие поля могут быть, как их парсить и обрабатывать, и т.д. Для парсинга пригодятся state-машины (это уже "основы конструирования компиляторов", по теме есть много вузовских учебников). Работа с сокетами напрямую подразумевает некий кастомный протокол - нужно придумать соглашения по формату передаваемых данных (заголовок, пакеты, и т.д.)
    Ответ написан
    Комментировать
  • Обработка разнобитных bmp картинок, в чем конкретная разница?

    15432
    @15432
    Системный программист ^_^
    В случае 24 бит, на каждый пиксель приходится по 3 байта - значения для красного, зелёного и синего цветов.
    Для 16 бит на пиксель приходится уже 2 байта, придётся "выдёргивать" цвета уже побитно (на красный и синий отводится 5 бит данных, на зелёный 6 бит)
    8 бит - один байт на пиксель, либо оттенки серого, либо в заголовке будет таблица соответствий цветов, в которой каждому значению байта соответствует 24-битное значение цвета. Всё это придётся расшифровывать.
    2 и 4 бита аналогично 8 бит, только ещё меньше цветов.
    Помимо всего этого, может присутствовать RLE сжатие, которое придётся распаковывать и запаковывать. Сжатие примитивное, но всё же экономит место.

    P.S. Если вы используете BMP библиотеку, которая любой формат вам превращает в набор значений RGB, заморачиваться и не нужно, либа сделает всё за вас.
    Ответ написан
    3 комментария
  • Как происходит чтение с файловой системы?

    15432
    @15432
    Системный программист ^_^
    В Windows драйвера находятся в ядре. Новый поток не создается, драйвер лишь обрабатывает поступающие запросы на чтение и перебрасывает их другим драйверам, например, usb mass storage или ahci. Которые, в свою очередь, взаимодействуют с хост-контроллерами USB или ATA.
    Сам вызов ReadFile блокирует выполнение программы до завершения операции (но можно и асинхронно)
    Ответ написан
    4 комментария
  • Что означает char **s на языке Си?

    15432
    @15432
    Системный программист ^_^
    char * buffer = NULL;
    char ** bufptr = &buffer;
    some_alloc_function(bufptr);
    If (buffer != NULL)
    printf("alloc success\n");
    Ответ написан
    3 комментария
  • Как разжать JPEG, подредактировать и сжать обратно на той же DQT (таблице квантования), которая была в оригинале?

    15432
    @15432
    Системный программист ^_^
    эта программа пережимает только измененные блоки.
    вряд ли оставляет полностью прежнюю таблцицу, но мало ли..
    www.betterjpeg.com
    Ответ написан
    Комментировать
  • Почему программа выдает не тот результат, который нужен?

    15432
    @15432
    Системный программист ^_^
    Переполнение происходит, scanf читает всю строку до символа перевода строки, но буфер всего 4 байта, и происходит перезапись данных, что за буфером. Видимо дальше хранится имя файла, которое и выводится. Необходимо использовать безопасный scanf (в винде это scanf_s, в линуксе не знаю).
    Ответ написан
  • Получить метод запаковки/распаковки файла?

    15432
    @15432
    Системный программист ^_^
    Приложите пример файла, может узнаю алгоритм.
    Если нет самого запаковщика - смотреть содержимое. В заголовке может содержаться подсказка. А так, определить произвольный алгоритм запаковки очень затруднительно.
    Ответ написан
    9 комментариев
  • Как пользоваться stdint.h?

    15432
    @15432
    Системный программист ^_^
    Для крипты, если хочется ручками потрогать - либа BigDigits, всё необходимое есть (проверка на простоту, возведение в степень, работа с очень большими числами, и т.д.)
    www.di-mgt.com.au/bigdigits.html

    по вашему вопросу - у вас число неправильное
    184467440737095511615
    18446744073709551615 <-- правильное

    (меня плющит, или в вопросе число поменялось на правильное?)

    и можно юзать тип unsigned long long

    unsigned long long number = 18446744073709551615; //у меня компилится без нареканий

    имхо, проще в шестнадцатеричной:
    unsigned long long number = 0xFFFFFFFFFFFFFFFF;
    Ответ написан
    3 комментария
  • Как оборудование "понимает" программу?

    15432
    @15432
    Системный программист ^_^
    Микроконтроллер не понимает, а тупо исполняет инструкции. Это ваша программа должна правильно сконфигурировать аппаратный порт микроконтроллера, чтобы на его выходе появилась логическая единица и светодиод зажёгся.
    Порядок действий отличается в зависимости от микроконтроллера. Где-то достаточно записать бит по определенному адресу памяти, где-то используются специальные ассемблерные команды для управления портами, и т.д.

    Программируется всё это обычно на уровне абстракций, с использованием готовых библиотек. Тот же Arduino поглядите. Глубокие знания электроники требуются для разработки устройств с этими микроконтроллерами.
    Ответ написан
  • Почему этот код возвращает такой странный ответ?

    15432
    @15432
    Системный программист ^_^
    Вы не инициализировали key
    int key = 0;
    Ответ написан
    4 комментария
  • Как скомпилировать WIN-32 приложения для запуска на машинах без С/С++ компилятора?

    15432
    @15432
    Системный программист ^_^
    Свойства проекта / C++ / Code Generation / Runtime Library - сменить Multi-threaded DLL на Multi-threaded
    Ответ написан
    Комментировать
  • Что происходит при выполнении кода C библиотек в .NET?

    15432
    @15432
    Системный программист ^_^
    Динамическая библиотека на C загружается в оперативную память и затем её код исполняется напрямую (возможно, с некоторым преобразованием передаваемых структур из managed в unmanaged и обратно).
    В случае с аналогичным кодом на C#, не происходит преобразования данных managed/unmanaged, но сам код при этом выполняется CLR, что может быть медленнее скомпилированного кода на C.
    Если ваш код производит сложные вычисления, требующие минут или даже часов времени, рекомендую использовать библиотеки на C. В остальном - как будет удобнее.
    Ответ написан
    Комментировать
  • Чем отличается динамическая переменная от переменной в блоке?

    15432
    @15432
    Системный программист ^_^
    В первом случае c - указатель на выделенную область памяти в куче размером 4 байта. Переменная располагается в оперативной памяти (RAM) и для обращения к ней, процессор вынужден выполнять чтение и запись [относительно] медленной оперативной памяти.

    Во втором случае c - локальная переменная, компилятор скорее всего превратит все действия по работе с ней в арифметические операции с регистрами процессора, обращение к которым на порядки быстрее, чем работа с ОЗУ.

    примерный ассемблерный псевдокод в первом случае (смешал несколько архитектур :) не воспринимайте буквально)

    mov r3, #4 //размер выделяемой области 4 байта
    call malloc() //выделим память
    mov r28, r3 //сохраним возвращенное значение адреса памяти
    str r29, r28[0] //сохраним a (r29) в выделенную память (r28[0])
    mov r29, r30 //присвоим a (r29) значение b (r30)
    ldr r30, r28[0] //присвоим b значение *c
    mov r3, r28 //адрес для очистки памяти
    call free() //удаление выделенной области


    следует заметить, что чтение и запись из ОЗУ - относительно медленные операции

    во втором случае скомпилированный код будет гораздо компактнее и выполнится практически моментально

    mov r28, r29 //c = a
    mov r29, r30 //a = b
    mov r30, r28 //b = c
    Ответ написан
    2 комментария