Форум программистов, компьютерный форум CyberForum.ru

vwprintf, va_list (stdarg.h) и большие числа (больше 4х байт) - C++

Восстановить пароль Регистрация
 
lanakramoleb
1 / 1 / 0
Регистрация: 18.09.2012
Сообщений: 32
06.01.2014, 20:38     vwprintf, va_list (stdarg.h) и большие числа (больше 4х байт) #1
Здравствуйте

Вызывается метод:

C++
1
CLog::okf(L"\n\tSector size:\t%u\n\tSectors count:\t%u\n\tDisk size:\t%u", dwSectorSize, qwTotalSectors, qwDiskSize);
C++
1
2
3
4
5
6
7
8
9
10
void CLog::okf(wchar_t * wcszParams, ...)
{
    wcout << L"[OK] ";
    
    va_list argList;
    va_start(argList, wcszParams);
    vwprintf(wcszParams, argList);
    va_end(argList);
    wcout << endl;
}
Важен момент, что dwSectorSize типа DWORD (unsigned long, 4 байта), a qwTotalSectors и qwDiskSize типа QWORD (unsigned long long, 8 байт).

В моей ситуации
dwSectorSize = 512 (0x 00 00 02 00),
qwTotalSectors = 625137345 (0x 00 00 00 00 25 42 D6 C1),
qwDiskSize = 320070320640 (0x 00 00 00 00 4A 85 AD 82 00)

на моменте вызова vprintf в памяти по адресу argList хранится
Код
00 02 00 00 c1 d6 42 25 00 00 00 00 00 82 ad 85 4a 00 00 00
(далее полагаю неинтересным. Неправ?)

как видно все данные в памяти выглядят верно, однако на выводе имеем:

Код
Sector size:	512
Total sectors:	625137345
Disk size:		0
Если же qwTotalSectors = 0x 00 00 00 AA AA AA AA AA (я пробовал так для примера), a qwDiskSize = 1,
то в памяти будет
Код
00 02 00 00 aa aa aa aa aa 00 00 00 01 00 00 00
, а на выводе:

Код
Sector size:	512
Total sectors:	2863311530
Disk size:		170
т.е. 0x AA AA AA AA и 0x 00 00 00 AA соответственно.

Т.е., судя по всему, vprintf берёт агрументы по четыре байта (потому и ноль получился в первый раз и 170 во второй). Как это обойти? Как-то где-то можно указать размеры типов? Или ещё какой-то выход?

Заранее спасибо!

PS: Я сомневаюсь, что я запостил вопрос в правильной ветке форума, однако мне не приходит письмо для подтверждения аккаунта, чтобы писать в более "продвинутые" ветки... почему так?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.01.2014, 20:38     vwprintf, va_list (stdarg.h) и большие числа (больше 4х байт)
Посмотрите здесь:

Как создать va_list для _vsntprintf ? C++
Ввести с клавиатуры 10 чисел. Если среди них есть числа большие 15, заменить их на 15. Напечатать все полученные числа. C++
Для целого числа А выделить старший байт и поставить его на место младшего байта. старший байт при этом обнулить. C++
C++ функция изменяет старший байт числа на заданное значение не изменяя младший байт
C++ Ввести с клавиатуры 10 чисел. Если среди них есть числа, большие 15, заменить их на 15. Напечатать все полученные числа
Очень большие числа: узнать, есть ли остаток от деления одного числа на другое C++
Как работать с va_list? C++
C++ Не работает snprintf с va_list C++98

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Jupiter
Каратель
Эксперт C++
6542 / 3962 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
06.01.2014, 20:47     vwprintf, va_list (stdarg.h) и большие числа (больше 4х байт) #2
Цитата Сообщение от lanakramoleb Посмотреть сообщение
Т.е., судя по всему, vprintf берёт агрументы по четыре байта
а вас не смущает что в строке формата все спецификаторы одинаковые - %u ?
lanakramoleb
1 / 1 / 0
Регистрация: 18.09.2012
Сообщений: 32
06.01.2014, 20:53  [ТС]     vwprintf, va_list (stdarg.h) и большие числа (больше 4х байт) #3
Боже ж ты мой, как глупо... %llu, конечно, решил все проблемы.
Спасибо.
Наверное, надо поспать...
Yandex
Объявления
06.01.2014, 20:53     vwprintf, va_list (stdarg.h) и большие числа (больше 4х байт)
Ответ Создать тему
Опции темы

Текущее время: 13:51. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru