|
Программирование >> Перегруженные имена функций и идентификаторы
Сейчас я пытаюсь сортировать массив структур с помощью qsort. Процедура сравнения, которую я использую, принимает в качестве аргументов указатели на структуры, но компилятор выдает сообщение о неверном типе функции сравнения. Как мне преобразовать аргументы функции, чтобы подавить сообщения об ошибке? Преобразования должны быть сделаны внутри функции сравнения, которая должна быть объявлена как принимающая аргументы типа обобщенных указателей (const void * или char *). Функция сравнения может выглядеть так: int mystructcmp(p1, p2) char *p1, *p2; /* const void * для ANSI C */ { struct mystruct *sp1 = (struct mystruct *)p1; struct mystruct *sp2 = (struct mystruct *)p2; /* теперь сравнивайте sp1->что-угодно и sp2-> ... */ } С другой стороны, если сортируются указатели на структуры, необходима косвенная адресация: sp1 = *(struct mystruct **)p1 Как преобразовать числа в строки (операция, противоположная atoi)? Есть ли функция itoa? Просто используйте sprintf. (Необходимо будет выделить память для результата. Беспокоиться, что sprintf - слишком сильное средство, которое может привести к перерасходу памяти и увеличению времени выполнения, нет оснований. На практике sprintf работает хорошо). Как получить дату или время в Си программе? Просто используйте функции time, ctime, и/или localtime. (Эти функции существуют многие годы,они включены в стандарт ANSI). Вот простой пример: #include <stdio.h> #include <time.h> main() time t now = time((time t *)NULL); printf( Ifs %.24s.\n , ctime(&now)); return 0; Я знаю, что библиотечная функция localtime разбивает значение time t по отдельным членам структуры tm, а функция ctime превращает time t в строку символов. А как проделать обратную операцию перевода структуры tm или строки символов в значение time t? Стандарт ANSI определяет библиотечную функцию mktime, которая преобразует структуру tm в time t. Если ваш компилятор не поддерживает mktime, воспользуйтесь одной из общедоступных версий этой функции. Перевод строки в значение time t выполнить сложнее из-за большого количества форматов дат и времени, которые должны быть распознаны. Некоторые компиляторы поддерживают функцию strptime; другая популярная функция - partime широко распространяется с пакетом RCS, но нет уверенности, что эти функции войдут в Стандарт. Как прибавить n дней к дате? Как вычислить разность двух дат? Вошедшие в стандарт ANSI/ISO функции mktime и difftime могут помочь при решении обеих проблем. mktime() поддерживает ненормализованные даты, т.е. можно прямо взять заполненную структуру tm, увеличить или уменьшить член tm mday, затем вызвать mktime(), чтобы нормализовать члены year, month и day (и преобразовать в значение time t). difftime() вычисляет разность в секундах между двумя величинами типа time t. mktime() можно использовать для вычисления значения time t разности двух дат. (Заметьте, однако, что все эти приемы возможны лишь для дат, которые могут быть представлены значением типа time t; кроме того, из-за переходов на летнее и зимнее время продолжительность дня не точно равна 86400 сек.). Мне нужен генератор случайных чисел В стандартной библиотеке Си есть функция rand(). Реализация этой функции в вашем компиляторе может не быть идеальной, но и создание лучшей функции может оказаться очень непростым. Как получить случайные целые числа в определенном диапазоне? Очевидный способ: rand() % N где N, конечно, интервал, довольно плох, ведь поведение младших бит во многих генераторах случайных чисел огорчает своей неслучайностью. Лучше попробуйте нечто вроде: (int)((double)rand() / ((double)RAND MAX + 1) * N) Если вам не нравится употребление чисел с плавающей точкой, попробуйте: rand() / (RAND MAX / N + 1) Оба метода требуют знания RAND MAX (согласно ANSI, RAND MAX определен в <stdlib.h>. Предполагается, что N много меньше RAND MAX. Каждый раз при запуске программы функция rand() выдает одну и ту же последовательность чисел Можно вызвать srand() для случайной инициализации генератора случайных чисел. В качестве аргумента для srand() часто используется текущее время, или время, прошедшее до нажатия на клавишу (хотя едва ли существует мобильная процедура определения времен нажатия на клавиши). Мне необходима случайная величина, имеющая два значения true/false. Я использую rand() % 2, но получается неслучайная последовательность: 0,1,0,1,0... Некачественные генераторы случайных чисел (попавшие, к несчастью, в состав некоторых компиляторов) не очень то случайны, когда речь идет о младших битах. Попробуйте использовать старшие биты. Я все время получаю сообщения об ошибках - не определены библиотечные функции, но я включаю все необходимые головные файлы Иногда (особенно для нестандартных функций) следует явно указывать, какие библиотеки нужны при компоновке программы. Я по-прежнему получаю сообщения, что библиотечные функции не определены, хотя и использую ключ -l, чтобы явно указать библиотеки во время компоновки Многие компоновщики делают один проход по списку объектных файлов и библиотек, которые вы указали, извлекая из библиотек только те функции, удовлетворяющие ссылки, которые к этому моменту оказались неопределенными. Следовательно, порядок относительно объектных файлов, в котором перечислены библиотеки, важен; обычно просмотр библиотек нужно делать в самом конце. (Например, в операционной системе UNIX помещайте ключи -1 в самом конце командной строки).
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |