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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
lanakramoleb
1 / 1 / 0
Регистрация: 18.09.2012
Сообщений: 32
#1

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

06.01.2014, 20:38. Просмотров 268. Ответов 2
Метки нет (Все метки)

Здравствуйте

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

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х байт) (C++):

функция изменяет старший байт числа на заданное значение не изменяя младший байт - C++
функция изменяет старший байт числа на заданное значение не изменяя младший байт. как можно проще

Для целого числа А выделить старший байт и поставить его на место младшего байта. старший байт при этом обнулить. - C++
Помогите пожалуйста, вообще не могу понять как делать следующее...Еще и в программе CODE BLOCKS препод почему именно эту программу...

Очень большие числа: узнать, есть ли остаток от деления одного числа на другое - C++
Требуется узнать, есть ли остаток от деления одного числа на другое. Оба числа много больше int64, ~1000 символов и больше. Я попытался...

Можно ли в char строку копировать больше байт, чем ее размер? - C++
char a = &quot;ab&quot;; strcpy(a, &quot;abcd&quot;); Можно ли так делать? Компилятор не ругнулся и при выполнении не вылетела. Память автоматически...

Не работает snprintf с va_list C++98 - C++
Хочу собрать функцию вывода на подобии printf, но немогу понять почему snprintf делает пустоту, хотя результат его &gt; 0 const...

Как работать с va_list? - C++
Есть функция: std::wstring APP::Execute (std::wstring scrName, wchar_t *args,...) { va_list ArgsL; va_start(ArgsL,args); ...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Jupiter
Каратель
Эксперт С++
6553 / 3973 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
06.01.2014, 20:47 #2
Цитата Сообщение от lanakramoleb Посмотреть сообщение
Т.е., судя по всему, vprintf берёт агрументы по четыре байта
а вас не смущает что в строке формата все спецификаторы одинаковые - %u ?
lanakramoleb
1 / 1 / 0
Регистрация: 18.09.2012
Сообщений: 32
06.01.2014, 20:53  [ТС] #3
Боже ж ты мой, как глупо... %llu, конечно, решил все проблемы.
Спасибо.
Наверное, надо поспать...
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.01.2014, 20:53
Привет! Вот еще темы с ответами:

Ввести с клавиатуры 10 чисел. Если среди них есть числа, большие 15, заменить их на 15. Напечатать все полученные числа - C++
Ввести с клавиатуры 10 чисел. Если среди них есть числа, большие 15, заменить их на 15. Напечатать все полученные числа.

Ввести с клавиатуры 10 чисел. Если среди них есть числа большие 15, заменить их на 15. Напечатать все полученные числа. - C++
Помогите решить задачу в Turdo C++, там где используется printf scanf: Ввести с клавиатуры 10 чисел. Если среди них есть числа большие...

Как создать va_list для _vsntprintf ? - C++
Программирование хобби. В основном программирую на Autolispe. Хотелось бы иметь функцию аналогичную swprintf или _vsntprintf ...

Возвращаемое поле больше 4000 байт - Oracle
В таблице БД есть текстовое поле. При запросе возвращается максимум только 4000 байт, остальное игнорируется. Подскажите плз как можно...


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

Или воспользуйтесь поиском по форуму:
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru