Re: Получение int из указателя
От: FoolS.Top Армения  
Дата: 25.11.05 07:19
Оценка: -1
Здравствуйте, loran_, Вы писали:

_>Ситуация: имеется некий указатель типа char на область данных, это последовательность данных определенной структуры, в том числе и таких:

_>
_>Integer
_>Четыре байта в формате процессоров x86 (сначала наименее значащий байт).
_>

_> — фраза из мануала. Не долго думая, я делаю так:
_>
_>int CcDlg::ReadInt()
_>{
_>    int i(0);
_>    i=int(*Data);
_>    Data=Data+4;
_>    return i;
_>}
_>

_>, где Data и есть указатель на данные. Но как только число, хранящееся по указателю больше 90, то функция возвращает отрицательное значение
_>Добавлю, возвращает этот указатель "чужая" dll-ка, поэтому в наличии только их мануал.

Простите, я не заметил, что Data указатель на char. Тогда надо так

unsigned char* pC = (unsigned char*)Data;
i = (int)(*pC);
Feierlich, misterioso
Re[2]: Получение int из указателя
От: horseball Россия  
Дата: 29.11.05 15:33
Оценка: -1
Здравствуйте, 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% гарантия некоректного преобразования, низкая скорость работы.
Получение int из указателя
От: loran_ Россия  
Дата: 25.11.05 06:42
Оценка:
Ситуация: имеется некий указатель типа 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 (сначала наименее значащий байт).
_>

_> — фраза из мануала. Не долго думая, я делаю так:
_>
_>int CcDlg::ReadInt()
_>{
_>    int i(0);
_>    i=int(*Data);
_>    Data=Data+4;
_>    return i;
_>}
_>

_>, где Data и есть указатель на данные. Но как только число, хранящееся по указателю больше 90, то функция возвращает отрицательное значение
_>Добавлю, возвращает этот указатель "чужая" dll-ка, поэтому в наличии только их мануал.

Не 90, а 127
Re: Получение int из указателя
От: FoolS.Top Армения  
Дата: 25.11.05 07:07
Оценка:
Здравствуйте, 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);

i = *pInt;
Feierlich, misterioso
Re: Получение int из указателя
От: loran_ Россия  
Дата: 25.11.05 07:47
Оценка:
Огромное всем спасибо! Заработало!
WBR. Vadim
*Origin: Плохо когда не знаешь, да ещё и забудешь. (2:5020/2142)
Re: Получение int из указателя
От: MaximE Великобритания  
Дата: 25.11.05 17:05
Оценка:
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);


--
Maxim Yegorushkin
Posted via RSDN NNTP Server 1.9
Re[3]: Получение int из указателя
От: MaximE Великобритания  
Дата: 29.11.05 16:05
Оценка:
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, будешь ли ты ее пытаться соптимизировать?

--
Maxim Yegorushkin
Posted via RSDN NNTP Server 1.9
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.