Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 15, средняя оценка - 4.87
PMike
3 / 3 / 1
Регистрация: 16.04.2009
Сообщений: 127
#1

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

16.07.2010, 13:04. Просмотров 2574. Ответов 28
Метки нет (Все метки)

Всем доброго времени суток,

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

т.е.

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

Глобальная переменная определена в хидере. Компилятор ругается на то, что переменная переопределена несколько раз
Исходники: /* main.cpp */ #include &quot;hider.h&quot; int main(void) { return 0;...

Переменная или переменная и условие
Привет всем. Стало интересно. Есть предположим функция. В ней ссылкой...

Индекс
Немного ламерский вопрос, но все же как в данной проге вывести вместо значения...

Переменная
Мне нужная переменная(ые) в 1 байт. Где её можно взять?

переменная
#include &lt;iostream&gt; using namespace std; void func1(); void func2(); ...

Индекс массива
Необходимо составить программу, которая бы меняла местами в строке первую и...

28
time2die
51 / 51 / 10
Регистрация: 25.05.2010
Сообщений: 182
16.07.2010, 13:13 #2
а зачем ?
0
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;
}
0
el Gato Estelar
9 / 9 / 1
Регистрация: 26.05.2010
Сообщений: 36
16.07.2010, 13:17 #4
Ну в пхп такое проблем не вызывает, а вот в плюсах...Если я не ошибаюсь, то на этапе компиляции, создаётся таблица имён переменных, т.е. ему надо знать как переменные называются ещё до выполнения программы, так что здесь так не получится. А, действительно, зачем? Есть же альтернатива в виде массивов.
0
Mr.X
Эксперт С++
3178 / 1705 / 435
Регистрация: 03.05.2010
Сообщений: 3,867
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;
}
0
Evg
Эксперт CАвтор FAQ
18937 / 6898 / 512
Регистрация: 30.03.2009
Сообщений: 19,432
Записей в блоге: 30
17.07.2010, 10:15 #6
Цитата Сообщение от PMike Посмотреть сообщение
как получить название переменной, получаемое путем конкатенации строки и индекса i
Никак. Такое можно только в интерпретируемых языках, а Си\Си++ - компилируемые
1
Aye Aye
370 / 284 / 97
Регистрация: 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") {}
}
1
PMike
3 / 3 / 1
Регистрация: 16.04.2009
Сообщений: 127
19.07.2010, 09:44  [ТС] #8
Всем спасибо за ответы

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

Добавлено через 1 минуту
а может эту задачку можно как-то решить за счет директив препроцессора?
0
CyBOSSeR
Эксперт С++
2309 / 1682 / 148
Регистрация: 06.03.2009
Сообщений: 3,675
19.07.2010, 09:47 #9
Цитата Сообщение от PMike Посмотреть сообщение
а может эту задачку можно как-то решить за счет директив препроцессора?
Нет, не получится.
Цитата Сообщение от PMike Посмотреть сообщение
Есть целый ряд переменных одного типа, например TextLabel и т.п., их много, целый массив mxn.
Проинициализировать их нужно в цикле, вот от сюда и такая задачка.
Загони их в массивы и инициализируй в цикле.
1
el Gato Estelar
9 / 9 / 1
Регистрация: 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, вот только толку? всё равно, обращаться к переменным, генерируя имя на лету -- не получится, а директивы препроцессора просто задают алиас, синоним, не создавая при этом новую сущность.
0
PMike
3 / 3 / 1
Регистрация: 16.04.2009
Сообщений: 127
19.07.2010, 10:33  [ТС] #11
массив - вариант.
я его не рассматривал, т.к. он займет слишком много памяти. всем спасибо за ответы :-)
0
el Gato Estelar
9 / 9 / 1
Регистрация: 26.05.2010
Сообщений: 36
19.07.2010, 10:36 #12
а ты думаешь
C++
1
int var1, var2;
займёт места меньше, чем
C++
1
int var[2];
?
0
PMike
3 / 3 / 1
Регистрация: 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];
:-)
0
el Gato Estelar
9 / 9 / 1
Регистрация: 26.05.2010
Сообщений: 36
20.07.2010, 09:48 #14
тогда тебе нужен интерпретирующий язык, на плюсах ты такое не сделаешь
0
CyBOSSeR
Эксперт С++
2309 / 1682 / 148
Регистрация: 06.03.2009
Сообщений: 3,675
20.07.2010, 10:12 #15
Цитата Сообщение от PMike Посмотреть сообщение
я говорю о том, чтобы создавать переменную в цикле
Если ты будешь создавать автоматическую переменную внутри цикла, то по окончанию каждой итерации она будет уничтожатся.
0
accept
4833 / 3254 / 454
Регистрация: 10.12.2008
Сообщений: 10,569
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++ во многих структурах выделение памяти проводится внутри автоматически

 Комментарий модератора 
Для оформления кода используйте соответствующие теги.
0
CyBOSSeR
Эксперт С++
2309 / 1682 / 148
Регистрация: 06.03.2009
Сообщений: 3,675
20.07.2010, 10:27 #17
accept, использовать malloc, calloc, free, а уж тем более realloc в C++ - не очень хорошая идея - есть new и delete. А лучше использовать вектора std::vector и строки std::string, чтобы с памятью не мучатся.
0
accept
4833 / 3254 / 454
Регистрация: 10.12.2008
Сообщений: 10,569
20.07.2010, 10:55 #18
я ему в C написал, чтобы он понимал, что когда он будет использовать vector, что там, внутри, как раз это и происходит
0
CyBOSSeR
Эксперт С++
2309 / 1682 / 148
Регистрация: 06.03.2009
Сообщений: 3,675
20.07.2010, 12:19 #19
accept, std::vector (как и все другие контейнеры STL) не использует для работы c памятью функции языка Си, он использует переданный в качестве аргумента шаблона аллокатор. Для работы с динамической памятью в C++ используются операторы new и delete, их и нужно использовать.
0
FireNovel
150 / 73 / 27
Регистрация: 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 настолько лучше работают??
Я в тонкостях С++ не разбираюсь, очень хотел бы узнать ваше мнение в подробностях.
0
20.07.2010, 12:57
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.07.2010, 12:57
Привет! Вот еще темы с решениями:

индекс масива
закидайте меня камнями, но почему индексация в масивах с 0, потомучто...

Умный индекс
Добрый день! Хочу сделать хитрый класс для индекса в диапазоне от 0 до 100,...

индекс массива
Помогите люди!!!!! вывести индекс наименьшего элемента массива.

массив и индекс
объявляя массив и его индекс,индекс должен быть константой.Почему? Препод...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

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