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
|
А что мешает просто приводить указатель к нужному типу. |
|
Valery_52 |
Отправлено: 24.10.2005, 13:10 |
|
Ученик-кочегар
Группа: Участник
Сообщений: 25
|
Удивительно, но вот это получилось.
char* bBuff;
unsigned short* wBuff;
........
bBuff = new char [256];
wBuff = (unsigned short*) bBuff;
........
delete []bBuff;
Вы имели ввиду это?
Спасибо!
Все таки интересно знать, как определяется union ?
|
|
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
в нескольких строках! |
|
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 |
|
Не зарегистрирован
|
Както вы все усложняете
А это "юнион надо определять также как и классы, используя класс vector" вообще "ни в какие ворота"
Вот РАБОЧИЙ пример, найдите отдичия от своего
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 |
Но это же и есть разновидность приведения. |
|
Георгий |
Отправлено: 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 |
Но это же и есть разновидность приведения. |
Но это Правильная разновидность приведения |
|