| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Общие вопросы > Динамическое имя |
| Автор: Буратиныч 15.3.2011, 11:38 |
| Как созидается динамическое имя переменной и извлекается из него значение? Допустим i=1 и переменной name1 надо присвоить десятку, т.е. "name" + i = 10 а затем извлечь из из этой переменной значение. |
| Автор: bsa 15.3.2011, 11:39 |
| Буратиныч, ты сначала сформулируй, что такое "переменная с динамическим именем" и зачем это может быть нужно. |
| Автор: mes 15.3.2011, 11:43 |
| http://liveworkspace.org/code/5cb3cc3ccf0d8329101c07dd6e4e672f |
| Автор: Буратиныч 15.3.2011, 11:46 | ||
Сформулировал как смог Допустим имеется цикл. Переменная i заранее не известна. Поэтому в зависимости от итерации надо присваивать значения. name1 = 10 name2 = 20 или "name" + i = i * 10; |
| Автор: mes 15.3.2011, 12:06 |
| http://liveworkspace.org/code/119cc878a00e70ed96b69c871f8d26c8 (подправлено) а про обычные массивы Вы в курсе ? Добавлено @ 12:11 http://liveworkspace.org/code/19cb2862db5d19ab57183837f046a628 |
| Автор: Буратиныч 15.3.2011, 12:55 | ||
mes, спасибо! Но почему выскакивает ошибка? Error 2 error C2601: 'arr' : local function definitions are illegal |
| Автор: mes 15.3.2011, 12:57 |
потому что пытаетесь определить функцию внутри другой функции.. |
| Автор: Буратиныч 15.3.2011, 16:11 | ||
| Хочу из следующих данных: int name0 = 1; int name1 = 11; int name2 = 22; получить строчку: name3=22 name2=11 name1=1 name0=1 но код ниже мне всё нулит. В чём ошибка?
|
| Автор: mes 15.3.2011, 17:51 |
в том, что не поняли его назначение.. для вашего случая подойдут обычные массивы : http://liveworkspace.org/code/28ff4d017e45b41b6aac84ed8246f077 |
| Автор: Буратиныч 16.3.2011, 12:53 | ||||||
Нда, действительно массивы простое и гениальное решение. Только чтобы понять, мне это пришлось повторить дважды 1) А если размер массива выясняется только в конце цикла, т.е. не известно сколько там будет "name", может только 3, может миллион, то как его объявлять? Сразу резервировать память под миллион элементов? 2) Почему цикл считает вперёд, а не назад, как хотелось бы, начиная с меньшего к большему, а не наоборот:
В Output выводит
Значение Hcount = 9 |
| Автор: Буратиныч 16.3.2011, 15:31 | ||
Смысл такой, чтоб обрабатывал числа от 9 до 1. Цикл начинается с hx1 = 9-1, т.е. 8, и пока hx1 больше единицы на каждой итерации отнимать по 1. |
| Автор: mes 16.3.2011, 15:33 | ||
ну и ? в чем проблема то ? http://liveworkspace.org/code/a29f3b9b03009270507fc344079c3b75 |
| Автор: Буратиныч 16.3.2011, 16:09 |
| Прилагаю скриншот. Не знаю почему, но почему-то в первом условии for получается 10 = 9 - 1 |
| Автор: mes 16.3.2011, 16:32 | ||
значит такой отладчик... не стоит верить каждому его слову |
| Автор: Буратиныч 17.3.2011, 13:08 |
| А бывает такое, что вдруг становится невозможным (либо с ошибкой) заполнить какой-то элемент массива, хотя память для него зарезервирована? При этом предыдущие элементы заполнялись успешно. |
| Автор: bsa 17.3.2011, 13:19 |
| Буратиныч, нет. Но возможна ситуация, когда ты выходишь за пределы одного массива и повреждаешь другой. |
| Автор: Буратиныч 18.3.2011, 07:42 |
| Как правильно написать команду, проверяющую ячейку массива на заполненность, типа if(x[i] == Null или Empty) ? Нужно распознать вот это float значение -1.#IND00. |
| Автор: mes 18.3.2011, 09:26 | ||
|
| Автор: Буратиныч 18.3.2011, 10:09 | ||||
Что-то идентификатор isNaN is undefined. Там какой-то класс надо подключать? Просто здесь порылся http://social.msdn.microsoft.com/Search/ru-ru?query=isnan и сделал такой вывод |
| Автор: mes 18.3.2011, 10:12 | ||
не isNaN, а isnan ну так :
Добавлено через 55 секунд если хотите без подключения используйте 1й вариант.. |
| Автор: Буратиныч 18.3.2011, 10:20 |
| Так я и так и эдак, и с инклуд. Всё равно не распознаётся команда. |
| Автор: mes 18.3.2011, 10:51 | ||
|
| Автор: volatile 19.3.2011, 00:37 | ||
Проверка isnan здесь ничего не покажет. Если ячейку не инициализировали, там будет что угодно, любой мусор, и не факт что это будет nan. |
| Автор: Буратиныч 24.4.2011, 15:44 |
| Всё-таки никак не могу сделать переменную с нужным именем. Например, такая задача: char[5] name = "num"; int i = 5; int ( переменная name+i ) = 10; int final = num5 + 2; // равно 12 Каким способом её решить? |
| Автор: borisbn 24.4.2011, 18:10 | ||
http://ru.lmgtfy.com/?q=%D0%B4%D0%B8%D0%BD%D0%B0%D0%BC%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B5+%D0%B8%D0%BC%D1%8F+%D0%BF%D0%B5%D1%80%D0%B5%D0%BC%D0%B5%D0%BD%D0%BD%D0%BE%D0%B9+c%2B%2B |
| Автор: bsa 25.4.2011, 09:51 | ||
Буратиныч
|
| Автор: cupper 25.4.2011, 11:37 | ||
| вы что мозг парите человеку. Вам же русским языком было сказано "динамическое имя переменно" а вы ему массивы, векторы, мапы. Буратиныч то что ты спрашиваешь сделать низя, низя именно в той формулировки в которой ты хочешь. Такое можно делать только в интерпретируемых языках, С++/C не такие. (такое возможно сделать с использование define'ов скорее всего, но так не делают в С++). Сохранить разный набор данных можно как единую сущность, последовательность этих самых данных, это может быть массив (самый простой случай) это могут быть контейнеры типа vector, map. Вам все это уже показали. Вам нужно оторваться от вашего динамическое имя" и прийти к пониманию "динамический список данных". Хотя даже в интерпретируемых языках такое навряд ли можно, точно не во всех. В баше я такое не знаю как сделать. Такое можно сделать в cmake скриптах
в итоге вы получим переменную test_LIB_FILES вот как раз так и думаю ТС, но так низя в С++ |
| Автор: Буратиныч 25.4.2011, 11:53 |
| Я сейчас так пробую делать char newname[10]; char name[10] = "num"; int i = 5; sprintf_s( newname, "%s%d", name, i ); но как переменной, с названием newname (заранее не знаешь, что это num5 ), присвоить значение int? |
| Автор: cupper 25.4.2011, 12:13 |
| прочитай еще раз что я тебе написал. Скажи ты раньше на каком языке писал ? Откуда у тебя такой мышление ?) char newname[10]; это переменная типа массив char, имя этой переменной (массива) newname sprintf_s( newname, "%s%d", name, i ); здесь ты массив newname записываешь строку "name5". СТРОКУ !!!!!!! у тебя нет переменно name5 у тебя есть массив со строкой "name5". А раз у тебя нет переменной то ты ей не можешь присвоить никакой значение. PS. ты лучше скажи для чего тебе это, и тебе скажут как это сделать правильно. если книжки лень читать. |
| Автор: Буратиныч 25.4.2011, 12:29 |
| Мышление да, действительно, от другого языка досталось, скриптового. Но так в его базе лежит С++, то и, надо полагать, его функции переводятся обратно в С++. Вот две из них: VARSET - sets the value of dynamic variable Miscellaneous functions SYNTAX VarSet( ''varname'', value ) RETURNS NUMBER FUNCTION Sets the value of dynamic variable. Returns 1 on success, 0 on failure. Dynamic variables are variables that are named dynamically, typically by creating a variable name from a static part and a variable part. The following example dynamically constructs the variable name from a variable prefix and a static suffix. VARGET - gets the value of dynamic variable Miscellaneous functions SYNTAX VarGet( ''varname'' ) RETURNS ARRAY or NUMBER FUNCTION Gets the value of dynamic variable. Returns the NUMBER or ARRAY depending on type of underlying variable. Dynamic variables are variables that are named dynamically, typically by creating a variable name from a static part and a variable part. For example, the following example dynamically constructs the variable name from a variable prefix and a static suffix. В случае с моим примером можно сделать так: VarSet( "num" + i, 10); в итоге получается, что num5 = 10 |
| Автор: cupper 25.4.2011, 12:39 |
| в скриптовых языках (возможно не всех) тип переменной определяется во время присваивания ей значения. Это называется динамическая типизация. Поэтому проделать такой как ты написал так возможно. Так как за определении типа ответственен интерпритатор (компутер). В компилируемых языках, статическая типизация, т.е. тип переменной задается при определении самой переменной. И делается это уже программистом, и компилятор этого сделать не может. Поэтому в приведенных тобой функция нужно передавать еще а тип переменной, но так как тип это не переменная, то его низя передать, следовательно низя компилятор не может узнать тип переменной которую ты хочешь создать, следовательно он не может создать такую переменную. |
| Автор: mes 25.4.2011, 12:54 | ||
не всегда |
| Автор: Буратиныч 25.4.2011, 12:56 |
| Ну с типами проблем нет, они заранее известны, так что передам если компилятор попросит. Проблема в поиске подобной функции, принцип работы же её понятен. Какой её аналог в С++? |
| Автор: xvr 25.4.2011, 12:59 | ||||
Это заметно
То, что вы хотите сделать, можно сделать через интерфейсы отладчика. См. http://msdn.microsoft.com/en-us/library/ms680580%28v=VS.85%29.aspx |
| Автор: mes 25.4.2011, 13:02 |
| Буратиныч, имя переменной в C++ статическое.. чтоб сделать его динамическим нужно использовать какой то трюк.. какой именно зависит от требований предъявляемых Вашей переменной.. Так если переменные одного типа, а имя можно свести к индексу, то подойдет простой массив/вектор.. одного типа, но имя задано строкой, то подойдет карта (std::map) несколько типов можно свести к одному посредством варианта.. остальные варианты гораздо сложней, и в некоторых из них легче использовать/прикрутить скриптовый движок.. поэтому как уже не раз вам советовали, озвучьте задание, ибо результаты гадания на кофейной гуще Вам не помогут.. |
| Автор: Буратиныч 25.4.2011, 13:21 | ||
Если опираться на моё мышление, то оно бы выглядело так: i = 5; VarSet( "num" + i, 10); // num5 = 10 temp = VarGet ( "num" + i ); final = temp + 2; // равно 12 |
| Автор: boostcoder 25.4.2011, 13:29 |
| кто-нибудь понял для чего это нужно? за все время кодирования на с++, такой необходимости не возникало. уверен, что у xvr и mes, как минимум, тоже ;) |
| Автор: xvr 25.4.2011, 13:29 | ||
Подход от mes в 3м посте полностью удовлетворяет вашему заданию.
Гы, а я быстрее! |
| Автор: mes 25.4.2011, 13:30 | ||||||
http://liveworkspace.org/code/789f455e67f943f228396c307d6dfe41 |
| Автор: xvr 25.4.2011, 13:32 |
Угу. Желание прикрутить к С++ интроспекцию возникало, а вот делать аналог eval из многих скриптовых языков, как то не возникало |
| Автор: mes 25.4.2011, 13:34 | ||||
возникало Добавлено через 40 секунд
|
| Автор: Буратиныч 25.4.2011, 13:52 | ||
Есть работающий скрипт для одной платформы. Но т.к. он работает там медленно, есть необходимость перевести его в dll. Скорость обработки данных при этом увеличивается в разы. Вот это и есть цель. |
| Автор: xvr 25.4.2011, 13:55 | ||
Вам нужно или переписать скрипт на С/С++ (без всяких обращений по вычисляемым именам), или сделать JIT для интерпретатора скрипта Других путей не вижу |
| Автор: boostcoder 25.4.2011, 14:06 |
| еще вариант, подцепить скриптовый движок. благо таковых мильен. Добавлено @ 14:09 но все равно не понимаю зачем писать адаптацию под имеющийся скрипт. в любом случае, и логичней и правильней будет переписать задачу которую он выполняет на с++. Добавлено через 3 минуты и 13 секунд чего-то вы недоговариваете ;) Добавлено через 3 минуты и 29 секунд скрипт секретный? показывай ;) Добавлено через 4 минуты и 39 секунд жесть.. у Вас есть реальный пример, где только такой способ приемлем? |
| Автор: Буратиныч 25.4.2011, 14:57 |
| Этим и занимаюсь, переписываю на С++, но как могу. Ведь мышление для этого тоже надо менять. Например, теорию Классов и ООП в целом я понимаю, но мышление ещё ориентируется на структурный код. Надо времени и практики, но вместе с тем хоть какой-то результат нужен уже сейчас. |
| Автор: boostcoder 25.4.2011, 15:02 |
| Автор: cupper 25.4.2011, 16:12 | ||||
это как если бы я попросил машину с крыльями, а мне дали машину с картонными крыльями. Для полной картины тогда нужно добавить сюда Boost.Any, но я им не пользовался и пробовать что то написать не буду. |
| Автор: boostcoder 25.4.2011, 16:28 |
кстати, так же никогда не использовал. и не очень представляю для чего оно нужно в с++, ибо полностью теряется информация о типе. единственное что могу представить, это именно для текущей задачи... к примеру, boost.variant еще как-то наверное можно применять, т.к. есть возможность хотя бы узнать перечень допустимых типов и в случае ошибки, получить компайл-тайм ошибку. так же, можно писать собственные визиторы для каждого пользовательского варианта. Добавлено через 6 минут и 13 секунд аффтар, скрипт давай! |
| Автор: mes 25.4.2011, 17:13 | ||
ну прежде всего я практически не встречал случая, когда только один способ приемлем.. ну а так у карты значений очень много применений Добавлено через 5 минут и 18 секунд
для полиморфного хранения.. хранение как void* не позволяет безопасно копировать и удалять.. а информация о типе вполне может быть ассоциирована другим способом, и тип может восстановлен когда понадобится.. |
| Автор: sergioK1 1.5.2011, 13:06 | ||
как это зачем можно в статью в журнал написать , можно студентов на экзамене подколоть, Буратиныч, читай про интерфесы (abstact classes) и забудь про динамику , иначе получишь английские слова русскими буквами |
| Автор: boostcoder 1.5.2011, 13:19 |
пример пожалуйста. |
| Автор: sergioK1 1.5.2011, 13:33 | ||
чего пример фактори ? вы шутите ? счас найду свой код на VB c конца 90-x , и приходилось подобный трюки придумывать там заодно и variant сплош и рядом был, тот что в бусте непонятно зачем, У меня попутно вопрос , хотел тему открыть, а она сама пришла зачем собсвенно этот буст нужен ? |
| Автор: boostcoder 1.5.2011, 13:56 |
школота детектед |
| Автор: sergioK1 2.5.2011, 13:45 | ||
В чем юмор ?. Буст это для кросплатформенных задач ?. Так Я понял из описания, так для этого придумали жаву . Меня уже 3 product manager это спросили что на нем делаеться лучше?, то-ка не надо типа жава это для монки кодеров |
| Автор: mes 2.5.2011, 14:40 | ||
без комментариев |
| Автор: boostcoder 2.5.2011, 14:42 |
присоединяюсь. не охота срачь разводить. есть задачи посерьезней ;) |
| Автор: bsa 3.5.2011, 10:40 | ||
Детский сад на выезде: "3 product manager" и "настоящии профи". Вместо того, чтобы сидеть за компьютером и отвлекать серьезных людей, пошел бы ты в школу и поучил бы русский язык... Ну на худой конец, почитал бы "Войну и мир", "Преступление и наказание" и еще что-нибудь из классиков (хотя, есть подозрение, что тебе еще по программе это рано). Глядишь, ошибок бы делал меньше. |
| Автор: sergioK1 12.5.2011, 03:06 | ||
[QUOTE=bsa,3.5.2011, 09:40]
А ты сколько языков знаешь, на многих грамотно пишешь и всегда ? |
| Автор: asmdzen 12.5.2011, 08:39 | ||
ктонибудь может показать как прикрутить boost.variant к map'у именно для этой задачи? т.е. все нужные переменные разных типов хранятся в мапе, обращатся можно както так:
|