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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Дерективы процессора 
:(
    Опции темы
Alex_G
Дата 1.8.2004, 13:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Растолкуйте если можно простую вещь

есть функция

DWORD SwitchIndian(DWORD n1)
{
#ifndef LOWBYTEFIRST
DWORD n2;

char* ps=(char*)&n1;
char* pd=(char*)&n2;
pd[3] = ps[0];
pd[2] = ps[1];
pd[1] = ps[2];
pd[0] = ps[3];

return n2;
#else
return n1;
#endif
}

в заголовочном файле определено

#define LOWBYTEFIRST

почему при вызове результат всегда разный
PM MAIL ICQ   Вверх
setq
Дата 1.8.2004, 14:30 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











а в параметре что передаёшь?
  Вверх
Alex_G
Дата 1.8.2004, 14:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Извеняюсь за некорректно поставленный вопрос, попробую иначе.

Передаю переменную DWORD. Например так

dwCRC[0] = SwitchIndian(dwCRC[0]); // где dwCRC[0] == 3566811519 (или 0xd499397f)

потом читаю побитово

for (int i1 = 0; i1 < 16; i1++)
{
s1 += " " + IntToStr(((unsigned char *)dwCRC)[i1]);
}

и получаю строку - 127 57 153 212, что соответствует 7f 39 99 d4 (тоесть все вроде бы верно функция SwitchIndian переставила местами байты), а потом делаю так:

s2:=IntToStr(dwCRC[0]); // s2 должна получить строку 2134481364 (что соответствует 0x7f3999d4), но вместо этого
s2 == 3566811519 (или 0xd499397f).

Не могу понять какое всетаки значение хранит dwCRC[0] после вызова SwitchIndian(dwCRC[0]) 0xd499397f или 0x7f3999d4
И как в принципе работает деректива #ifndef LOWBYTEFIRST, а также зачем она там нужна.
К сожалению код не мой, но очень нуно разобраться.
Заранее спасибо!




PM MAIL ICQ   Вверх
srd
Дата 3.8.2004, 07:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Нереварин
**


Профиль
Группа: Участник Клуба
Сообщений: 951
Регистрация: 30.8.2003
Где: Владивосток

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



Если в заголовочном файле, как ты говоришь, определено
#define LOWBYTEFIRST
и этот заголовочный файл вкючается в cpp-файл, содержащий определение функции SwitchIndian, то фактически эта функция становится такой:
DWORD SwitchIndian(DWORD n1)
{
return n1;
}
То есть она просто возвращает значение своего параметра.


--------------------
Не смей читать мою подпись!!!
PM MAIL Jabber   Вверх
Олег М
Дата 3.8.2004, 08:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 436
Регистрация: 10.6.2004
Где: Москва

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



Всё правильно. Здесь ты
Цитата
dwCRC[0] = SwitchIndian(dwCRC[0]); // где dwCRC[0] == 3566811519 (или 0xd499397f)

меняешь байты местами, те 0xd499397f получаешь 0x7f3999d4 и результат сохраняешь в dwCRC[0]. Потом ты вызываешь
Цитата
s2:=IntToStr(dwCRC[0]);

, где dwCRC[0]==0x7f3999d4 и в результате, после перестановки байтов в s2 сохраняется 0xd499397f.
В чём проблема-то?
PM MAIL ICQ   Вверх
Guest
Дата 3.8.2004, 20:18 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Цитата
после перестановки байтов в s2 сохраняется 0xd499397f. В чём проблема-то?

Не могу понять, почему в s2 идет перестановка байтов.
Может функция IntToStr() их переставляет, поясните пожалуйста.
  Вверх
Олег М
Дата 4.8.2004, 05:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 436
Регистрация: 10.6.2004
Где: Москва

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



Цитата
Может функция IntToStr() их переставляет, поясните пожалуйста.

Извини, не заметил мне вместо IntToStr померещилась SwitchIndian. А перестановлены они потому, что в памяти байты в слове и слова в двойном слове хранятся в обратном порядке. Это сделано для того, чтобы проще производить преобразования например из WORD в BYTE и т.д. Посмотри само значение dwCRC[0] в шестнацетиричном виде, в отладчике - всё будет правильно.
PM MAIL ICQ   Вверх
Guest
Дата 4.8.2004, 09:04 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Дело в том, что если перед SwitchIndian при помощи функции IntToStr передать значения например в мемо (для наглядности) и после вызова SwitchIndian проделать ту же операцию, то результат в мемо будет одинаковый

Извиняюсь за сложность трактовки, но помоему здесь что то не так.
  Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
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.0446 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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