Форум программистов, компьютерный форум CyberForum.ru

C++

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 25, средняя оценка - 4.60
Izual
93 / 118 / 6
Регистрация: 13.11.2012
Сообщений: 1,537
#1

Можно ли заменить обращение к Union без указания типа переменной? - C++

07.03.2014, 08:19. Просмотров 3170. Ответов 53
Метки нет (Все метки)

Можно ли заменить обращение к Union без указания типа переменной?(т.е. без .i .f .str, а просто к "data")
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include <stdio.h>
#include <string.h>
 
union Data
{
   int i;
   float f;
   char  str[20];
};
 
int main( )
{
   union Data data;        
 
   data.i = 10;
   printf( "data.i : %d\n", data.i);
   
   data.f = 220.5;
   printf( "data.f : %f\n", data.f);
   
   strcpy( data.str, "C Programming");
   printf( "data.str : %s\n", data.str);
 
   return 0;
}
Что для этого надо сделать? Или есть под мои нужды альтернатива?

Добавлено через 7 минут
Т.е. чтоб при последующем использовании можно было бы сделать так:
C++
1
Lstrcat(data,"Empty");
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.03.2014, 08:19     Можно ли заменить обращение к Union без указания типа переменной?
Посмотрите здесь:

Как считать матрицу из файла без указания размерности? C++
C++ добавление в контейнер без указания типов данных?
Запуск MapInfo без указания пути в С++ Builder C++ Builder
C++ Есть две переменные типа int. Обменять их значения без использования третьей переменной
Как в переменной строкового типа заменить все вхождения одного символа на другой? C++
Можно ли использовать параметр шаблона без типа? C++
C++ Объединение нескольких массивов в одну область памяти Union и прямое обращение по имени
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Aloir
216 / 216 / 13
Регистрация: 17.12.2010
Сообщений: 689
07.03.2014, 15:40     Можно ли заменить обращение к Union без указания типа переменной? #2
Можно ли заменить обращение к Union без указания типа переменной?(т.е. без .i .f .str, а просто к "data")
как мне известно, нет..
union остался нам со старых времен, когда люди были ограничены в памяти, сейчас с памятью проблем особо нету.. очень редко где его реально нужно применять. Лучше оградить себя от использования его, т.к это достаточно опасная штука, надо постоянно помнить что находится в этом кусочке памяти иначе может быть очень плохо..

Лучше используйте структуры. имхо.
Izual
93 / 118 / 6
Регистрация: 13.11.2012
Сообщений: 1,537
07.03.2014, 19:26  [ТС]     Можно ли заменить обращение к Union без указания типа переменной? #3
Aloir, мне нужен именно Union, как альтернатива VARIANT'у, у которого к сожалению я не нашёл несколько типов, которые мне нужны. Это для динамически задаваемых перменных. Структура не может динамический тип поддерживать, поэтому пришлось делать через Union. А тип - ну естественно в использовании буду делать структуру с вложенным union, а в одном из полей структуры enum тип, для автоопр. данных.

Ещё кстати один вопрос возник, связанный с union, его же можно использовать как конвертатор типа(как функцию itoa например). Мне вот нужно прочесть строку символов, которая должна интерпритироваться в DWORD тип.
В winuser есть список переменных DWORD типа, например при использовании функции CreateWindow будет нужен флаг:
C++
1
#define WS_VISIBLE  0x10000000
Вот интересно, если я в файле напишу "WS_VISIBLE", и из union переменной вытащю 16-ричное значение типа DWORD, то прокатит ли... Или это прям писец танец с бубном и можно сделать проще?
StailGot
27 / 22 / 6
Регистрация: 25.08.2013
Сообщений: 41
07.03.2014, 22:23     Можно ли заменить обращение к Union без указания типа переменной? #4
Цитата Сообщение от Izual Посмотреть сообщение
Что для этого надо сделать? Или есть под мои нужды альтернатива?
Можно реализовать оператор "приведения типа". Но тогда для функций типа
printf( "data.str : %s\n", data );
придется подсказывать явно, какой тип нужен.

Пример:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
#include <iostream>
 
using namespace std;
 
union data_t
{
  int i;
  float f;
  char str[42];
 
  operator int & ()
  {
    return i;
  }
 
  operator float & ()
  {
    return f;
  }
 
  operator char * ()
  {
    return str;
  }
 
};
 
void func( float val )
{
  cout << "func data.f: " << val << endl;
}
 
int main()
{
  data_t data;
 
  ( int )data = 10;
  printf( "data.i : %d\n", (int)data );
 
  ( float )data = 220.5f;
  printf( "data.f : %f\n", (float)data );
  func( data );
 
  sprintf( data, "data" );
  printf( "data.str : %s\n", (char *)data );
 
}

Тоже самое, более универсальное, хотя и опаснее:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
#include <iostream>
 
using namespace std;
 
union data_t
{
  int i;
  float f;
  char str[42];
 
  template<typename _Ty>
  operator _Ty * ()
  {
    return ( _Ty * )this;
  }
  template<typename _Ty>
  operator _Ty & ()
  {
    return *( _Ty * )this;
  }
 
  template<typename _Ty>
  _Ty operator=( _Ty val )
  {
    return ( _Ty ) * this = val;
  }
};
 
void func( float val )
{
  cout << "func data.f: " << val << endl;
}
 
int main()
{
  data_t data;
 
  data = 10;
  printf( "data.i : %d\n", (int)data );
 
  data = 220.5f;
  printf( "data.f : %f\n", (float)data );
  func( data );
 
  sprintf( data, "data" );
  printf( "data.str : %s\n", (char *)data );
 
  getchar();
}
ValeryS
Модератор
6482 / 4948 / 455
Регистрация: 14.02.2011
Сообщений: 16,389
07.03.2014, 22:58     Можно ли заменить обращение к Union без указания типа переменной? #5
Цитата Сообщение от Aloir Посмотреть сообщение
union остался нам со старых времен, когда люди были ограничены в памяти, сейчас с памятью проблем особо нету.. очень редко где его реально нужно применять. Лучше оградить себя от использования его, т.к это достаточно опасная штука, надо постоянно помнить что находится в этом кусочке памяти иначе может быть очень плохо..
что за глупость
Цитата Сообщение от Aloir Посмотреть сообщение
Лучше используйте структуры. имхо.
ты считаешь что это одно и тоже?
что у них общего кроме внешнего вида ?
union придуман для разного представления одних и тех же данных
например
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
struct MyPacet
{
short ID_Minor;
short ID_Major;
int size;
int data;
}
 
union uMyData
{
MyPacet pacet_str;
int ID;
unsigned char buf[sizeof(MyPacet)];
 
}
теперь я могу загнать сюда пакет байтов, например с компорта, а считать их в виде структуры

или еще пример
написать все байты входящие в int

C++
1
2
3
4
5
6
7
8
9
10
union un_int
{
int a;
unsigned char buf[4];
}
 
un_int u1;
 
u1.a=12345;
printf(" %x %x %x %x",u1.buf[0],u1.buf[1],u1.buf[2],u1.buf[3]);
Цитата Сообщение от Izual Посмотреть сообщение
Можно ли заменить обращение к Union без указания типа переменной?(т.е. без .i .f .str, а просто к "data")
нет не можешь, это как к структуре обращаться только по имени, программа должна знать в каком виде тебе предоставить данные
Цитата Сообщение от Izual Посмотреть сообщение
Или есть под мои нужды альтернатива?
а вчем нужда то?
сдается мне тебе не union нужен

Добавлено через 5 минут
Цитата Сообщение от Izual Посмотреть сообщение
Ещё кстати один вопрос возник, связанный с union, его же можно использовать как конвертатор типа(как функцию itoa например). Мне вот нужно прочесть строку символов, которая должна интерпритироваться в DWORD тип.
нет нельзя
union ничего не конвертирует он просто представит в другом виде

например
C++
1
2
3
4
5
union u1
{
char str[4];
int i;
}
как то записали в str "123"
в памяти будут лежать вот такие данные 0х31 0х32 0х33 0х00
соответственно int их интерпретирует как 0х00333231 =3355185 это не то что хотелось бы получить

Добавлено через 2 минуты
Цитата Сообщение от Izual Посмотреть сообщение
Вот интересно, если я в файле напишу "WS_VISIBLE", и из union переменной вытащю 16-ричное значение типа DWORD, то прокатит ли...
WS_VISIBLE это макрос который имеет вполне конкретное значение
Izual
93 / 118 / 6
Регистрация: 13.11.2012
Сообщений: 1,537
07.03.2014, 23:02  [ТС]     Можно ли заменить обращение к Union без указания типа переменной? #6
StailGot, думаю что в конечном итоге будет проще, через структуру:
C++
1
2
3
4
5
6
7
8
9
10
11
typedef {INT, STR, FLOAT} VTP;
struct Variable
{
    VTP v;
    union {
    int i;
    float f;
    string c;
    }d;
};
Variable *var;
Думаю по типу сделать привязку в переменную..
Да вот типа такого примера и надо, токо чуть ещё оптимизировать)
А классы не, я без них. Только проверенными методами Си методами..
ValeryS
Модератор
6482 / 4948 / 455
Регистрация: 14.02.2011
Сообщений: 16,389
07.03.2014, 23:05     Можно ли заменить обращение к Union без указания типа переменной? #7
Izual,
скажи зачем тебе union?
ты вообще представляешь что это такое?
что общего у int и float кроме размера?
Izual
93 / 118 / 6
Регистрация: 13.11.2012
Сообщений: 1,537
07.03.2014, 23:14  [ТС]     Можно ли заменить обращение к Union без указания типа переменной? #8
WS_VISIBLE это макрос
ну да, а я как то могу к нему динамически обратиться? ну допустим у меня название в str виде, или ещё проще методами?
скажи зачем тебе union?
представить данные в максимально удобной форме в виде одной переменной, как это в HTML, на примере VARIANT, только там не все виды которые мне нужны..(DWORD, FILE, HWND, и т.п)
что общего у int и float кроме размера?
будет - переменная, а к ней по типу enum будет крепиться функция получения значения из конкретного типа.
ValeryS
Модератор
6482 / 4948 / 455
Регистрация: 14.02.2011
Сообщений: 16,389
07.03.2014, 23:33     Можно ли заменить обращение к Union без указания типа переменной? #9
Цитата Сообщение от Izual Посмотреть сообщение
ну да, а я как то могу к нему динамически обратиться?
никак
макрос это псевдоним
на этапе компиляции уже никакого макроса не будет будут конкретные значения
препроцессор постарается
Цитата Сообщение от Izual Посмотреть сообщение
представить данные в максимально удобной форме в виде одной переменной,
когда? в период написания программы? в период компиляции? в период выполнения?
Цитата Сообщение от Izual Посмотреть сообщение
как это в HTML,
есть одна маленькая разница HTML это интерпретатор, а Си это компилятор
Цитата Сообщение от Izual Посмотреть сообщение
будет - переменная, а к ней по типу enum будет крепиться функция получения значения из конкретного типа.
примерно покажи код как ты будешь с этим работать?
Izual
93 / 118 / 6
Регистрация: 13.11.2012
Сообщений: 1,537
08.03.2014, 01:14  [ТС]     Можно ли заменить обращение к Union без указания типа переменной? #10
никакого макроса не будет
В процессе выполнения программы, когда будут динамически создаваться переменные и как в этом примере, должен принять значение этого макроса.. Хотя в принципе, я его в "библиотеку" засуну и всего делов.
в период написания программы? в период компиляции? в период выполнения?
3в1 для меня лично, а на ваш вкус - вы сами себе выбирайте.
HTML это интерпретатор, а Си это компилятор
компилятор - это у меня, а в готовой программе будет интерпритатор, как ни крути даже простое чтение файла - уже интерпритация.
примерно
C++
1
cout << "First element  0: " << var[0].c << endl;
ValeryS
Модератор
6482 / 4948 / 455
Регистрация: 14.02.2011
Сообщений: 16,389
08.03.2014, 01:39     Можно ли заменить обращение к Union без указания типа переменной? #11
Цитата Сообщение от Izual Посмотреть сообщение
В процессе выполнения программы, когда будут динамически создаваться переменные и как в этом примере, должен принять значение этого макроса.. Хотя в принципе, я его в "библиотеку" засуну и всего делов.
нет при исполнении никаких макросов
Цитата Сообщение от Izual Посмотреть сообщение
cout << "First element *0: " << var[0].c << endl;
и что ?
откуда cout узнает в каком виде выводить?
Цитата Сообщение от Izual Посмотреть сообщение
компилятор - это у меня, а в готовой программе будет интерпритатор,
это как это? ты что свой язык программирования пишешь
Цитата Сообщение от Izual Посмотреть сообщение
как ни крути даже простое чтение файла - уже интерпритация.
ты бы хоть узнал для начала что эти два красивых слова означают

Добавлено через 2 минуты
Цитата Сообщение от Izual Посмотреть сообщение
В процессе выполнения программы, когда будут динамически создаваться переменные
это как ты себе представляешь?
динамически может выделятся память
а переменные как ты задал в программе так они и есть
может ты приведения типов имеешь ввиду?
Aloir
216 / 216 / 13
Регистрация: 17.12.2010
Сообщений: 689
08.03.2014, 02:03     Можно ли заменить обращение к Union без указания типа переменной? #12
C++
1
2
ты считаешь что это одно и тоже?
что у них общего кроме внешнего вида ?
ValeryS, Нет, конечно это не одно и тоже.
да, про чтение c компорта и т.п я что-то в тот момент не подумал.. мой косяк)

согласен на 100% в этом случае union удобен, а в других случаях..,ну возможно при работе с битами,а так.. я врятли бы его где использвал.. скорее бы выбрал структуру.

но мое имхо, лучше его стараться не использоваться, достаточно специфическая вещь.. (помню пришлось искать ошибку в проекте... union потрепал нервы.., но это другая история), трудно потом потом ошибки искать..

да тем более как я понял автору нужен VARIANT, лучше уже тогда пусть используется из буста эту фигню.

имхо: если автор хочет сделать что-то типа VARIANT, пускай лучше использует структуру и функтор для обращение, буде почти как он хотел.
ValeryS
Модератор
6482 / 4948 / 455
Регистрация: 14.02.2011
Сообщений: 16,389
08.03.2014, 02:23     Можно ли заменить обращение к Union без указания типа переменной? #13
Цитата Сообщение от Aloir Посмотреть сообщение
этом случае union удобен, а в других случаях..,
так так же как и все остальное, иногда структуры удобней иногда классы, хотя это ближайшие родственники
просто видать тебе не попадали такие задачи
Цитата Сообщение от Aloir Посмотреть сообщение
(помню пришлось искать ошибку в проекте... union потрепал нервы.., но это другая история),
бывает и не такое , я вчера полдня убил. прога простейшая помаргушка на АТмеге не хочет скорость менять и все
оказалось вмето -- поставил++

Цитата Сообщение от Aloir Посмотреть сообщение
если автор хочет сделать что-то типа VARIANT, пускай лучше использует структуру и функтор для обращение,
так я никак не могу вытянуть из автора, что он хочет
хотя бы интерфейс
ежу понятно что данные в памяти интерпретировать можно как угодно
можно вообще выделять память в указатель типа void* а потом приводи куда хочешь
но как работать то?
например введу я 100 что это? int, float, string
и в друг друга то они не конвертятся
Izual
93 / 118 / 6
Регистрация: 13.11.2012
Сообщений: 1,537
08.03.2014, 03:33  [ТС]     Можно ли заменить обращение к Union без указания типа переменной? #14
откуда cout узнает в каком виде выводить?
да, согласен, пример был не удачным, хотя мне именно так и нужно. Ну это что то типа того как я могу создать ENUM тип данных и переменным этого типа обращяться как к INT например.(без лишнего синтаксиса ".с")
C++
1
printf( "data.i : %d\n", (int)data );
так лучше конешно пример с привидением типа, однако могу ли я динамически приводить тип? Т.е. по условию что переменная "Variable type == .."
динамически может выделятся память
.. для переменных. ~ ~ Игра слов.
Aloir,
бы выбрал структуру
так и получается, Union в структуре. Структура - хранилище переменных. Аргумент1 - тип(enum T), Аргумент2 - Union.
Т.е. когда выделяеш память, сразу задаёш тип и заполняеш новую переменную.
При использовании переменной вести лог выполняемых операций и исп. GetLastError для вывода ошибок.
ValeryS
Модератор
6482 / 4948 / 455
Регистрация: 14.02.2011
Сообщений: 16,389
08.03.2014, 09:12     Можно ли заменить обращение к Union без указания типа переменной? #15
Цитата Сообщение от Izual Посмотреть сообщение
так и получается, Union в структуре. Структура - хранилище переменных. Аргумент1 - тип(enum T), Аргумент2 - Union.
Т.е. когда выделяеш память, сразу задаёш тип и заполняеш новую переменную.
вот и покажи как ты хочешь это сделать
как это должно выглядеть в коде?
я пока не могу понять
Izual
93 / 118 / 6
Регистрация: 13.11.2012
Сообщений: 1,537
08.03.2014, 17:46  [ТС]     Можно ли заменить обращение к Union без указания типа переменной? #16
ValeryS, первая страница, пост №6.
Так в общем, мне нужно теперь оптимизировать пост #4:
C++
1
2
3
4
operator int & ()
  {
    return i;
  }
Либо универсальный оператор, либо... как то по компактнее, а то чую, сделаю 50 типов, а кода будет на 100 листов, только лишь операторов этих)
ValeryS
Модератор
6482 / 4948 / 455
Регистрация: 14.02.2011
Сообщений: 16,389
08.03.2014, 18:02     Можно ли заменить обращение к Union без указания типа переменной? #17
Цитата Сообщение от Izual Посмотреть сообщение
ValeryS, первая страница, пост №6.
и что я должен увидеть?
я тебя спрашиваю как ты хочешь пользоваться этим своим типом?
не надо мне вывод на экран приводить
всю жизнь
создание переменной, присвоение значения, работа с ней, удаление,
например как ввести значение с клавиатуры?
Izual
93 / 118 / 6
Регистрация: 13.11.2012
Сообщений: 1,537
08.03.2014, 20:52  [ТС]     Можно ли заменить обращение к Union без указания типа переменной? #18
ValeryS,
создавать с помощью оператора new, как и в случае с структурой.
пример использования переменной:
C++
1
lstrcpy(var.v.str,"Переменная№1");
Теперь, давайте закругляйтесь с вашими "как и для чего", я тут не доказываю ничего.(не устраивайте балаган) Смотрящие видят.
Мне нужно в итоге чтоб я обращялся к переменной без .str
для чего как я понял надо оператор сделать, и приводить тип "(int)":
C++
1
lstrcpy((string)var.v,"Переменная№1");
без типа или вызов типа сделать как то динамически опять же(ну или алгоритмо зависимым от типа var.t)

Добавлено через 4 минуты
п.с. вообще я не понимаю, зачем писать или приводить тип, если функция требует char или int тип аргумена, так мог бы автоматом направить на нужный. Проверки делать через тип(var.t)
ValeryS
Модератор
6482 / 4948 / 455
Регистрация: 14.02.2011
Сообщений: 16,389
08.03.2014, 21:19     Можно ли заменить обращение к Union без указания типа переменной? #19
Цитата Сообщение от Izual Посмотреть сообщение
Теперь, давайте закругляйтесь с вашими "как и для чего", я тут не доказываю ничего.
Да пожалуйста
Цитата Сообщение от Izual Посмотреть сообщение
п.с. вообще я не понимаю,
Вот они ключевые слова
т.е как и что делать не понимаешь,но делаешь
Что ж вперед
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.03.2014, 22:18     Можно ли заменить обращение к Union без указания типа переменной?
Еще ссылки по теме:

Возможно ли обращение к переменной с использованием значения строковой переменной? C++ Builder
Заменить символы в переменной типа String C++ Builder
C++ Цикл for без указания шага
Динамический массив без явного указания размера C++
Массив элементов типа Union C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Izual
93 / 118 / 6
Регистрация: 13.11.2012
Сообщений: 1,537
08.03.2014, 22:18  [ТС]     Можно ли заменить обращение к Union без указания типа переменной? #20
ValeryS, ты какой то странный. Я для того и создал тему, чтобы найти инфу по инетересующему вопросу, тем более что как использовать в обычных условиях union это понятно. Но тут не тривиальный вопрос.
Не понимаю уже вопросов исполнения, так сказать синтаксиса или внутренних процедур. Естественно, такие вещи опытом набиваются, потому как обилием инфы о экстра вопросах даже МСДН не пишет.
Yandex
Объявления
08.03.2014, 22:18     Можно ли заменить обращение к Union без указания типа переменной?
Ответ Создать тему
Опции темы

Текущее время: 07:42. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru