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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Копирование массива в структуру 
:(
    Опции темы
Severyanin
Дата 18.12.2008, 05:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Исследователь
**


Профиль
Группа: Участник
Сообщений: 554
Регистрация: 31.7.2007
Где: Россия, Омск

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



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


--------------------
"Звонким вереском скроются наши следы, и не вспомнят о них. Кто поверит нам, рыцарям павшей звезды из отвергнутых книг? Пусть в узоре времен ни стихов. ни имен, но напомнит забывшим их полуночный крик." Тэм Гринхилл
"Ужели суслик твоего коварства нагадит в плов доверья моего?". Л.Филатов 
PM MAIL WWW ICQ   Вверх
Andrey44
Дата 18.12.2008, 08:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1501
Регистрация: 4.12.2006
Где: На работе

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



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

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


--------------------
????? ??, ??????? ?????.  smile 
PM MAIL WWW ICQ   Вверх
Severyanin
Дата 18.12.2008, 08:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Исследователь
**


Профиль
Группа: Участник
Сообщений: 554
Регистрация: 31.7.2007
Где: Россия, Омск

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



делаю я пока так: есть массив
Код
 unsigned char buff[512];

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


--------------------
"Звонким вереском скроются наши следы, и не вспомнят о них. Кто поверит нам, рыцарям павшей звезды из отвергнутых книг? Пусть в узоре времен ни стихов. ни имен, но напомнит забывшим их полуночный крик." Тэм Гринхилл
"Ужели суслик твоего коварства нагадит в плов доверья моего?". Л.Филатов 
PM MAIL WWW ICQ   Вверх
Lazin
Дата 18.12.2008, 09:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

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



Код

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

struct mydata
{
int intdata;
float floatdata;
};

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


только нужно учитывать выравнивание smile 
PM MAIL Skype GTalk   Вверх
Severyanin
Дата 18.12.2008, 09:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Исследователь
**


Профиль
Группа: Участник
Сообщений: 554
Регистрация: 31.7.2007
Где: Россия, Омск

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



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


--------------------
"Звонким вереском скроются наши следы, и не вспомнят о них. Кто поверит нам, рыцарям павшей звезды из отвергнутых книг? Пусть в узоре времен ни стихов. ни имен, но напомнит забывшим их полуночный крик." Тэм Гринхилл
"Ужели суслик твоего коварства нагадит в плов доверья моего?". Л.Филатов 
PM MAIL WWW ICQ   Вверх
mrbrooks
Дата 18.12.2008, 10:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


трололомен
****


Профиль
Группа: Завсегдатай
Сообщений: 4259
Регистрация: 4.10.2006
Где: Дол Гулдур

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



Severyanin, а ты уверен что буфер из unsigned char даст верный float. Обычно аналоговые значения передаются signed char.
PM MAIL   Вверх
Lazin
Дата 18.12.2008, 10:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

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



можешь вручную распаковывать
Код


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-шного
PM MAIL Skype GTalk   Вверх
Rififi
Дата 18.12.2008, 11:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1254
Регистрация: 9.3.2008

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



проверить что прибор выдает числа с плавающей точкой совместимые со стандартом IEEE 754, а не какую-то свою кривизну
PM MAIL   Вверх
UnrealMan
Дата 19.12.2008, 02:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



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

Использовать memcpy вместо memset smile 
PM MAIL   Вверх
Severyanin
Дата 24.12.2008, 05:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Исследователь
**


Профиль
Группа: Участник
Сообщений: 554
Регистрация: 31.7.2007
Где: Россия, Омск

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



Всем спасибо, проблема решена +1 за советы))))


--------------------
"Звонким вереском скроются наши следы, и не вспомнят о них. Кто поверит нам, рыцарям павшей звезды из отвергнутых книг? Пусть в узоре времен ни стихов. ни имен, но напомнит забывшим их полуночный крик." Тэм Гринхилл
"Ужели суслик твоего коварства нагадит в плов доверья моего?". Л.Филатов 
PM MAIL WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1330 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


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

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