Программирование >>  Арифметические и логические операции 

1 ... 50 51 52 [ 53 ]


И вообще, так ли нужно заранее знать размер файла? Ведь самый точный способ определения его размера в С программе заключается в открытии и чтении. Может быть, можно изменить программу так, что размер файла будет получен в процессе чтения?

Как укоротить файл без уничтожения или переписывания?

В системах BSD есть функция ftruncate(), несколько других систем поддерживают chsize(), в некоторых имеется (возможно, недокументированный) параметр fcntl F FREESP. В системе MS-DOS можно иногда использовать write(fd, , 0). Однако, полностью мобильного решения не существует.

Как реализовать задержку или определить время реакции пользователя, чтобы погрешность была меньше секунды?

У этой задачи нет, к несчастью, мобильных решений. Unix V7 и ее производные имели весьма полезную функцию ftime() c точностью до миллисекунды, но она исчезла в System V и Posix. Поищите такие функции: nap(), setitimer(), msleep(), usleep(), clock() и gettimeofday(). Вызовы select() и poll() (если эти функции доступны) могут быть добавлены к сервисным функциям для создания простых задержек. В системе MS-DOS возможно перепрограммирование системного таймера и прерываний таймера.

Как прочитать объектный файл и передать управление на одну из его функций?

Необходим динамический компоновщик и/или загрузчик. Возможно выделить память с помощью malloc и читать объектные файлы, но нужны обширные познания в форматах объектных файлов, модификации адресов и пр.

В системе BSD Unix можно использовать system() и ld -A для динамической компоновки. Многие (большинство) версии SunOS и System V имеют библиотеку -ldl, позволяющую динамически загружать объектные модули. Есть еще GNU пакет, который называется dld .

Как выполнить из программы команду операционной системы?

Используйте system().

Как перехватить то, что выдает команда операционной системы?

Unix и некоторые другие операционные системы имеют функцию popen(), которая переназначает поток stdio каналу, связанному с процессом, запустившим команду, что позволяет прочитать выходные данные (или передать входные). А можно просто перенаправить выход команды в файл, затем открыть его и прочесть.

Как работать с последовательными (COM) портами?

Это зависит от операционной системы. В системе Unix обычно осуществляются операции открытия, чтения и записи во внешнее устройство и используются возможности терминального драйвера для настройки характеристик. В системе MS-DOS можно либо использовать прерывания BIOSa, либо (если требуется приличная скорость) один из управляемых прерываниями пакетов для работы с последовательными портами.

Что можно с уверенностью сказать о начальных значениях переменных, которые явным образом не инициализированы? Если глобальные переменные имеют нулевое начальное значение, то правильно ли нулевое значение присваивается указателям и переменным с плавающей точкой?

Статические переменные (то есть объявленные вне функций и те, что объявлены как принадлежащие классу stаtic) всегда инициализируются (прямо при старте программы) нулем, как будто программист написал =0 . Значит, переменные будут инициализированы как нулевые указатели (соответствующего типа), если они объявлены указателями, или значениями 0.0, если были объявлены переменные с плавающей точкой.

Переменные автоматического класса (т.е. локальные переменные без спецификации static), если они явно не определены, первоначально содержат мусор . Никаких полезных предсказаний относительно мусора сделать нельзя.

Память, динамически выделяемая с помощью malloc и realloc также будет содержать мусор и должна быть инициализирована, если это необходимо, вызывающей программой. Память, выделенная с помощью calloc, зануляет все биты, что не всегда годится для указателей или переменных с плавающей точкой.

Этот текст взят прямо из книги, но он не компилируется: f() { char a() = Hello, world! ; }

Возможно, ваш компилятор создан до принятия стандарта ANSI и еще не поддерживает инициализацию автоматических агрегатов (то есть нестатических локальных массивов и структур).

Чтобы выкрутиться из этой ситуации, сделайте массив статическим или глобальным, или инициализируйте его с помощью strcpy, когда вызывается f(). (Всегда можно инициализировать автоматическую переменную char * стрингом литер.)



1 ... 50 51 52 [ 53 ]

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика