Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

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

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

16.07.2010, 13:04. Просмотров 2393. Ответов 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++):

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

Переменная или переменная и условие - C++
Привет всем. Стало интересно. Есть предположим функция. В ней ссылкой передается аргумент Status; Как лучше сделать? ...

Индекс - C++
Немного ламерский вопрос, но все же как в данной проге вывести вместо значения числа, его индекс в массиве? :) #include &lt;iostream&gt; ...

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

переменная - C++
#include &lt;iostream&gt; using namespace std; void func1(); void func2(); int count; // Это голобальная переменная int main()...

индекс масива - C++
закидайте меня камнями, но почему индексация в масивах с 0, потомучто договарилиси, Страуструп или че еще?

28
accept
4828 / 3249 / 165
Регистрация: 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
Эксперт С++
2306 / 1676 / 86
Регистрация: 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
4828 / 3249 / 165
Регистрация: 10.12.2008
Сообщений: 10,569
20.07.2010, 10:55 #18
я ему в C написал, чтобы он понимал, что когда он будет использовать vector, что там, внутри, как раз это и происходит
0
CyBOSSeR
Эксперт С++
2306 / 1676 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
20.07.2010, 12:19 #19
accept, std::vector (как и все другие контейнеры STL) не использует для работы c памятью функции языка Си, он использует переданный в качестве аргумента шаблона аллокатор. Для работы с динамической памятью в C++ используются операторы new и delete, их и нужно использовать.
0
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 настолько лучше работают??
Я в тонкостях С++ не разбираюсь, очень хотел бы узнать ваше мнение в подробностях.
0
Evg
Эксперт CАвтор FAQ
18449 / 6499 / 454
Регистрация: 30.03.2009
Сообщений: 18,132
Записей в блоге: 29
20.07.2010, 13:22 #21
FireNovel, malloc - это библиотечная функция, а не конструкция языка. В Си нет встроенных средств для работы с динамической памятью, а в Си++ - есть (но какие-то ущербные)
1
FireNovel
150 / 73 / 8
Регистрация: 09.04.2010
Сообщений: 297
20.07.2010, 13:39 #22
Цитата Сообщение от Evg Посмотреть сообщение
malloc - это библиотечная функция, а не конструкция языка
Эт я понимаю
Цитата Сообщение от Evg Посмотреть сообщение
В Си нет встроенных средств для работы с динамической памятью,а в Си++ - есть (но какие-то ущербные)
Evg, Вот, как раз про это(в чем заключается ущербность) я и хотел узнать, у людей хорошо разбирающихся и работающих с ними. Типа в чем их преимущества и недостатки. А то в той литературе с которой я сталкивался тупо писалось: "Забейте на malloc() и используйте new"


Может отдельную темку создать??
0
Evg
Эксперт CАвтор FAQ
18449 / 6499 / 454
Регистрация: 30.03.2009
Сообщений: 18,132
Записей в блоге: 29
20.07.2010, 13:45 #23
Цитата Сообщение от FireNovel Посмотреть сообщение
Evg, Вот, как раз про это(в чем заключается ущербность) я и хотел узнать, у людей хорошо разбирающихся и работающих с ними. Типа в чем их преимущества и недостатки. А то в той литературе с которой я сталкивался тупо писалось: "Забейте на malloc() и используйте new"
new - это аналог malloc'а, delete - аналог free, а вот аналога realloc нету. Принципиальные преимущества new перед malloc - это вызов конструкторов. Ещё нет аналога calloc, но в теории это рулится конструкторами (хотя по скорости как правило оказывается неэффективно)

Добавлено через 1 минуту
Самодельный менеджер памяти на Си оказывается, как правило, простым. На Си++ - как правило сложным
1
CyBOSSeR
Эксперт С++
2306 / 1676 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
20.07.2010, 13:46 #24
Цитата Сообщение от FireNovel Посмотреть сообщение
CyBOSSeR, А почему такое не желание использовать malloc и т.п. ведь их не зря оставили в С++.
Не оставить их просто не могли, как правильно сказал Evg это просто функции.
Цитата Сообщение от FireNovel Посмотреть сообщение
Неужели new и delete настолько лучше работают??
Дело не в лучше или хуже. new на самом деле чаще всего использует malloc для выделения памяти. Но есть очень существенная разница:
1. new вызывает конструкторы при выделении памяти, delete - деструкторы.
2. new кидает исключение при нехватке памяти.
3. new и delete перегружаемы, в том числе только для нужного класса.
1
FireNovel
150 / 73 / 8
Регистрация: 09.04.2010
Сообщений: 297
20.07.2010, 14:05 #25
На сколько я понимаю? если динамически выделять память, к примеру, для элементов всроеных типов, то разницы нет(new или malloc() ). а если нужна память под свои классы, то лучше new.
C++
1
2
3
char *p1, *p2;
p1 = malloc(3 * sizeof (char));
p2 = new char[3];
результат кода будет одинаков? Или есть еще нюансы
0
easybudda
Модератор
Эксперт CЭксперт С++
9719 / 5670 / 972
Регистрация: 25.07.2009
Сообщений: 10,915
20.07.2010, 14:08 #26
Цитата Сообщение от FireNovel Посмотреть сообщение
Неужели new и delete настолько лучше работают?
По-моему самая большая разница в том, что malloc() / calloc() / realloc() в случае, если память выделить не удалось, возвращают NULL и эту ситуацию программист должен сам отслеживать, а new / new [] в случае ошибки сами вызывают исключение (exception), которое прерывает выполнение программы. Кстати отсутствие аналога realloc() в С++ мне и самому не понятно...
1
fasked
Эксперт С++
4957 / 2537 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
20.07.2010, 14:13 #27
Цитата Сообщение от easybudda Посмотреть сообщение
Кстати отсутствие аналога realloc() в С++ мне и самому не понятно...
Потому что в концепции Си++ лежит использование классов, в том числе STL vector, list и т.д.
Использование собственных перераспределителей памяти приведет только к большему количеству ошибок.
Цитата Сообщение от easybudda Посмотреть сообщение
По-моему самая большая разница в том, что malloc() / calloc() / realloc() в случае, если память выделить не удалось, возвращают NULL и эту ситуацию программист должен сам отслеживать, а new / new [] в случае ошибки сами вызывают исключение (exception), которое прерывает выполнение программы
Можно сделать так, чтобы и new/delete возвращали NULL, но только надо ли это.
0
CyBOSSeR
Эксперт С++
2306 / 1676 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
20.07.2010, 22:35 #28
Цитата Сообщение от FireNovel Посмотреть сообщение
если динамически выделять память, к примеру, для элементов всроеных типов, то разницы нет(new или malloc() )
Да. Но не стоит использовать функции Си в С++.
Цитата Сообщение от FireNovel Посмотреть сообщение
если нужна память под свои классы, то лучше new.
Не лучше, а только new.
0
Evg
Эксперт CАвтор FAQ
18449 / 6499 / 454
Регистрация: 30.03.2009
Сообщений: 18,132
Записей в блоге: 29
22.07.2010, 20:23 #29
Цитата Сообщение от CyBOSSeR Посмотреть сообщение
Дело не в лучше или хуже. new на самом деле чаще всего использует malloc для выделения памяти. Но есть очень существенная разница:
1. new вызывает конструкторы при выделении памяти, delete - деструкторы.
2. new кидает исключение при нехватке памяти.
3. new и delete перегружаемы, в том числе только для нужного класса.
Добавил в http://www.cyberforum.ru/faq/thread130500.html (раздел 5.6)
Надеюсь, ты не против
0
22.07.2010, 20:23
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.07.2010, 20:23
Привет! Вот еще темы с ответами:

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

минимальный индекс - C++
#include &lt;iostream&gt; #include &lt;stdlib.h&gt; using namespace std; int badboys (double* a,int size); void mas_out (double* a,int size); ...

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

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


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

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

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