|
Программирование >> Перегруженные имена функций и идентификаторы
Как укоротить файл без уничтожения или переписывания? В системах 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 каналу, связанному с процессом, запустившим команду, что позволяет прочитать выходные данные (ии передать входные). А можно просто перенаправить выход команды в файл, затем открыть его и прочесть. Как получить содержимое директории в Си программе? Выясните, нельзя ли использовать функции opendir() и readdir(), доступные в большинстве систем Unix. Реализации этих функций известны для MS-DOS, VMS и других систем. (MS-DOS имеет также функции findfirst и findnext, которые делают в точности то же самое). Как работать с последовательными (COM) портами? Это зависит от операционной системы. В системе Unix обычно осуществляются операции открытия, чтения и записи во внешнее устройство и используются возможности терминального драйвера для настройки характеристик. В системе MS-DOS можно либо использовать прерывания BIOSa, либо (если требуется приличная скорость) один из управляемых прерываниями пакетов для работы с последовательными портами. Что можно с уверенностью сказать о начальных значениях переменных, которые явным образом не инициализированы? Если глобальные переменные имеют нулевое начальное значение, то правильно ли нулевое значение присваивается указателям и переменным с плавающей точкой? Статические переменные (то есть объявленные вне функций и те, что объявлены как принадлежащие классу static) всегда инициализируются (прямо при старте программы) нулем, как будто программист написал =0 . Значит, переменные будут инициализированы как нулевые указатели (соответствующего типа), если они объявлены указателями, или значениями 0.0, если были объявлены переменные с плавающей точкой. Переменные автоматического класса (т.е. локальные переменные без спецификации static), если они явно не определены, первоначально содержат мусор . Никаких полезных предсказаний относительно мусора сделать нельзя. Память, динамически выделяемая с помощью malloc и realloc также будет содержать мусор и должна быть инициализирована, если это необходимо, вызывающей программой. Память, выделенная с помощью calloc, зануляет все биты, что не всегда годится для указателей или переменных с плавающей точкой. Этот текст взят прямо из книги, но он не компилируется: char a[] = Hello, world! ; Возможно, ваш компилятор создан до принятия стандарта ANSI и еще не поддерживает инициализацию автоматических агрегатов (то есть нестатических локальных массивов и структур). Чтобы выкрутиться из этой ситуации, сделайте массив статическим или глобальным, или инициализируйте его с помощью strcpy, когда вызывается f(). (Всегда можно инициализировать автоматическую переменную char * стрингом литер.) Как писать данные в файл, чтобы их можно было читать на машинах с другим размером слова, порядком байтов или другим форматом чисел с плавающей точкой? Лучшее решение - использовать текстовые файлы (обычно ASCII), c данными, записанными fprintf. Читать данные лучше всего с помощью fscanf или чего-то подобного. (Такой же совет применим для сетевых протоколов). К мнениям, что текстовые файлы слишком велики и могут долго обрабатываться, относитесь скептически. Помимо того, что эффективность таких операций может быть на практике приемлемой, способность манипулировать данными с помощью стандартных средств может иметь решающее значение. Если необходимо использовать двоичный формат, переносимость данных можно улучшить (или получить выгоду от использования готовых библиотек ввода/вывода), если использовать стандартные форматы данных, такие как XDR (RFC 1014) (Sun), ASN.l(OSI), X.409 (CCITT), или ISO 8825 Основные правила кодирования . Как вставить или удалить строку (или запись) в середине файла? Придется, видимо, переписать файл. Как возвратить из функции несколько значений? Или передайте указатель на то место, которое будет заполнено функцией, или пусть функция возвращает структуру,
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |