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

C++

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

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

07.03.2014, 08:19. Просмотров 3330. Ответов 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++):

.NET 4.x Можно ли передать переменную в класс без указания ее типа - C#
Есть универсальный класс. С дофига и более функциями. И при работе с классом приходится постоянно писать типы переменных в &lt;&gt; Хотелось...

Обращение к файлу без указания полного пути - Objective-C
Народ, у меня такая проблема. Тут не objective-c а просто shell скрипт. Я создал программу, которой для работы требуется еще один файл....

Массив с единственной ячейкой: можно ли обращаться к нему без указания индекса? - Lazarus
Есть вопрос: если в массиве инициализирована всего одна ячейка, и иначе не предвидется в ходе выполнения всей программы, можно ли...

Как можно удалить все элементы из List без указания диапазона и индекса? - C#
че-то так не получается digit.Remove();

Обращение к переменной типа int в СУБД - C++
Как обращаться к переменной типа int в СУБД в условии? Допустим с типом char вот так: if(!strcmp (a.p,b)) Тут у меня был...

Обратиться к переменной класса без указания самого класса - C#
Вот код: using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; ...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Izual
94 / 119 / 6
Регистрация: 13.11.2012
Сообщений: 1,551
08.03.2014, 17:46  [ТС] #16
ValeryS, первая страница, пост №6.
Так в общем, мне нужно теперь оптимизировать пост #4:
C++
1
2
3
4
operator int & ()
  {
    return i;
  }
Либо универсальный оператор, либо... как то по компактнее, а то чую, сделаю 50 типов, а кода будет на 100 листов, только лишь операторов этих)
ValeryS
Модератор
6556 / 5022 / 464
Регистрация: 14.02.2011
Сообщений: 16,763
08.03.2014, 18:02 #17
Цитата Сообщение от Izual Посмотреть сообщение
ValeryS, первая страница, пост №6.
и что я должен увидеть?
я тебя спрашиваю как ты хочешь пользоваться этим своим типом?
не надо мне вывод на экран приводить
всю жизнь
создание переменной, присвоение значения, работа с ней, удаление,
например как ввести значение с клавиатуры?
Izual
94 / 119 / 6
Регистрация: 13.11.2012
Сообщений: 1,551
08.03.2014, 20:52  [ТС] #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
Модератор
6556 / 5022 / 464
Регистрация: 14.02.2011
Сообщений: 16,763
08.03.2014, 21:19 #19
Цитата Сообщение от Izual Посмотреть сообщение
Теперь, давайте закругляйтесь с вашими "как и для чего", я тут не доказываю ничего.
Да пожалуйста
Цитата Сообщение от Izual Посмотреть сообщение
п.с. вообще я не понимаю,
Вот они ключевые слова
т.е как и что делать не понимаешь,но делаешь
Что ж вперед
Izual
94 / 119 / 6
Регистрация: 13.11.2012
Сообщений: 1,551
08.03.2014, 22:18  [ТС] #20
ValeryS, ты какой то странный. Я для того и создал тему, чтобы найти инфу по инетересующему вопросу, тем более что как использовать в обычных условиях union это понятно. Но тут не тривиальный вопрос.
Не понимаю уже вопросов исполнения, так сказать синтаксиса или внутренних процедур. Естественно, такие вещи опытом набиваются, потому как обилием инфы о экстра вопросах даже МСДН не пишет.
elivin
65 / 65 / 1
Регистрация: 04.01.2012
Сообщений: 231
Записей в блоге: 1
09.03.2014, 08:35 #21
ValeryS, чтобы понять ход мыслей Izual'а, советую почитать эту тему. Много букв, конечно, но это поможет понять, что происходит в данной теме
DrOffset
7089 / 4230 / 950
Регистрация: 30.01.2014
Сообщений: 7,006
11.03.2014, 01:05 #22
Izual, единственный способ сделать это более или менее автоматически озвучен в четвертом посте. Кстати, пример в четвертом посте можно усовершенствовать в отношении удобства.

Правда все это сделает из POD union класс, а ты классы, помнится, юзать не хотел. Так что получается решения у этой задачи нет в поставленных условиях.
Jupiter
Каратель
Эксперт С++
6553 / 3973 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
11.03.2014, 01:19 #23
Цитата Сообщение от Izual Посмотреть сообщение
будет - переменная, а к ней по типу enum будет крепиться функция получения значения из конкретного типа.
зачем изобретать полиморфизм?
Izual
94 / 119 / 6
Регистрация: 13.11.2012
Сообщений: 1,551
12.03.2014, 16:14  [ТС] #24
Jupiter, очень тяжело гуглить "полиморфизм" под СИ, а не под С++, т.к. всё что с С++, то идёт с классами, а они априори МНЕ не подходят.

DrOffset, дада, я от этого поста и отталкиваюсь, только вот если у меня будет 100500 типов, то под каждый надо будет писать этот оператор - получится очень много кода, в таком случае оно не стоит того, и проще будет использовать обычный вид var.t.int. Нужна либо оптимизация, т.е. ну я предполагаю, может встроенная функция в структуре должна быть или что то ещё, но я пока не спец, потому предположить даже сложно.
DrOffset
7089 / 4230 / 950
Регистрация: 30.01.2014
Сообщений: 7,006
12.03.2014, 19:06 #25
Izual, зачем гуглить полиморфизм под С, когда это понятие вообще не привязанно к языку. Если в С нет классов, это не значит что полиморфизм там не возможен

Цитата Сообщение от Izual Посмотреть сообщение
получится очень много кода, в таком случае оно не стоит того
Не видел ни одной полноценной реализации вариантного типа, котором было бы "мало" кода...

Маленькое дополнение по union. Если мы положили в union int, то доставать из union мы тоже должны int. Любые другие комбинации - это неопределенное поведение. Например положив int и доставая double, мы никогда не получим корректного числа из-за принципиально разного битового представления этих типов.
Поэтому сам по себе union может быть полезен только для сжатого хранения разнотипной информации. Т.е. в довесок к union мы всегда должны писать проверки на текущее состояние union (что за тип там лежит) и функции преобразования из этого типа в требуемый.
Izual
94 / 119 / 6
Регистрация: 13.11.2012
Сообщений: 1,551
12.03.2014, 20:33  [ТС] #26
Цитата Сообщение от DrOffset Посмотреть сообщение
зачем гуглить полиморфизм под С, когда это понятие вообще не привязанно к языку
А примеры реализации я вам сам выдумаю? Может мне и новый язык создать?..
Цитата Сообщение от DrOffset Посмотреть сообщение
Если в С нет классов, это не значит что полиморфизм там не возможен
Плохо читаете! Я сказал следующее:
Цитата Сообщение от Izual Посмотреть сообщение
очень тяжело гуглить "полиморфизм" под СИ
Чуете разницу?..

Цитата Сообщение от DrOffset Посмотреть сообщение
было бы "мало" кода
Видели пример, когда под каждый тип нужно писать оператор? Одно дело когда только типы, а другое когда ещё и операторы. Утраивается размер кода. И опять же, я сказал:
Цитата Сообщение от Izual Посмотреть сообщение
Нужна либо оптимизация
...

Цитата Сообщение от DrOffset Посмотреть сообщение
проверки на текущее состояние union
А для чего я по вашему писал пример(*в 6 посте), где в структуре 2 переменные, одна - тип, вторая - сама переменная.

Это называется "То ли я дурак, то ли лыжи не едут". =)
DrOffset
7089 / 4230 / 950
Регистрация: 30.01.2014
Сообщений: 7,006
12.03.2014, 21:13 #27

Не по теме:

Izual, сколько экспрессии. Ну если я для тебя ничего нового не написал, так и скажи. Хамить-то зачем?



Добавлено через 3 минуты
Цитата Сообщение от Izual Посмотреть сообщение
очень тяжело гуглить "полиморфизм" под СИ
Я еще раз спрошу. Зачем гуглить "полиморфизм под Си", коли это понятие к языку не привязано?
Цитата Сообщение от Izual Посмотреть сообщение
А примеры реализации я вам сам выдумаю?
Конечно, а что тут такого? Если есть понятие что такое полиморфизм, то примеры реализации на языке, который знаешь, придумываются очень быстро К тому же ссылочка, которую я дал, содержит как раз пример для Си.
Izual
94 / 119 / 6
Регистрация: 13.11.2012
Сообщений: 1,551
12.03.2014, 21:22  [ТС] #28
DrOffset, я не хамлю, или по вашему если отвечать прямо - это хамство?.. Вот по мне так, хамство - это зайти в топик, не прочитать что написано, но ответить(это называется "слышу звон, да не знаю где он").(в итоге естественно "ахинея" получилась, так я ещё и хамлю...) Вот теперь у меня точно лыжи не едут.

