Здравствуйте, Diamus, если внимательно почитать начала структуры данных, то там вы заметите некоторые правил.
Массив — конечная последовательность однотипных данных. Из этого следует, что если массив содержит данные разного типа, то это уже не массив.
L2-Max
Re: Как выделить из массива символов данные разных типов
Здравствуйте, 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: Как выделить из массива символов данные разных типов
Здравствуйте, 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: Как выделить из массива символов данные разных типов
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.