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

Можно ли переменную финализировать для подобной задачи? - C++

Восстановить пароль Регистрация
 
daslex
1084 / 494 / 101
Регистрация: 02.08.2011
Сообщений: 2,408
09.04.2012, 14:33     Можно ли переменную финализировать для подобной задачи? #1
Так ошибки не возникает
C++
1
2
 const N=222;
 char Buf[N];
Но если так, то ошибка
C++
1
2
3
 int a=222;
 const N=a; // Тут я не знаю как правильно
 char Buf[N];
Сам вопрос вот в чем
Реальна ли такая манипуляция переменными, что сначала вычисляется некоторое значение (а) и потом это значение финализируется (Я пытался задать константу N=a) для прописывания в индексах char Buf[N];

Как лучше задать вопрос не знаю, но надеюсь понятно написал
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.04.2012, 14:33     Можно ли переменную финализировать для подобной задачи?
Посмотрите здесь:

Можно ли записать в переменную значение в 16ричной системе счисления? C++
C++ Можно ли вызвать определенную переменную с шаблона
Можно ли в С++ сгенерить масив разерома в переменную типа int? C++
Где можно достать исходники программы подобной помошнику MS Ofice ? C++
Записать день в переменную d,месяц в переменную m, год в переменную y C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
dimcoder
Полярный
 Аватар для dimcoder
449 / 422 / 66
Регистрация: 11.09.2011
Сообщений: 1,108
09.04.2012, 14:35     Можно ли переменную финализировать для подобной задачи? #2
Не, так нельзя. Константа должна задаваться на этапе компиляции. Тут поможет динамическое программирование.
C++
1
2
3
4
int a=222;
 char *Buf = new char[a];
//Работаете как с обычным массивом
delete [] Buf;   //Не забываем очистить выделенную раннее память
diagon
Higher
 Аватар для diagon
1920 / 1186 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
09.04.2012, 14:39     Можно ли переменную финализировать для подобной задачи? #3
Цитата Сообщение от dimcoder Посмотреть сообщение
Тут поможет динамическое программирование.
Динамическое программирование и динамическое выделение памяти - совершенно разные вещи.)
По теме - можно использовать STL, например
C++
1
2
3
int N;
std::cin >> N;
std::vector< int > vec(N); //массив размера N
Либо расширение gcc(под другие компиляторы непереносимо):
C++
1
2
3
int N;
std::cin >> N;
int arr[N];
Ну или выделять памяти динамически, как показали выше.
dimcoder
09.04.2012, 14:40
  #4

Не по теме:

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

ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
09.04.2012, 14:42     Можно ли переменную финализировать для подобной задачи? #5
Ну а если вычисление зависит от чего-либо известного на этапе компиляции - тогда можно.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <iostream>
 
namespace
{
 
const int some_param = 10;
 
}
 
template<int N>
constexpr int calculate_size()
{
   return some_param * N;
}
 
int main()
{
   int array[calculate_size<2>()];
}
daslex
1084 / 494 / 101
Регистрация: 02.08.2011
Сообщений: 2,408
09.04.2012, 18:20  [ТС]     Можно ли переменную финализировать для подобной задачи? #6
Цитата Сообщение от dimcoder Посмотреть сообщение
1
C++
1
2
3
4
int a=222;
 char *Buf = new char[a];
//Работаете как с обычным массивом
delete [] Buf; //Не забываем очистить выделенную раннее память
Вот в таком варианте у меня не выходит даже вывести на экран переменную = индекс

C++
1
2
3
4
5
6
7
8
int a=222;
 char *Buf = new char[a];
  cout<<"Buf = "<<Buf<<endl;      //И так пробовал вывести  
  cout<<"Buf = "<<Buf[0]<<endl;  //И так пробовал
  
  Buf[0]=a; //Так как первые две попытки неудачны вышли, решил насильно присвоить в начало массива
  cout<<"Buf[0] = "<<Buf[0]<<endl; //Так тоже не получается
delete [] Buf; //Не забываем очистить выделенную раннее память

Насколько я понимаю при обращении к числу Buf на экран должно выводиться 222. Так как я подразумеваю, что в индекс должно прописаться именно это число.

По варианту с STL мне не подходит. Реализовать нужно как реализовывали древние студенты, которые программировали еще в C++ для DOS

С третьим предложенным вариантом еще не разбирался

Добавлено через 50 минут
Цитата Сообщение от daslex Посмотреть сообщение
от в таком варианте у меня не выходит даже вывести на экран переменную = индекс
всё верно. я разобрался

Добавлено через 30 минут
Только другой вопрос появился.
Если переменная a не финализируется, а периодически меняет значение.

Например при первом вычислении a=10 и я при разработке не знаю на сколько a увеличится.
При этом я не хочу выделять лишнюю память без надобности. И я решил выделить ровно столько, сколько надо для а символов.
Но во время работы программы потребность в количестве символов возросла например резко до 10.000 и я хочу увеличить а, а потом потребность а упала, например до 5 и чтобы как-то разгрузить память и увеличить скорость работы мне нужно снова поменять значение а.

Вот как-то так. Есть ли не сложный вариант элегантного решения рационального использования памяти.

В С++ я очень слаб, поэтому правильно поставить вопрос мне сложно. При динамическом выделении памяти так наверное можно сделать. Вот и нужно мне узнать как устанавливать новую размерность (измененное значение а)
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.04.2012, 18:24     Можно ли переменную финализировать для подобной задачи?
Еще ссылки по теме:

Как (можно ли) инициализировать переменную в структуре? C++
C++ Можно ли объявить переменную типа IOPCServer?
Почему можно переопределять переменную в цикле? C++

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

Или воспользуйтесь поиском по форуму:
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
09.04.2012, 18:24     Можно ли переменную финализировать для подобной задачи? #7
daslex, В С++ вектор или любой другой контейнер. Если нет возможности использовать STL - при изменении размера - выделяем новую память под n элементов. Копируем в новую память все что есть в a (в случае если увеличиваем размер или же n элементов из a). Удаляем a. Устаналиваем указатель a на новую область памяти, в которую мы скопировали элементы. Не забываем менять размеры (переменные int), дабы не запутаться в дальнейшем. По большому счету надо реализовать класс динамического массива.
Yandex
Объявления
09.04.2012, 18:24     Можно ли переменную финализировать для подобной задачи?
Ответ Создать тему
Опции темы

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