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

Переменная + индекс - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 15, средняя оценка - 4.87
PMike
3 / 3 / 0
Регистрация: 16.04.2009
Сообщений: 127
16.07.2010, 13:04     Переменная + индекс #1
Всем доброго времени суток,

знает кто-нибудь, как получить название переменной, получаемое путем конкатенации строки и индекса i?

т.е.

C++
1
2
3
4
5
6
char str[4] = "var";
 
( i = 0; i<10; i++)
{
  int ...//здесь нужно получить переменную с именем vari (var1 var2 var3 etc)
}
Буду очень рад, если кто-нибудь откликнется :-)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.07.2010, 13:04     Переменная + индекс
Посмотрите здесь:

C++ индекс массива
C++ переменная
массив и индекс C++
Индекс C++
C++ Переменная
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
time2die
51 / 51 / 3
Регистрация: 25.05.2010
Сообщений: 182
16.07.2010, 13:13     Переменная + индекс #2
а зачем ?
rrock.ru
9 / 9 / 1
Регистрация: 15.07.2010
Сообщений: 19
16.07.2010, 13:16     Переменная + индекс #3
не проще сделать:

C++
1
2
3
4
5
6
int var[10];
 
( i = 0; i<10; i++)
{
var[i] = i;
}
el Gato Estelar
 Аватар для el Gato Estelar
9 / 9 / 0
Регистрация: 26.05.2010
Сообщений: 36
16.07.2010, 13:17     Переменная + индекс #4
Ну в пхп такое проблем не вызывает, а вот в плюсах...Если я не ошибаюсь, то на этапе компиляции, создаётся таблица имён переменных, т.е. ему надо знать как переменные называются ещё до выполнения программы, так что здесь так не получится. А, действительно, зачем? Есть же альтернатива в виде массивов.
Mr.X
Эксперт С++
 Аватар для Mr.X
2796 / 1572 / 246
Регистрация: 03.05.2010
Сообщений: 3,648
16.07.2010, 18:04     Переменная + индекс #5
Напрямую C++ такого не поддерживает. Разве что вот так сделать:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <iostream>
#include <map>
#include <string>
 
typedef std::string           T_str;
typedef std::map<T_str, int>  T_str_int;
 
int main()
{   
    T_str_int  i_perem;     
    for(int i = 0; i < 10; ++i)
    {
        i_perem[T_str("var_") += ('0' + i)] = i;
    }       
    std::cout << "var_5 = "              
              << i_perem["var_5"]
              << std::endl;
    return 0;
}
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16821 / 5242 / 318
Регистрация: 30.03.2009
Сообщений: 14,118
Записей в блоге: 26
17.07.2010, 10:15     Переменная + индекс #6
Цитата Сообщение от PMike Посмотреть сообщение
как получить название переменной, получаемое путем конкатенации строки и индекса i
Никак. Такое можно только в интерпретируемых языках, а Си\Си++ - компилируемые
Aye Aye
 Аватар для Aye Aye
367 / 281 / 36
Регистрация: 17.12.2009
Сообщений: 567
18.07.2010, 08:26     Переменная + индекс #7
можно класс написать с текстовым полем "имя", и создавать в цикле экземпляры этого класса:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class var{
string name;
public:
    var(string s):name(s){}
    string getName(){return name;}
};
//.....
char str[4] = "var";
 
for ( i = 0; i<10; i++)
{
    var variable(string(str).push_back('0'+i));
    //если где то понадобится имя обьекта, то:
    if (variable.getName() == "var6") {}
}
PMike
3 / 3 / 0
Регистрация: 16.04.2009
Сообщений: 127
19.07.2010, 09:44  [ТС]     Переменная + индекс #8
Всем спасибо за ответы

Отвечаю на вопрос "зачем" :-)
Есть целый ряд переменных одного типа, например TextLabel и т.п., их много, целый массив mxn.
Проинициализировать их нужно в цикле, вот от сюда и такая задачка.

Добавлено через 1 минуту
а может эту задачку можно как-то решить за счет директив препроцессора?
CyBOSSeR
Эксперт C++
 Аватар для CyBOSSeR
2293 / 1663 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
19.07.2010, 09:47     Переменная + индекс #9
Цитата Сообщение от PMike Посмотреть сообщение
а может эту задачку можно как-то решить за счет директив препроцессора?
Нет, не получится.
Цитата Сообщение от PMike Посмотреть сообщение
Есть целый ряд переменных одного типа, например TextLabel и т.п., их много, целый массив mxn.
Проинициализировать их нужно в цикле, вот от сюда и такая задачка.
Загони их в массивы и инициализируй в цикле.
el Gato Estelar
 Аватар для el Gato Estelar
9 / 9 / 0
Регистрация: 26.05.2010
Сообщений: 36
19.07.2010, 09:51     Переменная + индекс #10
Ну вообще, да -- это применение массивов по учебнику
А в принципе можно поизвращаться --
C++
1
2
3
4
5
6
7
#define v0 v[0]
#define v1 v[1]
....
int v[2];
v[0]=1;
printf("\nSomething strange=%d", v0);
..
выведет 1, вот только толку? всё равно, обращаться к переменным, генерируя имя на лету -- не получится, а директивы препроцессора просто задают алиас, синоним, не создавая при этом новую сущность.
PMike
3 / 3 / 0
Регистрация: 16.04.2009
Сообщений: 127
19.07.2010, 10:33  [ТС]     Переменная + индекс #11
массив - вариант.
я его не рассматривал, т.к. он займет слишком много памяти. всем спасибо за ответы :-)
el Gato Estelar
 Аватар для el Gato Estelar
9 / 9 / 0
Регистрация: 26.05.2010
Сообщений: 36
19.07.2010, 10:36     Переменная + индекс #12
а ты думаешь
C++
1
int var1, var2;
займёт места меньше, чем
C++
1
int var[2];
?
PMike
3 / 3 / 0
Регистрация: 16.04.2009
Сообщений: 127
20.07.2010, 08:58  [ТС]     Переменная + индекс #13
:-) Нет конечно :-)

я говорю о том, чтобы создавать переменную в цикле
т.е.

C
1
2
3
4
for (i=0;i<1000;i++)
{
  int var1;
}
Думаю, это займет меньше места, чем
C
1
int var[1000];
:-)
el Gato Estelar
 Аватар для el Gato Estelar
9 / 9 / 0
Регистрация: 26.05.2010
Сообщений: 36
20.07.2010, 09:48     Переменная + индекс #14
тогда тебе нужен интерпретирующий язык, на плюсах ты такое не сделаешь
CyBOSSeR
Эксперт C++
 Аватар для CyBOSSeR
2293 / 1663 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
20.07.2010, 10:12     Переменная + индекс #15
Цитата Сообщение от PMike Посмотреть сообщение
я говорю о том, чтобы создавать переменную в цикле
Если ты будешь создавать автоматическую переменную внутри цикла, то по окончанию каждой итерации она будет уничтожатся.
accept
4837 / 3236 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
20.07.2010, 10:16     Переменная + индекс #16
Цитата Сообщение от PMike
я говорю о том, чтобы создавать переменную в цикле
переменная, созданная внутри цикла, существует только внутри цикла
дело не в цикле, а в блоке

переменные int var1, var2, var3; занимают столько же места, сколько int var[3];

если переменные создаются, то они не удаляются и занимают память
переменная действует до конца блока, поэтому, если ты создаёшь переменную в main(), то она занимает память до конца программы

а чтобы такого не было, есть механизм динамического выделения памяти, память можно выделять для любых нужд, а потом освобождать и выделять повторно для других нужд

поэтому все твои переменные типа TextLabel1, TextLabel2, TextLabel3
можно привести к виду
C++
1
char **TextLabel;
потом
C++
1
TextLabel = (char **) calloc(3, sizeof(char *));
потом
C++
1
TextLabel[0] = "abcd"; TextLabel[1] = "efgh"; TextLabel[2] = "ijkl";
хочешь увеличить TextLabel в количестве, есть realloc(), ею и уменьшить можно

а потом просто
C++
1
free(TextLabel);
память, которую занимал массив, прикреплённый к указателю TextLabel, становится доступной для новых выделений памяти

это по-простецки

в C++ во многих структурах выделение памяти проводится внутри автоматически

 Комментарий модератора 
Для оформления кода используйте соответствующие теги.
CyBOSSeR
Эксперт C++
 Аватар для CyBOSSeR
2293 / 1663 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
20.07.2010, 10:27     Переменная + индекс #17
accept, использовать malloc, calloc, free, а уж тем более realloc в C++ - не очень хорошая идея - есть new и delete. А лучше использовать вектора std::vector и строки std::string, чтобы с памятью не мучатся.
accept
4837 / 3236 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
20.07.2010, 10:55     Переменная + индекс #18
я ему в C написал, чтобы он понимал, что когда он будет использовать vector, что там, внутри, как раз это и происходит
CyBOSSeR
Эксперт C++
 Аватар для CyBOSSeR
2293 / 1663 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
20.07.2010, 12:19     Переменная + индекс #19
accept, std::vector (как и все другие контейнеры STL) не использует для работы c памятью функции языка Си, он использует переданный в качестве аргумента шаблона аллокатор. Для работы с динамической памятью в C++ используются операторы new и delete, их и нужно использовать.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.07.2010, 12:57     Переменная + индекс
Еще ссылки по теме:

C++ минимальный индекс
индекс масива C++
C++ Глобальная переменная определена в хидере. Компилятор ругается на то, что переменная переопределена несколько раз

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

Или воспользуйтесь поиском по форуму:
FireNovel
 Аватар для FireNovel
150 / 73 / 8
Регистрация: 09.04.2010
Сообщений: 297
20.07.2010, 12:57     Переменная + индекс #20
Цитата Сообщение от CyBOSSeR Посмотреть сообщение
accept, использовать malloc, calloc, free, а уж тем более realloc в C++ - не очень хорошая идея - есть new и delete. А лучше использовать вектора std::vector и строки std::string, чтобы с памятью не мучатся
CyBOSSeR, А почему такое не желание использовать malloc и т.п. ведь их не зря оставили в С++. Были бы они неполноценными их бы уже давно убрали.
Неужели new и delete настолько лучше работают??
Я в тонкостях С++ не разбираюсь, очень хотел бы узнать ваше мнение в подробностях.
Yandex
Объявления
20.07.2010, 12:57     Переменная + индекс
Ответ Создать тему
Опции темы

Текущее время: 02:06. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru