Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Динамическое имя 
:(
    Опции темы
Буратиныч
Дата 15.3.2011, 11:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 77
Регистрация: 15.3.2011

Репутация: нет
Всего: нет



Как созидается динамическое имя переменной и извлекается из него значение?

Допустим i=1 и переменной name1 надо присвоить десятку, т.е.
"name" + i = 10
а затем извлечь из из этой переменной значение.
PM MAIL   Вверх
bsa
Дата 15.3.2011, 11:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



Буратиныч, ты сначала сформулируй, что такое "переменная с динамическим именем" и зачем это может быть нужно.

Это сообщение отредактировал(а) bsa - 15.3.2011, 11:40
PM   Вверх
mes
Дата 15.3.2011, 11:43 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250





--------------------
PM MAIL WWW   Вверх
Буратиныч
Дата 15.3.2011, 11:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 77
Регистрация: 15.3.2011

Репутация: нет
Всего: нет



Цитата(bsa @ 15.3.2011,  11:39)
Буратиныч, ты сначала сформулируй, что такое "переменная с динамическим именем" и зачем это может быть нужно.

Сформулировал как смог  smile 
Допустим имеется цикл. Переменная i заранее не известна. Поэтому в зависимости от итерации надо присваивать значения.

name1 = 10
name2 = 20
или 
"name" + i = i * 10;
PM MAIL   Вверх
mes
Дата 15.3.2011, 12:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



http://liveworkspace.org/code/119cc878a00e...6b69c871f8d26c8 (подправлено)

Цитата(Буратиныч @  15.3.2011,  10:46 Найти цитируемый пост)
Допустим имеется цикл. Переменная i заранее не известна. 

а про обычные массивы Вы в курсе ?

Добавлено @ 12:11
http://liveworkspace.org/code/19cb2862db5d...7183837f046a628

Это сообщение отредактировал(а) mes - 15.3.2011, 13:03


--------------------
PM MAIL WWW   Вверх
Буратиныч
Дата 15.3.2011, 12:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 77
Регистрация: 15.3.2011

Репутация: нет
Всего: нет



Цитата(mes @ 15.3.2011,  12:06)
http://liveworkspace.org/code/216bc71a888f...c70694be9a1016f

Добавлено @ 12:10
Цитата(Буратиныч @  15.3.2011,  10:46 Найти цитируемый пост)
Допустим имеется цикл. Переменная i заранее не известна. 

а про обычные массивы Вы в курсе ?

Добавлено @ 12:11
http://liveworkspace.org/code/19cb2862db5d...7183837f046a628

mes, спасибо! Но почему выскакивает ошибка?
Error    2    error C2601: 'arr' : local function definitions are illegal

PM MAIL   Вверх
mes
Дата 15.3.2011, 12:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(Буратиныч @  15.3.2011,  11:55 Найти цитируемый пост)
 local function definitions are illegal

потому что пытаетесь определить функцию внутри другой функции.. 



--------------------
PM MAIL WWW   Вверх
Буратиныч
Дата 15.3.2011, 16:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 77
Регистрация: 15.3.2011

Репутация: нет
Всего: нет



Хочу из следующих данных:
int name0 = 1;
int name1 = 11;
int name2 = 22;

получить строчку:
name3=22 name2=11 name1=1 name0=1

но  код ниже мне всё нулит. В чём ошибка?
Код

#include <map>
#include <string>
#include <iostream>
#include <sstream>


std::map<std::string, int> ints;

std::string  arr(int i) 
{   
   std::ostringstream os;
   os << "name";
   os << i;
   
   return os.str();
}

int name0 = 1;
int name1 = 11;
int name2 = 22;

int main () 
{
    std::string var = "name";
    
    for (int i=2; i>=0; i--)  
       ints[arr(i+1)] = ints[arr(i)];

    for (int i=3; i>=0; i--)  
      std::cout<< arr(i)<<"="<<ints[arr(i)] << " ";
}

PM MAIL   Вверх
mes
Дата 15.3.2011, 17:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(Буратиныч @  15.3.2011,  15:11 Найти цитируемый пост)
но  код ниже мне всё нулит. В чём ошибка?

в том, что не поняли его назначение.. 
для вашего случая подойдут обычные массивы :
http://liveworkspace.org/code/28ff4d017e45...aac84ed8246f077


--------------------
PM MAIL WWW   Вверх
Буратиныч
Дата 16.3.2011, 12:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 77
Регистрация: 15.3.2011

Репутация: нет
Всего: нет



Цитата(mes @ 15.3.2011,  17:51)
Цитата(Буратиныч @  15.3.2011,  15:11 Найти цитируемый пост)
но  код ниже мне всё нулит. В чём ошибка?

в том, что не поняли его назначение.. 
для вашего случая подойдут обычные массивы :
http://liveworkspace.org/code/28ff4d017e45...aac84ed8246f077

Нда, действительно массивы простое и гениальное решение. Только чтобы понять, мне это пришлось повторить дважды  smile 

1) А если размер массива выясняется только в конце цикла, т.е. не известно сколько там будет "name", может только 3, может миллион, то как его объявлять? Сразу резервировать память под миллион элементов?

2) Почему цикл считает вперёд, а не назад, как хотелось бы, начиная с меньшего к большему, а не наоборот:
Код

                            for(hx1 = Hcount-1; hx1 > 1; --hx1) 
                            {
                                for(hx2 = hx1-1; hx2 > 0; --hx2) 
                                {
                                    Hp1 = Hi[hx1];
                                    Hp2 = Hi[hx2];
                                  TRACE(_T("hx1 = %d, hx1 = %d, Hp1 = %d, Hp2 = %d.\n"),hx1,hx2,Hp1,Hp2);


В Output выводит
Код

hx1 = 4, hx1 = 3, Hp1 = 325, Hp2 = 232.
hx1 = 4, hx1 = 2, Hp1 = 325, Hp2 = 169.
hx1 = 4, hx1 = 1, Hp1 = 325, Hp2 = 117.
hx1 = 3, hx1 = 2, Hp1 = 232, Hp2 = 169.
hx1 = 3, hx1 = 1, Hp1 = 232, Hp2 = 117.
hx1 = 2, hx1 = 1, Hp1 = 169, Hp2 = 117.
hx1 = 8, hx1 = 7, Hp1 = 501, Hp2 = 488.
hx1 = 8, hx1 = 6, Hp1 = 501, Hp2 = 431.
hx1 = 10, hx1 = 9, Hp1 = -858993460, Hp2 = -858993460.
First-chance exception at 0x603c2cdd (Patterns.dll) in Broker.exe: 0xC0000005: Access violation reading location 0x3826ccd8.


Значение Hcount = 9
PM MAIL   Вверх
mes
Дата 16.3.2011, 15:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(Буратиныч @  16.3.2011,  11:53 Найти цитируемый пост)
 А если размер массива выясняется только в конце цикла

если C++, тo можно просто использовать /]std::vector

Цитата(Буратиныч @  16.3.2011,  11:53 Найти цитируемый пост)
Почему цикл считает вперёд, а не назад, как хотелось бы, начиная с меньшего к большему, а не наоборот:

 чтоб считал наоборот, замените -- на ++, а > на <.. 
или я не так понял вопроса?



--------------------
PM MAIL WWW   Вверх
Буратиныч
Дата 16.3.2011, 15:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 77
Регистрация: 15.3.2011

Репутация: нет
Всего: нет



Цитата(mes @ 16.3.2011,  15:21)
 чтоб считал наоборот, замените -- на ++, а > на <.. 
или я не так понял вопроса?

Смысл такой, чтоб обрабатывал числа от 9 до 1.
Цикл начинается с hx1 = 9-1, т.е. 8, и пока hx1 больше единицы на каждой итерации отнимать по 1.

PM MAIL   Вверх
mes
Дата 16.3.2011, 15:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(Буратиныч @  16.3.2011,  14:31 Найти цитируемый пост)
Смысл такой, чтоб обрабатывал числа от 9 до 1.
Цикл начинается с hx1 = 9-1, т.е. 8, и пока hx1 больше единицы на каждой итерации отнимать по 1.

ну и ? в чем проблема то ? 
http://liveworkspace.org/code/a29f3b9b0300...07fc344079c3b75


--------------------
PM MAIL WWW   Вверх
Буратиныч
Дата 16.3.2011, 16:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 77
Регистрация: 15.3.2011

Репутация: нет
Всего: нет



Прилагаю скриншот.
Не знаю почему, но почему-то в первом условии for получается 10 = 9 - 1

Присоединённый файл ( Кол-во скачиваний: 15 )
Присоединённый файл  snap3.jpg 38,64 Kb
PM MAIL   Вверх
mes
Дата 16.3.2011, 16:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(Буратиныч @  16.3.2011,  15:09 Найти цитируемый пост)
Не знаю почему, но почему-то в первом условии for получается 10 = 9 - 1 

значит такой отладчик... не стоит верить каждому его слову  smile 


--------------------
PM MAIL WWW   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0756 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.