*адд
примеры реализации на языке, который знаешь
Уровень знания тоже можно оценить по N бальной шкале. Я вообще мало знаю Си, на 2 балла из 100 наверно.
Evg
Эксперт CАвтор FAQ
17618 / 5842 / 375
Регистрация: 30.03.2009
Сообщений: 16,118
Записей в блоге: 26
12.03.2014, 22:12 #29
Цитата Сообщение от ValeryS Посмотреть сообщение
Izual,
скажи зачем тебе union?
ты вообще представляешь что это такое?
что общего у int и float кроме размера?
А почему у int и float должно быть что-то общее?
Товарищ, судя по всему, пишет интерпретатор с языка программирования, а union - это внутреннее представление переменной (переменная может быть целая, вещественная или строковая). Чтобы что-то хранить в union'е, совсем необязательно, чтобы эти "что-то" имели что-то общее

Цитата Сообщение от Izual Посмотреть сообщение
Я для того и создал тему, чтобы найти инфу по инетересующему вопросу, тем более что как использовать в обычных условиях union это понятно. Но тут не тривиальный вопрос.
Считай, что ответ на твой вопрос - "нельзя". А куча встречных вопросов диктуется тем, что твой вопрос изначально является идиотским и люди хотят понять, ради чего разводится такой геморрой. Я, если честно, кроме экономии 5 букв ни одной разумной причины не понял
DrOffset
7089 / 4230 / 950
Регистрация: 30.01.2014
Сообщений: 7,006
12.03.2014, 22:16 #30

Не по теме:

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



Цитата Сообщение от Izual Посмотреть сообщение
слышу звон, да не знаю где он
По-моему я дал совершенно корректную ссылку, между прочим с примерами, по прямой теме, которая до этого обсуждалась. Уточнив, что бессмысленно искать примеры полиморфизма на Си, если есть затруднения в самом предмете. Будешь с этим спорить?

Не по теме:

По поводу дополнения про union, да, я мне действительно было не очевидно, что у тебя есть полное понимание этой темы, поэтому я позволил себе написать пояснение. Ну раз я оказался не прав, то это только к лучшему. Однако, допущенная мной ошибка в суждении не достойна столь эмоциональной реакции. Лично я пришел сюда только затем, чтобы помогать людям.



Цитата Сообщение от Izual Посмотреть сообщение
Нужна либо оптимизация
Убрать синтаксический оверхед возможно. То есть я реально знаю способ, который позволит задать 1-N типов в union и получить автоматически операторы преобразования для всех них без необходимости вручную прописывать каждый оператор. Но это потребует использования С++ и его возможностей (в частности шаблонов). При условии, что ты писал о неприемлемости использования "новомодных" фич языка, я этот пример приводить не стал. А если оставаться в рамках Си или упрощенного Си++, то без ручного (или полуручного с помощью макросов) перечисления всех возможных вариантов не обойтись никак. Что и демонстрируют все известные мне реализации вариантных типов. Это я имел в виду, когда писал
Цитата Сообщение от DrOffset Посмотреть сообщение
полноценной реализации вариантного типа, в котором было бы "мало" кода...
.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.03.2014, 22:16
Привет! Вот еще темы с ответами:

Сколько значений переменных типа char можно записать в динамической памяти на место одной удаленной переменной типа int - Pascal
Сколько значений переменных типа char можно записать в динамической памяти на место одной удаленной переменной типа int? Объем выделяемого...

Заменить символы в переменной типа String - C++ Builder
Всем привет) Ребят, прокрнсультируйте пожалуйста(т.к. с Билдером пока что на &quot;Вы&quot;): есть строка String str = 09.04.2014; //дата...

Обращение к переменным в union со struct - C (СИ)
Код такой: union tune_t { struct named { // Общие константы var tempo; } q;

Потоки и обращение из них к контроллам: можно ли обойтись без делегатов - C#
И-так. Есть, скажем, функция. Она работает в главном основном потоке. При выполнении этой функции программа подвисает на какой-то...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
12.03.2014, 22:16
Ответ Создать тему
Опции темы

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