143 / 122 / 21
Регистрация: 13.11.2012
Сообщений: 1,564
|
|||||||||||
1 | |||||||||||
Можно ли заменить обращение к Union без указания типа переменной?07.03.2014, 08:19. Показов 6132. Ответов 53
Метки нет (Все метки)
Можно ли заменить обращение к Union без указания типа переменной?(т.е. без .i .f .str, а просто к "data")
Добавлено через 7 минут Т.е. чтоб при последующем использовании можно было бы сделать так:
0
|
07.03.2014, 08:19 | |
Ответы с готовыми решениями:
53
О структурах. Как в массив записываются элементы разных типов без указания собственно типа? Можно ли передать переменную в класс без указания ее типа Обращение к файлу без указания полного пути Массив с единственной ячейкой: можно ли обращаться к нему без указания индекса? |
18841 / 9840 / 2408
Регистрация: 30.01.2014
Сообщений: 17,281
|
|
11.03.2014, 01:05 | 22 |
Izual, единственный способ сделать это более или менее автоматически озвучен в четвертом посте. Кстати, пример в четвертом посте можно усовершенствовать в отношении удобства.
Правда все это сделает из POD union класс, а ты классы, помнится, юзать не хотел. Так что получается решения у этой задачи нет в поставленных условиях.
0
|
143 / 122 / 21
Регистрация: 13.11.2012
Сообщений: 1,564
|
|
12.03.2014, 16:14 [ТС] | 24 |
Jupiter, очень тяжело гуглить "полиморфизм" под СИ, а не под С++, т.к. всё что с С++, то идёт с классами, а они априори МНЕ не подходят.
DrOffset, дада, я от этого поста и отталкиваюсь, только вот если у меня будет 100500 типов, то под каждый надо будет писать этот оператор - получится очень много кода, в таком случае оно не стоит того, и проще будет использовать обычный вид var.t.int. Нужна либо оптимизация, т.е. ну я предполагаю, может встроенная функция в структуре должна быть или что то ещё, но я пока не спец, потому предположить даже сложно.
0
|
18841 / 9840 / 2408
Регистрация: 30.01.2014
Сообщений: 17,281
|
|
12.03.2014, 19:06 | 25 |
Izual, зачем гуглить полиморфизм под С, когда это понятие вообще не привязанно к языку. Если в С нет классов, это не значит что полиморфизм там не возможен
Не видел ни одной полноценной реализации вариантного типа, котором было бы "мало" кода... Маленькое дополнение по union. Если мы положили в union int, то доставать из union мы тоже должны int. Любые другие комбинации - это неопределенное поведение. Например положив int и доставая double, мы никогда не получим корректного числа из-за принципиально разного битового представления этих типов. Поэтому сам по себе union может быть полезен только для сжатого хранения разнотипной информации. Т.е. в довесок к union мы всегда должны писать проверки на текущее состояние union (что за тип там лежит) и функции преобразования из этого типа в требуемый.
0
|
143 / 122 / 21
Регистрация: 13.11.2012
Сообщений: 1,564
|
|
12.03.2014, 20:33 [ТС] | 26 |
А примеры реализации я вам сам выдумаю? Может мне и новый язык создать?..
Плохо читаете! Я сказал следующее: Чуете разницу?.. Видели пример, когда под каждый тип нужно писать оператор? Одно дело когда только типы, а другое когда ещё и операторы. Утраивается размер кода. И опять же, я сказал: ... А для чего я по вашему писал пример(*в 6 посте), где в структуре 2 переменные, одна - тип, вторая - сама переменная. Это называется "То ли я дурак, то ли лыжи не едут". =)
0
|
18841 / 9840 / 2408
Регистрация: 30.01.2014
Сообщений: 17,281
|
|
12.03.2014, 21:13 | 27 |
Не по теме: Izual, сколько экспрессии. Ну если я для тебя ничего нового не написал, так и скажи. Хамить-то зачем? :) Добавлено через 3 минуты Я еще раз спрошу. Зачем гуглить "полиморфизм под Си", коли это понятие к языку не привязано? Конечно, а что тут такого? Если есть понятие что такое полиморфизм, то примеры реализации на языке, который знаешь, придумываются очень быстро К тому же ссылочка, которую я дал, содержит как раз пример для Си.
0
|
143 / 122 / 21
Регистрация: 13.11.2012
Сообщений: 1,564
|
|
12.03.2014, 21:22 [ТС] | 28 |
DrOffset, я не хамлю, или по вашему если отвечать прямо - это хамство?.. Вот по мне так, хамство - это зайти в топик, не прочитать что написано, но ответить(это называется "слышу звон, да не знаю где он").(в итоге естественно "ахинея" получилась, так я ещё и хамлю...) Вот теперь у меня точно лыжи не едут.
*адд
0
|
12.03.2014, 22:12 | 29 |
А почему у int и float должно быть что-то общее?
Товарищ, судя по всему, пишет интерпретатор с языка программирования, а union - это внутреннее представление переменной (переменная может быть целая, вещественная или строковая). Чтобы что-то хранить в union'е, совсем необязательно, чтобы эти "что-то" имели что-то общее Считай, что ответ на твой вопрос - "нельзя". А куча встречных вопросов диктуется тем, что твой вопрос изначально является идиотским и люди хотят понять, ради чего разводится такой геморрой. Я, если честно, кроме экономии 5 букв ни одной разумной причины не понял
0
|
18841 / 9840 / 2408
Регистрация: 30.01.2014
Сообщений: 17,281
|
|
12.03.2014, 22:16 | 30 |
Не по теме: Да фраза твоя с дураком двусмысленно прозвучала. Но лично мне все равно в чью сторону она была направлена, мне просто интересно было зачем это вообще нужно делать :) По-моему я дал совершенно корректную ссылку, между прочим с примерами, по прямой теме, которая до этого обсуждалась. Уточнив, что бессмысленно искать примеры полиморфизма на Си, если есть затруднения в самом предмете. Будешь с этим спорить? Не по теме: По поводу дополнения про union, да, я мне действительно было не очевидно, что у тебя есть полное понимание этой темы, поэтому я позволил себе написать пояснение. Ну раз я оказался не прав, то это только к лучшему. Однако, допущенная мной ошибка в суждении не достойна столь эмоциональной реакции. Лично я пришел сюда только затем, чтобы помогать людям. Убрать синтаксический оверхед возможно. То есть я реально знаю способ, который позволит задать 1-N типов в union и получить автоматически операторы преобразования для всех них без необходимости вручную прописывать каждый оператор. Но это потребует использования С++ и его возможностей (в частности шаблонов). При условии, что ты писал о неприемлемости использования "новомодных" фич языка, я этот пример приводить не стал. А если оставаться в рамках Си или упрощенного Си++, то без ручного (или полуручного с помощью макросов) перечисления всех возможных вариантов не обойтись никак. Что и демонстрируют все известные мне реализации вариантных типов. Это я имел в виду, когда писал .
0
|
Модератор
8908 / 6677 / 918
Регистрация: 14.02.2011
Сообщений: 23,521
|
||||||
12.03.2014, 22:19 | 31 | |||||
ну наверно потому что он хочет конвертировать значения
типа записал в int а считал во float ну можно сказать( или нельзя ) что union это скрытое приведение можно ведь и так написать
0
|
12.03.2014, 22:25 | 32 |
Это всего лишь твоё предположение. Наличие char[20] явно говорит о том, что предположение некорректное. Первоначальное назначение union'а - это хранить разнотипные значения, а не конвертировать битовые образы значений (последнее, строго говоря, противоречит strict aliasing rules)
1
|
18841 / 9840 / 2408
Регистрация: 30.01.2014
Сообщений: 17,281
|
|
12.03.2014, 22:27 | 33 |
Если текущий вопрос состоит именно в том, как он подан в его первом посте, то решение для него есть. Но оно не удовлетворит автора по религиозным причинам. Что еще предложить - лично я не знаю. Могу привести код, если хотите.
0
|
143 / 122 / 21
Регистрация: 13.11.2012
Сообщений: 1,564
|
|
12.03.2014, 22:56 [ТС] | 34 |
Evg, спасибо большое за разъяснения, у меня честно уже терпения не хватает. Люди выдумывают на ходу что хотят, а первые две страницы вообще не читали. Отсюда, ну не то чтобы я в бешенстве, но это уже не этично, и потому я уже начинаю думать что с стенкой разговариваю)))
Дело в том что я хочу динамики, т.е. всегда обращяться к переменной var[i](ну точнее, т.к. var это структура, то обращение будет к члену - union, тогда к var[i].v), а если делать по стандарту, то придётся под каждую функцию в последующем подписывать тип, что для меня является непонятным. Ведь если функция strcpy например в аргументе несёт тип char*, то ясен пень(опять лыжи не едут или у меня слишком идеальная логика, что создатели Си до этого не додумались) что var[i].v будет обращена к var[i].v.str (т.е. к char* типу), другое дело что типа такого нет например в моём union'е, но на это бы естественным образом при вызове функции вышла бы ошибка(ну это по логике), что мол - вы передали переменную, которая не имеет типа char*. (учитывая что логика основана НЕ на идеальных знаниях Си, о чём написал фразой "найти инфу")... Ты всё правильно понял, она так и предполагала своё значение. Почему - потому что ты не читал первые две страницы, но написал комент, в итоге всё что ты написал - повторение того о чём уже было сказано. Вот после таких ответов - рождается оффтоп и тема уходит в отстой, либо продолжать её безсмысленно. Знаеш фразу - "в бочке мёда ложка дёгтя"? Тут получилось наоборот "в бочке дёгтя ложка мёда", я потому и не зашёл на неё.(щяс зайду гляну) Предмет то как называется? ~ ~ (или вы думаете что я в вузе учусь - нет, отучился - бросил из за непоследовательности даваемых знаний, которые естественно не усваивались, потому что предыдущие этапы не были пройдены, это у нас в системе образования дырки) "благими намерениями дорога в ад вымощена"... почему - потому что есть ещё целый пласт знаний и этики, кому и как давать, и другие производные вопросы - потому не каждый может являться учителем(вот видите, у меня даже принимаемая информация от первого вашего поста уже не воспринялась, имею ввиду ссылку), ну это не беда, мы потому и в этом матерриальном мире - потому что эгоистичны и не приняли бога и его канонов(это так философия вед, чтоб вы не расстраивались, а извлекли урок и учтя его - не наступали дважды на грабли)
0
|
12.03.2014, 23:05 | 35 |
Имеем два факта:
1. Ты не знаешь базовых основ языков Си и Си++, но полез делать что-то сложное, которое толком даже объяснить не можешь 2. Внятно поставленный вопрос - это половина ответа В качестве результата ты получил ровно то, что должно в теории вытекать из этих двух фактов - кучу ответов на вопросы, которые ты не задавал и тебе не интересны. Я тебя огорчу, но у тебя лыжи не едут. В соответствии с п.1, описанным выше Ты хочешь слишком много. В итоге получишь огромный геморрой, единственным позитивным моментом которого будет экономия 5 букв при написании кода.
0
|
143 / 122 / 21
Регистрация: 13.11.2012
Сообщений: 1,564
|
|
12.03.2014, 23:57 [ТС] | 36 |
Ты тоже выдумщик я смотрю. "Базовые основы" это первые две главы любой нормальной книги по С/С++, это БАЗОВЫЕ ОСНОВЫ. Если ты не корректно выразился - получил что сказал.(ты же мне тут карму во плати устраиваеш, я потягяюсь ибо уже больше 5 лет варюсь в веданте)
Я что должен на форуме простые вопросы поднимать, о которых в книгах написано? Вы видимо не поняли с кем имеете дело. Но почему то первые два ответа на первой странице были в точку по поставленному вопросу. Я лишь продолжил тему, которую мне подкинули в 4 посте - захотел автоматизации.(тут уже пошло поехало) Кэп. Тем более что я сказал что я с ведами дела имею, ЛОГИЧНО же было предположить что я знаю и применяю написанную вами фразу.(повториться что первые два поста были корректны? т.е. первые двое поняли вопрос, остальные - нет? Так у кого тут лыжи то не едут?) Читай выше. У меня тут книга под рукой "Программирование высокого уровня С/С++" автор Хабибулин. Книга считается уже не основой(не базовой основой так подавно), а средним+ уровнем, но в ней почему то не описано таких моментов. Может к первому посту данной темы обратишся? Я по моему ясно задал вопрос, что мне нужна информация (можно или нельзя) +свои "религиозные принципы" как тут выразились. И в чём проблема? - Написал бы: "Имхо, нельзя." и пошёл бы дальше. Но нет, надо же в теме остановиться и устроить срач... Эй люди, здесь есть те кто знает слово "этика" и мудр(т.е. применяет знание этики)?.. Ты подписывай "Имхо" рядом со своим комментом, чтобы не выглядело как "взгляд профессионала". Если ты не знаеш за чем - значит ты не напряг мозг или оно тебе не надо. Я лично знаю что мне надо и куда я двигаюсь, у меня уже 15000 строк кода рабочей программы. Вопрос в том что даёт язык Си того что я хочу или нет. Программирование - это логика, причём исходя из того что практически ничего не знал 2 года назад о Си(ну только совсем базу, которая даётся в книжках типа "С/С++ в задачах и примерах", т.е. умение пользоваться операторами, библ. функциями и построением алгоритмов), то очень уж странно, как же так за год я написал программу и изучил для её построения столько, сколько и вуз не даёт за 3 года, если вообще даёт?.. Это риторический вопрос, отвечать на него не надо. Это я к тому, что логика является базовым ключём к пониманию самой сути программирования. А вот то что я не знаю внутренностей(как устроено) таких вещей как union(ну в простых - обычных случаях, инфы по которой 99% я без проблем разбираюсь) это естественно, потому что тут уже извините, нужно 10 лет опыта, и т.п. Так для этого форум и создан, как факт того что люди изучающие глубоко программирование - могли бы делиться опытом. А вы начинаете упрекать меня в том что я куда то там залез в дебри. Не нравится - пройдите мимо, не провоцируйте.
0
|
Каратель
|
||||||
13.03.2014, 00:00 | 37 | |||||
Не по теме: мы настолько суровы, что разрабатываем под микроконтроллеры семейства Х с использованием компилятора от вендора Y, потому замечания о возможном различии порядка байт не принимаются:sarcasm:
0
|
18841 / 9840 / 2408
Регистрация: 30.01.2014
Сообщений: 17,281
|
|||||||||||
13.03.2014, 01:56 | 38 | ||||||||||
Предмет разговора - "полиморфизм".
Значит и вывод я сделал верный, уж извини. Ты преувеличиваешь. Учитывая, что ты не являешься экспертом в этом вопросе, и даже озвученный экспертом взгляд на этот вопрос был бы субъективен (особенно сделанный на основании одного единственного поста), позволю себе пропустить это замечание и последующую не относящуюся к теме философию мимо ушей Итак, возвращаясь к теме: union в Си слишком базовая структура, чтобы к ней можно было применять высокоуровневую (в смысле высокого уровня абстракции) логику. Поэтому и не срастаются концы с концами. Есть два выхода - Первый - сменить язык. На более простой и более высокоуровневый. Там будет и рефлекшн, и встроенный вариантный тип, и решение многих других вопросов, с которыми тебе еще предстоит столкнуться в С и С++. Второй выход воспользоваться приведенным ниже (или подобным) решением. Хотя по моему мнению, это решение может быть применено только в чисто академических целях, причины этого озвучил Evg (не за чем ради 5ти лишних символов городить огород). Я оставляю это здесь будучи уверенным на 99%, что ты не будешь этим пользоваться. Однако, данная тема доступна всем и кому-то в целях изучения возможностей языка может быть интересно (требуется С++11):
Реализация
Демонстрация Добавлено через 11 минут Да пожалуйста. 9.5/1 Да, я знаю что этот union cast работает почти везде. Однако это не дает повода утверждать, что он стандартен
0
|
SatanaXIII
|
||||||
13.03.2014, 10:17
Можно ли заменить обращение к Union без указания типа переменной?
#40
|
||||||
0
|
13.03.2014, 10:17 | |
Как можно удалить все элементы из List без указания диапазона и индекса? Обращение к переменной типа int в СУБД Обратиться к переменной класса без указания самого класса Сколько значений переменных типа char можно записать в динамической памяти на место одной удаленной переменной типа int Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |