Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как вывести поле памяти функцией printf? unsigned long -> HEX 
:(
    Опции темы
Xf1sh
Дата 27.4.2006, 05:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 19
Регистрация: 27.9.2005

Репутация: нет
Всего: нет



У меня есть такой код:
Код

typedef unsigned long DWORD;

struct _R0
{
_RH rh0;
BYTE nunits;
DWORD end_addr;
}

Компилятор Borland C++ 3.0

Мне нужно вывести содержимое поля памяти end_addr в шестнадцатеричном виде с помощью printf. Как это можно сделать? А то выдает какую-то ерунду. Я смотрю в Turbo Debugger'e должно выводиться такое значение: 0x75F200A5, а выдает только 0x000000A5.
Вот мой вариант printf'а, каторый неправильно работает:
Код

sprintf(buf, "end_addr = 0x%.8X", r0.end_addr);
сputs(buf);

Подскажите, пожалуйста, что нужно писать около знака процента, чтобы все правильно работало?
PM MAIL   Вверх
VectorMan
Дата 27.4.2006, 07:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Antihero
*


Профиль
Группа: Участник
Сообщений: 110
Регистрация: 9.4.2006

Репутация: 1
Всего: 4



юзай %p
хоть и не официальный спецификатор, но поддерживается почти всеми стандартными библиотеками 

ну или так

Код

sprintf(buf, "end_addr = 0x%X%X", r0.end_addr >> 16, r0.end_addr);
сputs(buf);
 

Это сообщение отредактировал(а) VectorMan - 27.4.2006, 07:42
PM   Вверх
likehood
Дата 27.4.2006, 08:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


666
**


Профиль
Группа: Участник
Сообщений: 536
Регистрация: 21.12.2005

Репутация: 8
Всего: 24



Может подойдет это
Код

sprintf(buf, "end_addr = 0x%lX", r0.end_addr);
 
PM MAIL   Вверх
Знак
Дата 27.4.2006, 17:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 135
Регистрация: 29.4.2005

Репутация: -5
Всего: нет



long не DWORDD

 
--------------------
Ищу 2 файлаowl.tchwindows.tch 
PM MAIL   Вверх
Xf1sh
Дата 28.4.2006, 18:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 19
Регистрация: 27.9.2005

Репутация: нет
Всего: нет



Я кажется все понял! Я написал на встроенном ассемблере небольшой фрагмент, который по идее должен выполнять теже самые действия и в итоге он выдал одинаковый результат, если использовать спецификацию преобразования %.8lX.
Код

// Эти три строки я написал уже потом, когда попробывал на асме.

    strcpy(buf, "");
    sprintf(buf, "end_addr = 0x%.8lX", r0.end_addr);
    cputs(buf);

// Вот начало эксперимента.

    void near *p = &r0.end_addr;
    int sz;
    sz = sizeof(DWORD);

Код


// Преобразование поля памяти и вывод на экран.

    asm    {
        mov    si,sz
        mov    bx,p
        xor    ax,ax
    }
m1:
    asm {
        mov    al,[bx + si - 1]

        shl    ax,4    // Сохранить старшую тетраду в ah.
        shr    al,4    // Восстановить младшую в al.

// Преобразовать в ASCII al.

        cmp    al,10
        sbb    al,69h
        das

        mov    dl,al

        shr    ax,8

        cmp    al,10
        sbb    al,69h
        das

        mov    dh,al

        push ax
        push bx

// Вывести символ с текущим атрибутом на экран.

        mov    ah,0Ah
        mov    bh,0
        mov    al,dh
        mov    cx,1
        int    10h

        mov    di,dx    // Сохранить dx.

// Считать положение и размер курсора.

        mov    ah,03h
        mov    bh,0
        int    10h    // Выход: dh = строка, dl = столбец.

        inc    dl
// Установить положение курсора.

        mov    ah,02h
        int    10h

        mov    dx,di    // Восстановить dx.

// Вывести dl.

        mov    ah,0Ah
        mov al,dl
        mov    cx,1
        int    10h

        mov    ah,03h
        mov    bh,0
        int    10h
        inc    dl
        mov    ah,02h
        int    10h

        pop    bx
        pop    ax

        dec    si
        jnz    m1
    }
 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0669 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.