|
Программирование >> Арифметические и логические операции
И вообще, так ли нужно заранее знать размер файла? Ведь самый точный способ определения его размера в С программе заключается в открытии и чтении. Может быть, можно изменить программу так, что размер файла будет получен в процессе чтения? Как укоротить файл без уничтожения или переписывания? В системах 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 * стрингом литер.)
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |