Здравствуйте, уважаемые эксперты! Мне нужна функция вывода строки в лог (это консоль или файл). Я хотел бы, чтобы функция воспринимала следующие параметры: void LOG (int color, char *format, ...); где color - цвет выводимого на экран сообщения (для файла не используется), format - формат сообщения (аналогично параметру format функции wsprintf) и ... - опциональные переменные, передаваемые в соответствии со строкой format. Проблема в том, как передать format и ... функции wsprintf, которую я и хочу использовать, потому что я же не знаю количества параметров в ..., а разбирать самому format не хотелось бы. Ответы, если можно на e-mail: bobjohn@newmail.ru Bob Johnson.
Здравствуйте, Bob Johnson! В таких случаях используют соответствующую функцию с префиксом v, в данном случае wvsprintf: void log( int color, const char* format, ... ) { char buf[1024]; va_list l; va_start(l, format); wvsprintf(buf, format, l); va_end(l); } void main() { log( 0, "%d of %d", 3, 25 ); } С уважением, Avl2k. Ответ отправлен: 03.02.2003, 10:30 Отправитель: Avl2k Отвечает Ramzes
Доброе время суток, Bob Johnson! вообще если функция принимает переменное кол-во аргументов, то естъ способ перечислитъ эти аргументы int sum(int first, ...) { int sum = 0, i = first; va_list start; // список аргументов va_start(start, first); // инициализируем список do{ sum+= first; i = va_arg(start, int); // следующий аргумент }while( i != -1 ); va_end(start); } инфу про va_list, va_start, va_arg и.т.п найдешъ в MSDN но в данном случае ты наперед должен знатъ типы передаваемых параметров, для макроса va_arg(va_list list, type). хотя конечно можно и как нибудъ запихнуутъ эти параметры в стек перед вызовом printf, но и в этом случае ты должен знатъ обший размер всех параметров. так что вероятней всего тее придется разбиратъ строку format. Ответ отправлен: 01.02.2003, 12:29 Отправитель: Ramzes Отвечает vitya
Приветствую Вас, Bob Johnson! вот примерный код void __cdecl ColorOutMessage(COLORREF color, LPCSTR lpszFormat, ...) { //Format string va_list args; va_start(args, lpszFormat); int nBuf; //если тебе нужен больший буфер - увеличь его здесь //если тебе нужен точный размер буфера, то используй // МФЦ - шный код для класса CString::Format() TCHAR szBuffer[512]; nBuf = _vsntprintf(szBuffer, sizeof(szBuffer)/sizeof(szBuffer[0]), lpszFormat, args); va_end(args); if (nBuf < 0) return; }
Ответ отправлен: 03.02.2003, 09:03 Отправитель: vitya
Вопрос № 558
Приветствую вас, эксперты. Как можно опросить клавиатуру (для игры под ДОС), а именно кнопки влево,вправо,вверх,вниз,пробел.
Приветствую Вас, Rustem! попробуйте getch(), она возвращает код нажартой клавиши. Но у нее естъ недостаток- она не возвращает управление пока не будет нажата какая-либо клавиша. Ответ отправлен: 01.02.2003, 12:43 Отправитель: Ramzes Отвечает Jadd
Здравствуйте, Rustem! Для этого есть несколько способов. Один из них - через функцию bioskey #include int bioskey(int cmd) Обращается в зависимости от значения cmd к функциям AH=00-02H прерывания 16Н. Возвращаемое функцией значение повторяет значение регистра АХ при выходе из прерывания. Ответ отправлен: 01.02.2003, 20:02 Отправитель: Jadd Отвечает DiGiT[old]
Добрый день, Rustem! прерывание int 0x16 Ф-ция 01 Ответ отправлен: 03.02.2003, 03:02 Отправитель: DiGiT[old]
Вопрос № 559
Здравствуйте эксперты. Как сделать чтобы CListBox или CListCtrl сосотял из CheckBox'ов? (используя MFC) Заранее благодарен.
Ответ отправлен: 01.02.2003, 14:44 Отправитель: Gibbel Отвечает DiGiT[old]
Доброе время суток, KydesNik! Если честно то там есть такой элемент как лист бох + check box в одном. Не помню как называется. Поищи в MSDN(его нет щас под рукой) и быстро найдешь. А как в CListCtrl их добавить, если честно не нашел.Остается один вариант самому их туда лепить :(( Ответ отправлен: 03.02.2003, 03:00 Отправитель: DiGiT[old] Отвечает xiron
Добрый день, KydesNik! Очень просто! pmyListCtrl->SetExtendedStyle( pmyListCtrl->GetExtendedStyle() | LVS_EX_CHECKBOXES); Ответ отправлен: 04.02.2003, 15:52 Отправитель: xiron
Форма отправки вопроса
Внимание!
Форма может работать некорректно в почтовых программах "Microsoft Outlook"
и "Microsoft Outlook Express". В программе The Bat!
подобные формы не работают вообще!
После нажатия на кнопку "Отправить", будет открыто второе окно. Заметьте,
что в некоторых браузерах могут стоять запреты на открытие других
окон, а также "чрезмерное" кэширование данных,
при этом факт отправки Вашего вопроса стоит под сомнением.
Мы рекомендуем открывать рассылку в программе Internet
Explorer 5.0+ или отправлять вопросы с сайта по адресу:
http://rusfaq.ru/cgi-bin/Message.cgi.