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

C++

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

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

07.03.2014, 08:19. Просмотров 3219. Ответов 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 и прямое обращение по имени
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Izual
94 / 119 / 6
Регистрация: 13.11.2012
Сообщений: 1,537
13.03.2014, 11:09  [ТС]     Можно ли заменить обращение к Union без указания типа переменной? #41
SatanaXIII, вопрос был сформулирован ещё на первой странице. Первые ответившие сильно помогли разобраться, потом "понаехали" лица с вопросами "зачем и почему", начался полный оффтоп. Тут опять я виноват в том что люди не видят вопроса?..
А если вы как модератор решили выполнять свои обязанности, то "лишь бы что написать" - это не выход, читайте внимательнее что написано на первых двух страницах. Решили левого найти - если это у вас лично такой выход из складывающихся ситуаций, то чтож, бог вам судья.(или владелец сайта)
Я лично тут обсуждаю конкретный вопрос о union. И он до сих пор открыт.
Верно, это уже не первая тема в которой начинаются офф топ сообщения, видимо потому что кто то не читает цель темы, а кто то тешит своё самолюбие фразами "посмотрите у него всего 2 сантиметра".
Цитата Сообщение от SatanaXIII Посмотреть сообщение
вы первый начали лезть в узкое место торцевой части морского огурца.
Вы когда пишите подобное, приводите конкретный пост и фразу, которая стала причиной ухода от темы.
Цитата Сообщение от SatanaXIII Посмотреть сообщение
по теме, критика
Была бы по теме, хотя бы немного - был бы разговор, но тут уже балаган развели и начали меряться "кто круче".
Цитата Сообщение от SatanaXIII Посмотреть сообщение
не стоит вообще ни с кем разговаривать?
Если не по теме - то конешно не стоит, а тот кто начинает оффтопить - провоцирует. (между прочим провокация - уголовно наказуема)
Цитата Сообщение от SatanaXIII Посмотреть сообщение
ну хочется человеку сократить пять букв
Если вам в голову пришло только это, то это не значит что я по другому не могу использовать то чего я хочу. Не меряйте по себе. А объяснять для чего мне нужно данное - второй раз запостил elivin на ссылку о предыдущей теме, где тот кому надо было - прочли и поняли, что я делаю интерпритатор, да и тут уже звучало это слово. То что я "якобы полез слишком далеко и мой уровень знаний не соответствует поставленной задаче" - так тут всё просто: не хочеш помогать - уйди из темы, но нет ведь надо остановиться, написать ерунду какую то, растянуть тему до 100 страниц, запутать всех окончательно и ещё с недовольством уйти... Не этично.

Так, по теме. Мне до сих пор не понятно, почему же функции, требующие определённый тип аргумента не могут "сами" выбрать этот тип.(из структуры с union варьирующейся переменной~) Внятного ответа я не услышал.
SatanaXIII
Супер-модератор
Эксперт С++
5589 / 2623 / 239
Регистрация: 01.11.2011
Сообщений: 6,448
Завершенные тесты: 1
13.03.2014, 11:35     Можно ли заменить обращение к Union без указания типа переменной? #42
Izual, смотрите, сейчас я подам пример как правильно поступать в таких ситуациях:
 Комментарий модератора 
Izual, 3.1, 3.2, 6.5, 6.6 - последнее предупреждение.

Видели? Я не втянулся ни в какую демагогию, вне зависимости от того принял ли я ваши слова на свой счет или нет, никакого оффтопа и пространственных рассуждений, никакого перехода на личности.
Старайтесь быть более спокойным и не считайте априори, что каждое кем-то написанное слово имеет целью вас задеть.
Спасибо за ваше терпение и понимание.
DrOffset
6864 / 4075 / 928
Регистрация: 30.01.2014
Сообщений: 6,870
13.03.2014, 11:38     Можно ли заменить обращение к Union без указания типа переменной? #43
Цитата Сообщение от Izual Посмотреть сообщение
Мне до сих пор не понятно, почему же функции, требующие определённый тип аргумента не могут "сами" выбрать этот тип.(из структуры с union варьирующейся переменной~) Внятного ответа я не услышал.
Как я уже писал:
Цитата Сообщение от DrOffset Посмотреть сообщение
union в Си слишком базовая структура, чтобы к ней можно было применять высокоуровневую (в смысле высокого уровня абстракции) логику
Выражаясь другими словами, union прост настолько, насколько это возможно. Поэтому он и не делает этого. Такова философия языка.
При желании получить более "умное" поведение от union, нужно будет написать это самому или найти библиотеку, которая это делает. Это тоже философия языка.
Izual
13.03.2014, 11:56  [ТС]
  #44

Не по теме:


Пункт 3.1 - Уважать и убийцу можно.(но нужно ли?) Но даже не смотря на то что у меня сильное негодование ещё с 11 и 13 поста возникать стало - я не стал оскорблять автора, я ему корректно сказал прекратить задавать не нужные вопросы из за которых теряется суть темы и она уходит в оффтоп.
Пункт 3.2 - Где вы конфликты видите? Я кореекто сказал не задавать не нужных вопросов и не оффтопить - или я не имею право сделать это в своей теме?(мне что делать повторную тему из за того что начинается балаган на 3 страницы?)
Пункт 6.5 - написано "касательно прямых обязанностей", а про "огурец" - это было ваше личное мнение, не касающееся обязанностей.
Пункт 6.6 -

Цитата Сообщение от Izual Посмотреть сообщение
ну хочется человеку сократить пять букв
а это не втягивание в демогогию?.. как то вы странно интерпритируете обсуждаемый вопрос касающейся темы(именно темы!) На что я естественно ответил - что то что вы думаете о "пяти буквах" это не так, я пояснил и это пояснение касается темы.
Цитата Сообщение от SatanaXIII Посмотреть сообщение
целью вас задеть
А я так и не думаю. Я пояснил, что не уважение к автору темы было порождено оффтоп сообщениями, к тому же потом подкрепилось тем что один из постеров не читавший первые две страницы с "бухты барахты" что то написал. С этим он сам согласился.
Цитата Сообщение от SatanaXIII Посмотреть сообщение
Старайтесь быть более спокойным
Каждый заслуживает то чего он добивается, я вот вопрос с union тут поднял, естественно я хочу ответы по теме, я же показал ещё в первом посте что я хочу:
Цитата Сообщение от Izual Посмотреть сообщение
Lstrcat(data,"Empty");
чтоб без указания типа использовалась переменная. А мне начали задавать дурацкий вопрос "как использовать", ну это же "слышу звон да не знаю где он".

DrOffset
6864 / 4075 / 928
Регистрация: 30.01.2014
Сообщений: 6,870
23.03.2014, 17:02     Можно ли заменить обращение к Union без указания типа переменной? #45
Цитата Сообщение от Izual Посмотреть сообщение
Ну так он же реализовал классами(и как я понимаю вектором), union тут не причём, суть в способе реализации, способ через структуры(коим я воспользуюсь) или же через классы и векторы(о котором и была речь).
Он реализовал через union, просто добавив туда шаблонные методы. Суть в том, что union сам по себе представляет опасность, потому что позволяет хранить разнородные типы без проверки на совместимость. Поэтому добавив туда шаблоны (которые С++ templates) без проверок, мы еще больше усугубляем ситуацию. Однако, если сделать все правильно, то его способ, но чуть доработанный окажется более безопасным, чем способ без шаблонов. Поэтому сам по себе способ реализации тут не причем, речь идет о правильности. Центральная мысль, которую я пытаюсь до тебя донести: инструмент (в данном случае шаблоны) не влияет на качество, на качество влияет только исполнитель (программист).
Izual
94 / 119 / 6
Регистрация: 13.11.2012
Сообщений: 1,537
23.03.2014, 17:13  [ТС]     Можно ли заменить обращение к Union без указания типа переменной? #46
Цитата Сообщение от DrOffset Посмотреть сообщение
без проверки на совместимость
Я же привёл пример(кода) "где то тут", что union будет как дочерний у структуры, в которой будет enum поле с определителем типа.
Я бы предпочёл без шаблонов - он мне мешает: синтаксисом и тем что я внутрь шаблона не смотрю, а так как делаю интерпритатор, то будет в итоге проверка на всё и полное логирование в файл всех операций - а для этого шаблон не пойдёт, т.к. если ошибка будет в шаблоне(ну вдруг), то я не смогу логировать шаблонную внутренность выполнения операции.
Цитата Сообщение от DrOffset Посмотреть сообщение
Центральная мысль, которую я пытаюсь до тебя донести: инструмент (в данном случае шаблоны) не влияет на качество
У меня дед - плотник, вот как ни кто я то уж знаю о важности выбора инструмента.

В общем по union'у у меня до сих пор остался не решённый вопрос:
почему я должен писать var[i].str при передаче параметра в функцию например strcat, ведь функция то знает что там должен быть str тип...
DrOffset
6864 / 4075 / 928
Регистрация: 30.01.2014
Сообщений: 6,870
23.03.2014, 17:19     Можно ли заменить обращение к Union без указания типа переменной? #47
Цитата Сообщение от Izual Посмотреть сообщение
В общем по union'у у меня до сих пор остался не решённый вопрос:
Я тебе уже два раза в этой теме на него отвечал.

Цитата Сообщение от Izual Посмотреть сообщение
Я бы предпочёл без шаблонов - он мне мешает
Не нравятся шаблоны - дел хозяйское, никто ж не заставляет. Просто опасность, про которую говорил автор четвертого поста, заключалась в отсутствии проверки на недопустимый тип, а не конкретно в используемом инструменте.

Цитата Сообщение от Izual Посмотреть сообщение
У меня дед - плотник, вот как ни кто я то уж знаю о важности выбора инструмента.
Важность выбора - бесспорно. Однако инструмент выбирает человек. Сам по себе инструмент не виноват, если человек чего-то не учел. Это ведь понятно?
Izual
94 / 119 / 6
Регистрация: 13.11.2012
Сообщений: 1,537
23.03.2014, 17:32  [ТС]     Можно ли заменить обращение к Union без указания типа переменной? #48
Цитата Сообщение от DrOffset Посмотреть сообщение
на него отвечал
Отвечал, да не в контексте с вопросом "почему", ну да ты сказал что это не возможно по причине того что union не умеет. Однако я всё таки не понимаю по факту причём тут union, ведь вот код из 4 поста:
C++
1
2
3
4
5
6
void func( float val )
{
  cout << "func data.f: " << val << endl;
}
...
func( data );//вызов через data, без указания типа!
Значит в собственную функцию можно, а в стандартную(strcat например) нет? Абсурд или лыжи не едут или... =)
Цитата Сообщение от DrOffset Посмотреть сообщение
никто ж не заставляет
Да просто надоели уже переубеждать, почти каждый это делает - уже устал. И ладно бы ещё так как делаете это вы (частично с объяснением и в том русле, который инетересен мне), хотя опять же у меня на данный шаблон аллергия, т.к. ну я описал что синтаксис и отсутствие возможности уйти в корень.
Цитата Сообщение от DrOffset Посмотреть сообщение
инструмент не виноват
Виноват, если он не качественный. Ну точнее конешно не сам инструмент, а тот кто его выбрал(коим я не хочу стать) в виду описанных выше причин.(+всегда лучше сделать стандартными Си методами и написать свой алгоритм проверок и т.п. хотя бы из факта того, что если понадобится на другую платформу перейти или на другой язык - то тут я уже смогу просто всё скопировать, ведь стандарты Си - они практически во всех языках одинаковы, в отличии от вектора, которого вообще ни где нет, имхо )
DrOffset
6864 / 4075 / 928
Регистрация: 30.01.2014
Сообщений: 6,870
23.03.2014, 17:57     Можно ли заменить обращение к Union без указания типа переменной? #49
Цитата Сообщение от Izual Посмотреть сообщение
Значит в собственную функцию можно, а в стандартную(strcat например) нет?
Почему же нельзя? Можно.

Цитата Сообщение от Izual Посмотреть сообщение
Да просто надоели уже переубеждать
Может быть стоит задуматься почему так происходит? Хотя лично я тебя не переубеждаю. Я пытаюсь заставить тебя подумать о том, что твое мнение не единственно правильное на земле. И раз существуют разные инструменты, не значит что их придумали глупцы, если лично тебе они не подходят.

Цитата Сообщение от Izual Посмотреть сообщение
Виноват, если он не качественный.
Ты меня извини, но я пока не могу сказать, что ты можешь это объективно оценить. Если ты говоришь, что не хочешь (по любым причинам), это я приму, а подобные приведенному выше утверждения - нет.

Добавлено через 12 минут
Вот пример из 4го поста вместе с strcat (в нем все еще отсутствует проверка на текущий тип в union, но я думаю это понятно).
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
50
51
52
53
#include <cstring>
#include <cstdio>
 
union data_t
{
    int   i;
    float f;
    char  str[42];
 
    operator int()
    {
        return i;
    }
    operator float()
    {
        return f;
    }
    operator char * ()
    {
        return str;
    }
 
    data_t & operator=(char const * s)
    {
        strncpy(str, s, 41);
        return *this;
    }
    data_t & operator=(int x)
    {
        i = x;
        return *this;
    }
    data_t & operator=(float x)
    {
        f = x;
        return *this;
    }
};
 
int main()
{
    data_t data;
    char buf[256] = "this is a ";
 
    data = "test";
    strcat(buf, data); // здесь явно писать не надо, т.к. приведение будет
                       // выбрано в соответствии с типом аргумента
 
    printf("%s\n", (char*)data); // здесь явное приведение нужно, потому что printf
                                 // работает (через эллипсис) в обход системы типов языка
 
    printf("%s\n", buf);
}
Izual
94 / 119 / 6
Регистрация: 13.11.2012
Сообщений: 1,537
23.03.2014, 19:12  [ТС]     Можно ли заменить обращение к Union без указания типа переменной? #50
Цитата Сообщение от DrOffset Посмотреть сообщение
стоит задуматься почему так происходит
Потому что "самомнение", а не "здравомыслие" (по Трёхлебову). Хотя в данном случае интерпритировать нужно исходя из принципов которые я описал, что 1. Такой(мой) код позволит контролировать внутренний процесс (грубо говоря собственного шаблона, хотя он уже не шаблон - а алгоритм) 2. В случае смены ОСи или языка - стандарты Си останутся(т.к. сам принцип останется, может семантика поменяется - но это уже не проблема) 3. Развивает, т.к. сам делаеш алгоритм 4. Синтаксис простой становится (простота - залог всего)
Цитата Сообщение от DrOffset Посмотреть сообщение
не единственно правильное
Правда - для каждого своя, а т.к. первая буквица "покой", то основывается на образе покоя, т.е. "каждый сверчок - знай свой шосток", человек может принять то что его оставляет в покое. А вот истина, уже другая штука, основанная на здравомыслии, и тут уже покой не подойдёт, т.к. "из терний к звёздам".( а люди пытаются меня переубедить - смешно, хотя бы потому что "не просили" )
Цитата Сообщение от DrOffset Посмотреть сообщение
раз существуют разные инструменты
Я говорю о качестве инструмента.(качество подразумевает и удобство, и практичность, и долговременность и другие факторы, в совокупносте которых можно определить ~%КПД)

А по поводу реализации функции, спасибо большое!(принтф мне как раз не нужен, как я и написал в начале второй страницы что printf - не лучший пример, т.к. "обход системы типа") Это как раз то что мне и нужно было, хотя ещё нужны пару разъяснений по поводу операторов. А они обязательны? Т.е. к примеру, если я заполняю переменную собственной функцией с типом var[i].str, в соответствии с enum типом, а вот только лишь нужно отсутствие типа при использовании переменной, т.е. передачи её значения в какие то функции.
DrOffset
6864 / 4075 / 928
Регистрация: 30.01.2014
Сообщений: 6,870
23.03.2014, 21:06     Можно ли заменить обращение к Union без указания типа переменной? #51
Цитата Сообщение от Izual Посмотреть сообщение
Это как раз то что мне и нужно было, хотя ещё нужны пару разъяснений по поводу операторов. А они обязательны?
Если хочешь, чтобы было автоматическое преобразование (ведь из-за этого весь сыр-бор?), то да. Но тогда это будет С++, а не С. В С нет способа обеспечить это.

-----
Хочешь понять о чем тут многие тебе писали, развеять парочку мифов и обрести наконец истину, устройся работать в какую-нибудь фирму. Там на живых примерах и с живым общением многое прояснится. Через интернет все равно этого не объяснить. Так и будут тебя либо банить, либо бестолку с тобой спорить.
Izual
94 / 119 / 6
Регистрация: 13.11.2012
Сообщений: 1,537
23.03.2014, 21:36  [ТС]     Можно ли заменить обращение к Union без указания типа переменной? #52
Цитата Сообщение от DrOffset Посмотреть сообщение
Но тогда это будет С++
Я не против, в С++ очень много полезностей, например аллокатор NEW. Но всё зависит от итогового КПД, в котором простота синтаксиса играет не маловажную роль.
Цитата Сообщение от DrOffset Посмотреть сообщение
о чем тут многие тебе писали
Многие - не интересуют, интересуют некоторые, в словах которых есть "здравое зерно" и напутствия.
Цитата Сообщение от DrOffset Посмотреть сообщение
устройся работать в какую-нибудь фирму
Нет, спасибо, я программер одиночка(покуда нет ещё тех кто пойдёт за мной, т.к. я не подчиняюсь априори никому, работаю сейчас как ИП, делаю БД, пока что со своей задачей справляюсь на ура, но в силу того что я не люблю стоять на месте - сам себе строю препятствия для развития - основным из которых сейчас явился интерпритатор) Видимо данное ваше высказывание имело контекст "тебя научат профи" - тут есть те у кого можно поучиться, например мне очень нравится Убеждённый в разделе WinApi, он не только показывает примеры - когда надо, но и подробно рассказывает или даёт полезные ссылки, тебя хвалить не буду, а то зазнаешся )
Цитата Сообщение от DrOffset Посмотреть сообщение
Так и будут тебя либо банить
Банят модеры, но над ними ещё 2 уровня не считая владельца, всегда можно оспорить. Просто я не вижу смысла заморачиваться(пока что!) по поводу этого - т.к. когда дело запахнет керасином - в бой пойдёт их же собственная не компитентность.(политику я прекрасно понимаю)
Цитата Сообщение от DrOffset Посмотреть сообщение
либо бестолку с тобой спорить
Пфф, для меня лучше - буду практиковаться не обращять внимание на глупцов и тренировать силу воли. Дьявол(не буду употреблять альтернативное имя, созвучное с..) и создан для того чтоб делать препятствия, преодолевая которые - мы развиваемся.
DrOffset
6864 / 4075 / 928
Регистрация: 30.01.2014
Сообщений: 6,870
23.03.2014, 21:48     Можно ли заменить обращение к Union без указания типа переменной? #53
Цитата Сообщение от Izual Посмотреть сообщение
Нет, спасибо, я программер одиночка
Дело твое.

Не по теме:


Ты тему-то про DirectDraw смотрел? Я там ответил уже довольно давно.

MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.03.2014, 21:56     Можно ли заменить обращение к Union без указания типа переменной?
Еще ссылки по теме:

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

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

Или воспользуйтесь поиском по форуму:
Izual
23.03.2014, 21:56  [ТС]     Можно ли заменить обращение к Union без указания типа переменной?
  #54

Не по теме:

DrOffset, смотрел(только что), но разберу позже, пока что не до него, в голове другие вещи, а то outofmemory мозга будет))

Yandex
Объявления
23.03.2014, 21:56     Можно ли заменить обращение к Union без указания типа переменной?
Ответ Создать тему
Опции темы

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