Задать вопрос
Ответы пользователя по тегу C
  • А return 0(1) * _getch(), есть ли смысл от такой конструкции?

    15432
    @15432
    Системный программист ^_^
    Умножать на 0 getch() точно не стоит, если хочется избежать предупреждения от неиспользуемом результате, лучше напишите (void)getch();
    Ответ написан
    Комментировать
  • Как корректно вывести функцию в байтовом виде?

    15432
    @15432
    Системный программист ^_^
    Ну почему же ничего не выдает, size < 0 означает, что функция _end расположена перед функцией f, и это нормально, потому что часто компилятор соблюдает алфавитный порядок.
    Назовите их func_a и func_b и попробуйте ещё раз. Обязательно используйте в коде эти функции, чтобы они не оказались вырезанными
    Ответ написан
    Комментировать
  • Как создать файл без формата с скомпилированным C кодом?

    15432
    @15432
    Системный программист ^_^
    Возможно, вам поможет кусок из моей статьи, к которому я сам часто возвращаюсь. Правда, там ARM, но gcc везде +/- одинаковый

    arm-none-eabi-gcc.exe echo.c -nostdlib -O2 -o echo.out
    arm-none-eabi-objcopy.exe -O binary echo.out echo.bin


    По-хорошему нужно явно указать компилятору, по какому адресу будет расположен код директивой -Wl,--section-start=.text=0x30400000 (последнее - требуемый адрес)
    Ответ написан
    Комментировать
  • Почему может передоваться только 8 байт через сокеты клиенту?

    15432
    @15432
    Системный программист ^_^
    У вас там sizeof(get_buffer) стоит. Вы спрашиваете размер указателя, что равно 8. Таким способом можно указывать размер только статических массивов, для динамической памяти - только указывать конкретные значения
    Ответ написан
    1 комментарий
  • Как работает ZwMapViewOfSection?

    15432
    @15432
    Системный программист ^_^
    Почитайте про устройство Memory Management Unit (MMU), таблицы трансляции виртуальной памяти x86, TLB и так далее.

    В стандартном режиме процессор оперирует виртуальными адресами, которые не соответствуют физическим ячейкам оперативной памяти. Это удобно с точки зрения программирования и безопасности - в разных программах можно использовать те же адреса, а также не пускать программы в "чужие" области памяти.

    mmapiospace / mmapviewofsection как раз настраивает таблицу трансляции памяти для текущего процесса нужным образом, чтобы вы могли получить доступ к памяти, которую вы хотите.

    А софт для прошивки биоса пишет в аппаратные регистры SPI контроллера на шине PCI Express, не в память. И это не особенность материнки, а скорее интерфейс к оборудованию. Похожим образом через чтение/запись работает большинство драйверов устройств
    Ответ написан
    Комментировать
  • Нету структуры file_operation, в хедере fs.h, как исправить? как установить полные хедеры ядра?

    15432
    @15432
    Системный программист ^_^
    sudo apt-get install linux-headers-$(uname -r)
    Ответ написан
    Комментировать
  • Что отвечает за предотвращение нежелательной записи в text секцию?

    15432
    @15432
    Системный программист ^_^
    Если это микроконтроллер, то код вполне может находиться в read-only памяти - на флешке ПЗУ, запись в которую нельзя выполнить просто по указателю.
    В иных случаях за это отвечает модуль MPU (memory protection unit), который кто-то в системе настраивает.
    Ответ написан
    Комментировать
  • Возможно ли чтение физических адресов озу?

    15432
    @15432
    Системный программист ^_^
    Конечно, включите отладку ядра Windows, подключитесь к COM1 виртуальной машины, сможете читать память любого приложения обычными командами отладчика WinDbg.
    Ответ написан
    2 комментария
  • Вместо значений выдает -nan(ind). Что делать?

    15432
    @15432
    Системный программист ^_^
    вы (2 * a * c) в скобки-то возьмите,
    а то вы не делите, а умножаете
    Ответ написан
    Комментировать
  • Как определить пробел в си?

    15432
    @15432
    Системный программист ^_^
    if (s[i] == ' ') ...
    Ответ написан
    3 комментария
  • Два раза двойные скобки в if?

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

    15432
    @15432
    Системный программист ^_^
    после
    for (; *t != '\0'; t++)
          *s++ = *t;

    добавьте
    *s = '\0'

    чтобы строчку завершить

    но вообще у вас переполнение буфера идёт, за рамки массива вылезаете при копировании. Обратите на это внимание и выделяйте память динамически.
    Ответ написан
    Комментировать
  • Есть ли нормальный декомпилятор для линукс?

    15432
    @15432
    Системный программист ^_^
    IDA Pro / Hex-Rays есть и под линь
    Ответ написан
    5 комментариев
  • Почему в массив размером N можно положить больше чем N элементов?

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

    В данном случае из-за такой записи за границы допустимого возможны любые глюки вплоть до падения программы.
    Ответ написан
    Комментировать
  • Как устроен list() в Python?

    15432
    @15432
    Системный программист ^_^
    https://docs.python.org/2/faq/design.html#how-are-...

    How are lists implemented in CPython?¶
    CPython’s lists are really variable-length arrays, not Lisp-style linked lists. The implementation uses a contiguous array of references to other objects, and keeps a pointer to this array and the array’s length in a list head structure.

    This makes indexing a list a[i] an operation whose cost is independent of the size of the list or the value of the index.

    When items are appended or inserted, the array of references is resized. Some cleverness is applied to improve the performance of appending items repeatedly; when the array must be grown, some extra space is allocated so the next few times don’t require an actual resize.

    Короче динамический массив. Непрерывный массив указателей на объекты
    Ответ написан
    1 комментарий
  • Как правильно сделать приведение типов в Си?

    15432
    @15432
    Системный программист ^_^
    unsigned long у вас наверняка 32-битный. И его максимальное значение 4294967295, поэтому при умножении переполнение происходит.

    используйте unsigned long long, или считайте в типах с плавающей запятой (float, double)
    Ответ написан
    4 комментария
  • Многопоточность в Си в ассемблерном исполнении - возможно?

    15432
    @15432
    Системный программист ^_^
    В Си многопоточность.обычно реализована в библиотеке pthreads.h
    Многопоточность реализуется операционной системой. pthreads - просто библиотека, чтобы операционной системе сказать, мол, вот тебе отдельный поток для запуска

    причём Си можно отлаживать как код на ассемблере
    Ну да, Си всегда сначала компилируется в ассемблер, любым дизассемблером готовую программу можно разобрать на кусочки.

    Прочитал в интернете, что ассемблерная программа может выполняться только на одном ядре.
    Покажите, где такая ерунда написана

    Как тогда реализована многопоточность в Си
    В Си - просто интерфейс управления многопоточностью. Сама многопоточность - в операционной системе.

    раз есть эквивалентный код на ассемблере например, в gnu debugger
    Как в Си, так и в ассемблере вы просто увидите "вызвать pthread_create", и всё
    Ответ написан
    6 комментариев
  • Возможно ли писать на C++ со вставками C?

    15432
    @15432
    Системный программист ^_^
    Ну да, используйте extern:

    extern "C" {
            //сишный код
            int g(double);
            double h();
            ....
        };
    Ответ написан
    3 комментария
  • В чем разница между. и -> при работе со структурами в C?

    15432
    @15432
    Системный программист ^_^
    "->" разыменовывает указатель и обращается к элементу, "." это просто обращение к элементу структуры.

    Поэтому если у вас указатель на структуру, вам нужен "->", иначе нужен "."
    Ответ написан
    Комментировать
  • Как ввести строку без знака конца строки?

    15432
    @15432
    Системный программист ^_^
    Ну да, всё верно:
    Функция fgets() считывает до num-1 символов из файла stream и помещает их в массив символов, на который указывает str. Символы считываются до тех пор, пока не встретится символ «новая строка», EOF или до достижения указанного предела. По окончании считывания в массив str сразу после последнего считанного символа помещается нулевой символ. Символ «новая строка» при считывании будет сохранен и станет частью массива str.


    А вот gets не сохраняет конец строки:
    Функция gets() считывает символы из stdin и помещает их в массив символов, на который ука­зывает str. Символы считываются до тех, пока не встретится новая строка или EOF. Символ «но­вая строка» не делается частью строки, а транслируется в нулевой символ, завершающий строку.


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

    можете просто обрезать последний символ:
    country[strlen(country)-1] = 0
    Ответ написан
    Комментировать