Ситуация: имеется некий указатель типа char на область данных, это последовательность данных определенной структуры, в том числе и таких:
Integer
Четыре байта в формате процессоров x86 (сначала наименее значащий байт).
— фраза из мануала. Не долго думая, я делаю так:
int CcDlg::ReadInt()
{
int i(0);
i=int(*Data);
Data=Data+4;
return i;
}
, где Data и есть указатель на данные. Но как только число, хранящееся по указателю больше 90, то функция возвращает отрицательное значение
Добавлю, возвращает этот указатель "чужая" dll-ка, поэтому в наличии только их мануал.
WBR. Vadim
*Origin: Плохо когда не знаешь, да ещё и забудешь. (2:5020/2142)
Re: Получение int из указателя
От:
Аноним
Дата:
25.11.05 07:01
Оценка:
Здравствуйте, loran_, Вы писали: _>int CcDlg::ReadInt() _>{ _> int i(0);
i=*(int *)Data; _> Data=Data+4; _> return i; _>} _>[/ccode]
Re: Получение int из указателя
От:
Аноним
Дата:
25.11.05 07:01
Оценка:
Здравствуйте, loran_, Вы писали:
_>Ситуация: имеется некий указатель типа char на область данных, это последовательность данных определенной структуры, в том числе и таких: _>
_>Integer
_>Четыре байта в формате процессоров x86 (сначала наименее значащий байт).
_>
_> — фраза из мануала. Не долго думая, я делаю так: _>
_>, где Data и есть указатель на данные. Но как только число, хранящееся по указателю больше 90, то функция возвращает отрицательное значение _>Добавлю, возвращает этот указатель "чужая" dll-ка, поэтому в наличии только их мануал.
Здравствуйте, loran_, Вы писали:
_>Ситуация: имеется некий указатель типа char на область данных, это последовательность данных определенной структуры, в том числе и таких: _>
_>Integer
_>Четыре байта в формате процессоров x86 (сначала наименее значащий байт).
_>
_> — фраза из мануала. Не долго думая, я делаю так: _>
_>int CcDlg::ReadInt()
_>{
_> int i(0);
_> i=int(*Data);
_> Data=Data+4; // Если Data указывает на int, то надо Data++
_> return i;
_>}
_> _>, где Data и есть указатель на данные. Но как только число, хранящееся по указателю больше 90, то функция возвращает отрицательное значение _>Добавлю, возвращает этот указатель "чужая" dll-ка, поэтому в наличии только их мануал.
Data указатель на что? Надо так
int* pInt = (int*)Data;
// или int* pInt = reinterpret_cast<int*>(Data);
Здравствуйте, loran_, Вы писали:
_>Ситуация: имеется некий указатель типа char на область данных, это последовательность данных определенной структуры, в том числе и таких: _>
_>Integer
_>Четыре байта в формате процессоров x86 (сначала наименее значащий байт).
_>
_> — фраза из мануала. Не долго думая, я делаю так: _>
_>, где Data и есть указатель на данные. Но как только число, хранящееся по указателю больше 90, то функция возвращает отрицательное значение _>Добавлю, возвращает этот указатель "чужая" dll-ка, поэтому в наличии только их мануал.
Простите, я не заметил, что Data указатель на char. Тогда надо так
unsigned char* pC = (unsigned char*)Data;
i = (int)(*pC);
On Fri, 25 Nov 2005 06:42:22 -0000, loran_ <33078@users.rsdn.ru> wrote:
> Ситуация: имеется некий указатель типа char на область данных, это последовательность данных определенной структуры, в том числе и таких: >
> Integer
> Четыре байта в формате процессоров x86 (сначала наименее значащий байт).
>
> — фраза из мануала. Не долго думая, я делаю так: >
> int CcDlg::ReadInt()
> {
> int i(0);
> i=int(*Data);
> Data=Data+4;
> return i;
> }
>
Переносимый безопасный способ это сделать выглядит так:
int i; // подразумевается 4-байтный int
memcpy(&i, data, sizeof i);
Здравствуйте, MaximE, Вы писали:
ME>On Fri, 25 Nov 2005 06:42:22 -0000, loran_ <33078@users.rsdn.ru> wrote: ME>Переносимый безопасный способ это сделать выглядит так:
ME>[c] ME>int i; // подразумевается 4-байтный int ME>memcpy(&i, data, sizeof i);
Кто может привести способ ХУЖЕ данного?
Навскидку, практически 100% гарантия ошибки доступа по чтению, абсолютно 100% гарантия некоректного преобразования, низкая скорость работы.
On Tue, 29 Nov 2005 15:33:18 -0000, horseball <48322@users.rsdn.ru> wrote:
> Здравствуйте, MaximE, Вы писали: > > ME>On Fri, 25 Nov 2005 06:42:22 -0000, loran_ <33078@users.rsdn.ru> wrote: > ME>Переносимый безопасный способ это сделать выглядит так: > > ME>[c] > ME>int i; // подразумевается 4-байтный int > ME>memcpy(&i, data, sizeof i); > > Кто может привести способ ХУЖЕ данного? > Навскидку, практически 100% гарантия ошибки доступа по чтению,
Чтению чего? memcpy гарантированно работает с невыровненными данными на любой платформе.
> абсолютно 100% гарантия некоректного преобразования,
Какое либо преобразования здесь отсутствует, только копирование.
> низкая скорость работы.
Относительно чего? Если эта ф-ция вызывается раз в год и отрабатывает за 100ms, будешь ли ты ее пытаться соптимизировать?