Программирование >>  Перегруженные имена функций и идентификаторы 

1 ... 191 192 193 [ 194 ] 195 196 197 ... 210


Мне необходим исходный текст программы, которая осуществляет поиск заданной строки

Ищите библиотеку 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) занимается



1 ... 191 192 193 [ 194 ] 195 196 197 ... 210

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