|
Программирование >> Перегруженные имена функций и идентификаторы
стандартизацией таких средств. Примером грубого, но обычно эффективного способа проверки на NaN служит макрос: #define isnan(x) ((x) != (x)) хотя не знающие об IEEE компиляторы могут выбросить проверку в процессе оптимизации. У меня проблемы с компилятором Turbo C. Программа аварийно завершается, выдавая нечто вроде floating point formats not linked Некоторые компиляторы для мини-эвм, включая Turbo C (а также компилятор Денниса Ритчи дя PDP-11), не включают поддержку операций с плавающей точкой, когда им кажется, что это не понадобится. В особенности это касается версий printf и scanf, когда для экономии места не включается поддержка %e, %f и %g. Бывает так, что эвристической процедуры Turbo C, которая определяет - использует программа операции с плавающей точкой или нет, оказывается недостаточно, и программист должен лишний раз вызвать функцию, использующую операции с плавающей точкой, чтобы заставить компилятор включить поддержку таких операций. Как прочитать с клавиатуры один символ, не дожидаясь новой строки? Вопреки популярному убеждению и желанию многих, этот вопрос (как и родственные вопросы, связанные с дублированием символов) не относится к языку Си. Передача символов с клавиатуры программе, написанной на Си, осуществляется операционной системой, эта операция не стандартизирована языком Си. Некоторые версии библиотеки curses содержат функцию cbreak(), которая делает как раз то, что нужно. Если вы пытаетесь прочитать пароль с клавиатуры без вывода его на экран, попробуйте getpass(). В операционной системе UNIX используйте ioctl для смены режима работы драйвера терминала (CBREAK или RAW для классических версий; ICANON, c cc[VMIN] и c cc[VTIME] для System V или Posix). В системе MS-DOS используйте getch(). В системе VMS попробуйте функции управления экраном (SMG$) ии curses, или используйте низкоуровневые команды $QIO с кодами IO$ READVBLK (и, может быть, IO$M NOECHO) для приема одного символа за раз. В других операционных системах выкручивайтесь сами. Помните, что в некоторых операционных системах сделать нечто подобное невозможно, так как работа с символами осуществляется вспомогательными процессорами и не находится под контролем центрального процессора. Вопросы, ответы на которые зависят от операционной системы, неуместны в comp.lang.c. Ответы на многие вопросы можно найти в FAQ таких групп как comp.unix.questions и comp.os.msdos.programmer. Имейте в виду, что ответы могут отличаться даже в случае разных вариантов одной и той же операционной системы. Если вопрос касается специфики операционной системы, помните, что ответ, пригодный в вашей системе, может быть бесполезен всем остальным. Как определить - есть ли символы для чтения (и если есть, то сколько?) И наоборот, как сделать, чтобы выполнение программы не блокировалось, когда нет символов для чтения? Ответ на эти вопросы также целиком зависит от операционной системы. В некоторых версиях curses есть функция nodelay(). В зависимости от операционной системы вы сможете использовать неблокирующий ввод/вывод или системный вызов select или ioctl FIONREAD, или kbhit(), или rdchk(), или опцию O NDELAY функций open() или fcntl(). Как очистить экран? Как выводить на экран негативное изображение? Это зависит от типа терминала (или дисплея). Можете использовать такую библиотеку как termcap или curses, или какие-то другие функции, пригодные для данной операционной системы. Как программа может определить полный путь к месту, из которого она была вызвана? argv[0] может содержать весь путь, часть его или ничего не содержать. Если имя файа в argv[0] имеется, но информация не полна, возможно повторение логики поиска исполнимого файла, используемой интерпретатором командного языка. Гарантированных или мобильных решений, однако, не существует. Как процесс может изменить переменную окружения родительского процесса? В общем, никак. Различные операционные системы обеспечивают сходную с UNIX возможность задания пары имя/значение. Может ли программа с пользой для себя поменять окружение, и если да, то как - все это зависит от операционной системы. В системе UNIX процесс может модифицировать свое окружение (в некоторых системах есть для этого функции setenv() и/или putenv()) и модифицированное окружение обычно передается дочерним процессам но не распространяется на родительский процесс. Как проверить, существует ли файл? Мне необходимо спрашивать пользователя перед тем как переписывать существующие файлы В UNIX-подобных операционных системах можно попробовать функцию access(), хотя имеются кое-какие проблемы. (Применение access() может сказаться на последующих действиях, кроме того, возможны особенности исполнения в setuid-программах). Другое (возможно, лучшее) решение - вызвать stat(), указав имя файла. Единственный универсальный, гарантирующий мобильность способ состоит в попытке открыть файл. Как определить размер файла до его чтения? Если размер файла - это количество литер, которое можно прочитать, то, вообще говоря, это количество заранее неизвестно. В операционной системе Unix вызов функции stat дает точный ответ, и многие операционные системы поддерживают похожую функцию, которая дает приблизительный ответ. Можно c помощью fseek переместиться в конец файла, а затем вызвать ftell, но такой прием немобилен (дает точный ответ только в системе Unix, в других же случаях ответ почти точен лишь для определенных стандартом ANSI двоичных файлов). В некоторых системах имеются подпрограммы filesize или filelength. И вообще, так ли нужно заранее знать размер файа? Ведь самый точный способ определения его размера в Си программе заключается в открытии и чтении. Может быть, можно изменить программу так, что размер файла будет получен в процессе чтения?
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |