Как выделить из массива символов данные разных типов
От: Diamus  
Дата: 20.07.03 16:45
Оценка:
Есть строка например char[13];
нужно получить:
char[0] — char
char[1]..char[4] — integer
char[5]..char[12] — double

пробавал смещением, но с плавающей запятой смещение не могу сделать, подскажите хотя-бы идею.
Re: Как выделить из массива символов данные разных типов
От: IT Россия linq2db.com
Дата: 20.07.03 17:04
Оценка: 1 (1)
Здравствуйте, Diamus, Вы писали:

D>Есть строка например char[13];

D>нужно получить:
D>char[0] — char
D>char[1]..char[4] — integer
D>char[5]..char[12] — double

D>пробавал смещением, но с плавающей запятой смещение не могу сделать, подскажите хотя-бы идею.


Смещения фиксированные? Тогда объяви структуру:

#pragma pack(push,1)
struct mydata
{
    char   charData;
    int    intData;
    double doubleData;
};
#pragma pack(pop)

void foo(char arr[])
{
    mydata& data = *(mydata*)arr;

    data.doubleData = 1;
}
Если нам не помогут, то мы тоже никого не пощадим.
Re: Как выделить из массива символов данные разных типов
От: L2-Max Украина  
Дата: 21.07.03 06:57
Оценка:
Здравствуйте, Diamus, если внимательно почитать начала структуры данных, то там вы заметите некоторые правил.
Массив — конечная последовательность однотипных данных. Из этого следует, что если массив содержит данные разного типа, то это уже не массив.
L2-Max
Re: Как выделить из массива символов данные разных типов
От: LaptevVV Россия  
Дата: 21.07.03 12:07
Оценка:
Здравствуйте, Diamus, Вы писали:

D>Есть строка например char[13];

D>нужно получить:
D>char[0] — char
D>char[1]..char[4] — integer
D>char[5]..char[12] — double

D>пробавал смещением, но с плавающей запятой смещение не могу сделать, подскажите хотя-бы идею.

Надо использовать union

union ttt
{
   char a[13];
   struct B { char a; int b; double c; } b;
} A;

Правда, надо еще посмотреть, в каком порядке поля структуры компилятор создает. Тут могут быть некоторые проблемы с выравниванием (типа на границу слова, двойного слова и т.п.)

Можно еще попробовать new c наложением на уже существующую переменную. Примерно так (к сожалению, редко пользоватьсяприходится, поэтому детали подзабыл, но их легко найти по источникам)

#include <new>         // обязательно, а то работать не будет
...
char a[13];
struct B { char a; int b; double c; };
B *p = new(a)B;         // вот эдесь мог наврать, но помоему так.
           ^
           |






можно уточнить по Страуструпу
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Re: Как выделить из массива символов данные разных типов
От: deviv  
Дата: 21.07.03 12:20
Оценка:
А какова цель?
Просто хранить разнородные данные или добиться определенного расположения в памяти?
И о чем идет речь: о C или о С++?
WBR,
Влад Волосюк
Re: Как выделить из массива символов данные разных типов
От: Alpinist  
Дата: 21.07.03 13:10
Оценка:
Здравствуйте, Diamus, Вы писали:

D>Есть строка например char[13];

D>нужно получить:
D>char[0] — char
D>char[1]..char[4] — integer
D>char[5]..char[12] — double

D>пробавал смещением, но с плавающей запятой смещение не могу сделать, подскажите хотя-бы идею.


Есть мысль по поводу не корректности задачи.
Как я понял, есть строка и в ней перемешаны слова цифры и т.д. Разделить слова и цифры еще возможно (мама123), а вот разделить (123456.13) на int и double просто не возможно(однозначно). Может получится и 123 456.13 и 1 23456.13 и т.д.
Скорее всего должны присутствовать разделители (символы разделители (например пробел) ) или должны быть даны о размере и расположении слов и чисел. В этих случаях решение очевидно. В противном нужна более подробная детализация задачи.
Re: Как выделить из массива символов данные разных типов
От: Kluev  
Дата: 22.07.03 07:18
Оценка:
Здравствуйте, Diamus, Вы писали:

D>Есть строка например char[13];

D>нужно получить:
D>char[0] — char
D>char[1]..char[4] — integer
D>char[5]..char[12] — double

extern char buf[13];

char c = buf[0];
int i;
double d;
//Вот так:
memcpy( &i, buf + 1, sizeof(int) );
memcpy( &d, buf + 5, sizeof(double) );

А другого пути нет
Re[2]: Как выделить из массива символов данные разных типов
От: Aera Беларусь  
Дата: 22.07.03 09:54
Оценка:
Здравствуйте, Kluev, Вы писали:

K>char c = buf[0];

K>int i;
K>double d;
K>//Вот так:
K>memcpy( &i, buf + 1, sizeof(int) );
K>memcpy( &d, buf + 5, sizeof(double) );

K>А другого пути нет


Может быть необходимо что-то вроде этого:

template<typename T> T read_(char*& ptr) {
  return *reinterpret_cast<T*&>(ptr)++;

void foo() {
  ...
  char * pointer=buffer;
  ...
  short b=read_<short>(pointer);
  int a=read_<int>(pointer);
  double c=read_<double>(pointer);
}
}


С уважением,

Aera
--
RedApe
Re[3]: Как выделить из массива символов данные разных типов
От: e-Xecutor Россия  
Дата: 22.07.03 10:24
Оценка:
Hello, Aera!

K>> char c = buf[0];

K>> int i;
K>> double d;
K>> //Вот так:
K>> memcpy( &i, buf + 1, sizeof(int) );
K>> memcpy( &d, buf + 5, sizeof(double) );

K>> А другого пути нет


A> Может быть необходимо что-то вроде этого:


A>
 A> template<typename T> T read_(char*& ptr) {
 A>   return *reinterpret_cast<T*&>(ptr)++;

 A> void foo() {
 A>   ...
 A>   char * pointer=buffer;
 A>   ...
 A>   short b=read_<short>(pointer);
 A>   int a=read_<int>(pointer);
 A>   double c=read_<double>(pointer);
 A> }
 A> }


Если это не планируется портировать на отличные от IA32 платформы,
то можно, иначе memcpy only.

--
Best regards,
Konstantin.
Posted via RSDN NNTP Server 1.7 beta
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.