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


Автор: Severyanin 18.12.2008, 05:10
Добрый день. Я принимаю с прибора массив типа unsigned char, в который прибор записывает такую же структуру. Мне необходимо получить ту же структуру из этого массива. Явное копирование с помощью memset результата не дает. Вернее, часть информации записывается правильно, а переменные типа float получают дикие значения типа 1,56Е-44. Подскажите, пожалуйста, каким образом правильно скопировать данный массив в структуру

Автор: Andrey44 18.12.2008, 08:29
Цитата(Severyanin @  18.12.2008,  05:10 Найти цитируемый пост)
Я принимаю с прибора массив типа unsigned char, в который прибор записывает такую же структуру.

Вдумайтесь в то что вы написали. Я понять не могу.
Покажите как вы делаете, то что пишете

Автор: Severyanin 18.12.2008, 08:56
делаю я пока так: есть массив
Код
 unsigned char buff[512];

 и структура определенного типа TOporaMeasures. Мне нужно взять информацию из этго массива и разложить по полям структуры, которые имеют разные типы - char, float и т д. Каким образом мне это сделать?

Автор: Lazin 18.12.2008, 09:43
Код

unsigned char* buff;
//заполняем массив

struct mydata
{
int intdata;
float floatdata;
};

//выгребаем данные
mydata* ptr = (mydata*)buff;
std::cout << ptr->intdata << ptr->floatdata << std::endl;


только нужно учитывать выравнивание smile 

Автор: Severyanin 18.12.2008, 09:56
Вот с этим и есть основные фокусы. при любом выравнивании, которое я менял по совету dumb с помощью pragma pack, получаются в итоге неверные результаты для типов с плавающей точкой, то есть, значения типа 3,5E-38  и так далее. Вот я и стал спрашивать, есть ли альтернативный вариант
 smile Так все, я смотрю, уже активно заимствуют аватары?))))

Автор: mrbrooks 18.12.2008, 10:30
Severyanin, а ты уверен что буфер из unsigned char даст верный float. Обычно аналоговые значения передаются signed char.

Автор: Lazin 18.12.2008, 10:33
можешь вручную распаковывать
Код


char* data;
...
struct mydata
{
int intdata;
float floatdata;
};
...
mystruct result;
const int *pint = (const int*)data;
result.intdata = *pint;
data += sizeof(int);
const float* pflt = (const float*)data;
result.floatdata = *pflt;
data += sizeof(float);
...


Цитата(Severyanin @  18.12.2008,  05:10 Найти цитируемый пост)
в который прибор записывает такую же структуру


Цитата(Severyanin @  18.12.2008,  05:10 Найти цитируемый пост)
Вернее, часть информации записывается правильно, а переменные типа float получают дикие значения типа 1,56Е-44.

возможно формат чисел типа float у прибора отличается от PC-шного

Автор: Rififi 18.12.2008, 11:05
проверить что прибор выдает числа с плавающей точкой совместимые со стандартом IEEE 754, а не какую-то свою кривизну

Автор: UnrealMan 19.12.2008, 02:30
Цитата(Severyanin @  18.12.2008,  05:10 Найти цитируемый пост)
Явное копирование с помощью memset результата не дает. Вернее, часть информации записывается правильно, а переменные типа float получают дикие значения типа 1,56Е-44. Подскажите, пожалуйста, каким образом правильно скопировать данный массив в структуру 

Использовать memcpy вместо memset smile 

Автор: Severyanin 24.12.2008, 05:35
Всем спасибо, проблема решена +1 за советы))))

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