Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Дерективы процессора


Автор: Alex_G 1.8.2004, 13:59
Растолкуйте если можно простую вещь

есть функция

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

почему при вызове результат всегда разный

Автор: setq 1.8.2004, 14:30
а в параметре что передаёшь?

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

Передаю переменную 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, а также зачем она там нужна.
К сожалению код не мой, но очень нуно разобраться.
Заранее спасибо!




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

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

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

, где dwCRC[0]==0x7f3999d4 и в результате, после перестановки байтов в s2 сохраняется 0xd499397f.
В чём проблема-то?

Автор: Guest 3.8.2004, 20:18
Цитата
после перестановки байтов в s2 сохраняется 0xd499397f. В чём проблема-то?

Не могу понять, почему в s2 идет перестановка байтов.
Может функция IntToStr() их переставляет, поясните пожалуйста.

Автор: Олег М 4.8.2004, 05:28
Цитата
Может функция IntToStr() их переставляет, поясните пожалуйста.

Извини, не заметил мне вместо IntToStr померещилась SwitchIndian. А перестановлены они потому, что в памяти байты в слове и слова в двойном слове хранятся в обратном порядке. Это сделано для того, чтобы проще производить преобразования например из WORD в BYTE и т.д. Посмотри само значение dwCRC[0] в шестнацетиричном виде, в отладчике - всё будет правильно.

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

Извиняюсь за сложность трактовки, но помоему здесь что то не так.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)