C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
Инициализация union
Valery_52
Отправлено: 24.10.2005, 08:48


Ученик-кочегар

Группа: Участник
Сообщений: 25



Доброго времени суток!
Есть DLL стороннего производителя с динамической загрузкой, которая в буфер char * Buff [ ] пишет и из него читает байты. Мне необходимо писать и читать этот буфер словами ( unsigned short). Размер буфера динамически меняется. Можно былобы сразу объявить:
union uBuf {
char Byte[512];
unsigned short Word[256];
};
Но такой вариант, мне не совсем нравится. Хотелось бы сделать инициализацию через new и delete, что бы можно было освободить память после использования.
Описываю так:
union uBuf {
char Byte[ ];
unsigned short Word[ ];
};
А вот как проинициализировать не знаю, все перепробовал и перерыл, но ни чего ненашел для инициализации union.
Подскажите , как динамически выделить память под union?
Есть ли элегантное решение для такой задачи?
AVC
Отправлено: 24.10.2005, 09:03


Ветеран

Группа: Модератор
Сообщений: 1583



А что мешает просто приводить указатель к нужному типу. smile.gif
Valery_52
Отправлено: 24.10.2005, 13:10


Ученик-кочегар

Группа: Участник
Сообщений: 25



Удивительно, но вот это получилось.
char* bBuff;
unsigned short* wBuff;
........
bBuff = new char [256];
wBuff = (unsigned short*) bBuff;
........
delete []bBuff;
Вы имели ввиду это?
Спасибо!
Все таки интересно знать, как определяется union ?
smile.gif
Guest
Отправлено: 24.10.2005, 13:34


Не зарегистрирован







QUOTE

Все таки интересно знать, как определяется union ?

union TMyUni{char ca[256]; short int sa[128];};

TMyUni u1; ShowMessage(sizeof(u1));

TMyUni *pu2 = new TMyUni;;
...
delete pu2;
Valery_52
  Отправлено: 25.10.2005, 10:09


Ученик-кочегар

Группа: Участник
Сообщений: 25



Гостю:
на это объявление BCB6 выдаёт
E2141 Declaration syntax error Compiler error
в нескольких строках! ohmy.gif
Guest
Отправлено: 25.10.2005, 10:34


Не зарегистрирован







2Valery_52
А если строку union TMyUni... вынести за пределы функции, а остальные строки оставить внутри?

PS. BCB5 не дает ни одного предупреждения или ошибки.
Valery_52
Отправлено: 26.10.2005, 10:33


Ученик-кочегар

Группа: Участник
Сообщений: 25



Что -то я неверно понимаю. Я делаю так:
в .Н
union uBuff {
char uByte[256];
short int uWord[128];
};
В хайдер файле я не должен указывать размер ( 256 и 128).
Размер будет определяться в процессе работы, в зависимости
от количества полученных данных. Но если, пусть также оставлю и добавлю в файл .cpp
uBuff * ub = new uBuff;
ub->uByte[0] = 25;
ub->uByte[1] = 25;
ub->uWord[1] = 12345;
...................
delete ub;
Компилятор выдает: Неизвестная переменная ub .
Убрав строку delete ub; и остановив программу на строке
ub->uWord[1] = 12345; , я вижу, что ub =0 и uByte[] =0.
Мне думается, что юнион надо определять также как и классы,
используя класс vector.

Guest
Отправлено: 26.10.2005, 11:01


Не зарегистрирован







Както вы все усложняете smile.gif
А это "юнион надо определять также как и классы, используя класс vector" вообще "ни в какие ворота" biggrin.gif
Вот РАБОЧИЙ пример, найдите отдичия от своего
CODE

union TMyUni{char ca[256]; short int sa[129];};

void __fastcall TForm1::BitBtn1Click(TObject *Sender)
{
TMyUni u1; ShowMessage(sizeof(u1));

TMyUni *pu2 = new TMyUni;;

pu2->ca[0] = '0';
pu2->ca[1] = '1';
ShowMessage(pu2->sa[0]);

delete pu2;
return;
}


А если вы хотите что бы 256 было динамическим, то вам нужен юнион не статических массивов, а указателей, что эквивалентно простому приведению типа указателя.
gvg
Отправлено: 26.10.2005, 12:22


Машинист паровоза

Группа: Участник
Сообщений: 222



Что-то я не пойму, к чему весь сыр-бор. AVC сразу написал:
QUOTE

А что мешает просто приводить указатель к нужному типу


Преобразуйте, и работайте (пример)
CODE

 char *buff = "00112233445566";
 unsigned short *w = (unsigned short*)buff;
 unsigned short us = w[3];
Valery_52
Отправлено: 27.10.2005, 09:48


Ученик-кочегар

Группа: Участник
Сообщений: 25



Для gvg: да я делал преобразование типов, у меня все получилось, я же об этом сообщал. Но мне намного удобнее работать с union (буфер заполняется байтами, а читается различными типами переменных со знаком и без знака), и хотелось бы, что бы память выделялась динамически.
Для Guest:
Усложняю, потому что знаний и опыта мало. Если не затруднит, ваш
пример напишите для
"то вам нужен юнион не статических массивов, а указателей,"
Благодарен за соучастие.
AVC
Отправлено: 28.10.2005, 14:18


Ветеран

Группа: Модератор
Сообщений: 1583



QUOTE

пример для "то вам нужен юнион не статических массивов, а указателей,"

Например так
QUOTE

union TU1 {char *cp; __int16 *ip;};

void __fastcall TF_Main::BitBtn1Click(TObject *Sender)
{
int len = 100;
TU1 u1;
u1.cp = new char[len];
u1.cp[0] = 0;
u1.cp[1] = 1;
ShowMessage(IntToHex(u1.ip[0],4));
delete[] u1.cp;
}

Но лучше это оформить в класс.,
а еще лучше просто приводить указатели.
Георгий
Отправлено: 29.10.2005, 03:11


Почетный железнодорожник

Группа: Модератор
Сообщений: 874



QUOTE (AVC @ 28/10/2005, 15:18)
а еще лучше просто приводить указатели.

а ещё лучше использовать static_cast && reinterpret_cast
AVC
Отправлено: 31.10.2005, 09:04


Ветеран

Группа: Модератор
Сообщений: 1583



QUOTE (Георгий @ 29/10/2005, 02:11)
QUOTE (AVC @ 28/10/2005, 15:18)
а еще лучше просто приводить указатели.

а ещё лучше использовать static_cast && reinterpret_cast

Но это же и есть разновидность приведения. smile.gif
Георгий
Отправлено: 31.10.2005, 21:00


Почетный железнодорожник

Группа: Модератор
Сообщений: 874



QUOTE (AVC @ 31/10/2005, 10:04)
QUOTE (Георгий @ 29/10/2005, 02:11)
QUOTE (AVC @ 28/10/2005, 15:18)
а еще лучше просто приводить указатели.

а ещё лучше использовать static_cast && reinterpret_cast

Но это же и есть разновидность приведения. smile.gif

Но это Правильная разновидность приведения cool.gif

Вернуться в Вопросы программирования в C++Builder