|
Программирование >> Перегруженные имена функций и идентификаторы
Мне необходим исходный текст программы, которая осуществляет поиск заданной строки Ищите библиотеку regesp (поставляется со многими UNIX-системами) или достаньте пакет regexp Генри Спенсера (Henry Spencer). Как разбить командную строку на разделенные пробельными литерами аргументы (что-то вроде argc и argv в main)? В большинстве компиляторов имеется функция strtok, хотя она требует хитроумного обращения, а ее возможности могут вас не удовлетворить (например, работа в случае кавычек). Вот я написал программу, а она ведет себя странно. Что в ней не так? Попробуйте сначала запустить lint (возможно, с ключами -a, -c, -h, -p). Многие компиляторы Си выполняют на самом деле только половину задачи, не сообщая о тех подозрительных местах в тексте программы, которые не препятствуют генерации кода. Как мне подавить сообщение warning: possible pointer alignment problem ( предупреждение: возможна проблема с выравниванием указателя ), которое выдает lint после каждого вызова malloc? Проблема состоит в том, что lint обычно не знает, и нет возможности ему об этом сообщить, что malloc возвращает указатель на область памяти, которая должным образом выровнена для хранения объекта любого типа . Возможна псевдореализация malloc с помощью #define внутри #ifdef lint, которая удалит это сообщение, но слишком прямолинейное применение #define может подавить и другие осмысленные сообщения о действительно некорректных вызовах. Возможно, будет проще игнорировать эти сообщения, может быть, делать это автоматически с помощью grep -v. Где найти ANSI-совместимый lint? Программа, которая называется FlexeLint (в виде исходного текста с удаленными комментариями и переименованными переменными, пригодная для компиляции на почти любой системе) может быть заказана по адресу: Gimpel Software 3207 Hogarth Lane Collegeville, PA 19426 USA (+1) 610 584 4261 gimpel@netaxs.com Lint для System V release 4 ANSI-совместим и может быть получен (вместе с другими C утилитами) от UNIX Support Labs или от дилеров System V. Другой ANSI-совместимый LINT (способный также выполнять формальную верификацию высокого уровня) называется LCLint и доступен через: ftp: 1arch.1cs.mit.edu: pub/Larch/1c1int/. Ничего страшного, если программы lint нет. Многие современные компиляторы почти столь же эффективны в выявлении ошибок и подозрительных мест, как и lint. Может ли простой и приятный трюк if(!strcmp(s1, s2)) служить образцом хорошего стиля? Стиль не особенно хороший, хотя такая конструкция весьма популярна. Тест удачен в случае равенства строк, хотя по виду условия можно подумать, что это тест на неравенство. Есть альтернативный прием, связанный с использованием макроса: #define Streq(s1, s2) (strcmp((s1), (s2)) == 0) Вопросы стиля программирования, как и проблемы веры, могут обсуждаться бесконечно. К хорошему стилю стоит стремиться, он легко узнаваем, но не определим. Каков наилучший стиль внешнего оформления программы? Не так важно, чтобы стиль был идеален . Важнее, чтобы он применялся последовательно и был совместим (со стилем коллег или общедоступных программ). Так трудно определимое понятие хороший стиль включает в себя гораздо больше, чем просто внешнее оформление программы; не тратьте слишком много времени на отступы и скобки в ущерб более существенным слагаемым качества. У меня операции с плавающей точкой выполняются странно, и на разных машинах получаются различные результаты Сначала убедитесь, что подключен головной файл <math.h> и правильно объявлены другие функции, возвращающие тип double. Если дело не в этом, вспомните, что большинство компьютеров используют форматы с плавающей точкой, которые хотя и похоже, но вовсе не идеально имитируют операции с действительными числами. Потеря значимости, накопление ошибок и другие свойственные ЭВМ особенности вычислений могут быть весьма болезненными. Не нужно предполагать, что результаты операций с плавающей точкой будут точными, в особенности не стоит проверять на равенство два числа с плавающей точкой. (Следует избегать любых ненужных случайных факторов.) Все эти проблемы одинаково свойственны как Си, так и другим языкам программирования. Семантика операций с плавающей точкой определяется обычно так, как это выполняет процессор ; иначе компилятор вынужден бы был заниматься непомерно дорогостоящей эмуляцией правильной модели вычислений. Я пытаюсь проделать кое-какие вычисления, связанные с тригонометрией, включаю <math.h>, но все равно получаю сообщение: undefined: sin во время компиляции Убедитесь в том, что компоновщику известна библиотека, в которой собраны математические функции. Например, в операционной системе UNIX часто необходим ключ -lm в самом конце командной строки. Почему в языке Си нет оператора возведения в степень? Потому что немногие процессоры имеют такую инструкцию. Вместо этого можно, включив головной файл <math.h>, использовать функцию pow(), хотя часто при небольших целых порядках явное умножение предпочтительней. Как округлять числа? Вот самый простой и честный способ: (int)(x + 0.5) Хотя для отрицательн1х чисел это не годится. Как выявить специальное значение IEEE NaN и другие специальные значения? Многие компиляторы с высококачественной реализацией стандарта IEEE операций с плавающей точкой обеспечивают возможность (например, макрос isnan()) явной работы с такими значениями, а Numerical C Extensions Group (NCEG) занимается
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |