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

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

Войти
Регистрация
Восстановить пароль
 
daslex
1271 / 516 / 106
Регистрация: 02.08.2011
Сообщений: 2,668
#1

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

09.04.2012, 14:33. Просмотров 408. Ответов 6
Метки нет (Все метки)

Так ошибки не возникает
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
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Можно ли переменную финализировать для подобной задачи? (C++):

Где можно достать исходники программы подобной помошнику MS Ofice ? - C++
Где можно достать исходники программы подобной помошнику MS Ofice ?

Что можно подставить в переменную int для сравнений с другими числами? - C++
Задание: Дана матрица размером nxm. Упорядочить ее столбцы по возрастанию их наименьших элементов. Нужно подставить что-нибудь в...

Можно ли создать в C++ ограниченную переменную (для экономии памяти) без использования классов - C++
Например, переменную, скажем, test, которая принимает значение в диапазоне (-180..+180)

С чего начать решение подобной задачи? - Электричество и магнетизм
На занулённый корпус электроприёмника, подключённого к системе TN (Uф = 220 В), произошло замыкание одной из фаз. Сопротивление нулевого...

Можно ли снять блокировку выделения с подобной страницы? - JavaScript
Тут такая беда, нужно распечатать вопросы с сайта, но недавно его переделали так, что все вопросы на отдельных страница (аж 50 штук), да...

Выбор движка для FPS-подобной игры - Графика и игры
Давненько есть идея перевести одну 2D - игру на рельсы 3D, тем самым осовременив ее технологически. И хотелось бы узнать, какой движок для...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
dimcoder
Полярный
458 / 431 / 67
Регистрация: 11.09.2011
Сообщений: 1,129
09.04.2012, 14:35 #2
Не, так нельзя. Константа должна задаваться на этапе компиляции. Тут поможет динамическое программирование.
C++
1
2
3
4
int a=222;
 char *Buf = new char[a];
//Работаете как с обычным массивом
delete [] Buf;   //Не забываем очистить выделенную раннее память
diagon
Higher
1929 / 1195 / 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
В астрале
Эксперт С++
7970 / 4732 / 321
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 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
1271 / 516 / 106
Регистрация: 02.08.2011
Сообщений: 2,668
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 и чтобы как-то разгрузить память и увеличить скорость работы мне нужно снова поменять значение а.

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

В С++ я очень слаб, поэтому правильно поставить вопрос мне сложно. При динамическом выделении памяти так наверное можно сделать. Вот и нужно мне узнать как устанавливать новую размерность (измененное значение а)
ForEveR
В астрале
Эксперт С++
7970 / 4732 / 321
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 3
09.04.2012, 18:24 #7
daslex, В С++ вектор или любой другой контейнер. Если нет возможности использовать STL - при изменении размера - выделяем новую память под n элементов. Копируем в новую память все что есть в a (в случае если увеличиваем размер или же n элементов из a). Удаляем a. Устаналиваем указатель a на новую область памяти, в которую мы скопировали элементы. Не забываем менять размеры (переменные int), дабы не запутаться в дальнейшем. По большому счету надо реализовать класс динамического массива.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.04.2012, 18:24
Привет! Вот еще темы с ответами:

Можно ли преобразать переменную bool в переменную int, short. И переменную string в переменную short, int и - C#
И переменную string в переменную short, int и т.д.

Записи в 2 поля: стоит ли использовать БД для хранения подобной информации - Visual Basic .NET
Здравствуйте..Подскажите пожалуйста...Как организовать создание новой записи? То есть когда нажимаешь на кнопку, то в два поля надо ввести...

Финализировать диск без записи - DVD, Blu-ray
Всем доброго времени суток! Мне нужно завершить (финализировать, закрыть)DVD диск. На нем была записана одна сессия, но финализировать...

Можно ли использовать Python для решения этой задачи ? - PHP
постановка задачи(минимум) - Каждый ученик/его родители (2000 учеников в школе) может, взависемости от login , password (в любое время)...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
09.04.2012, 18:24
Ответ Создать тему
Опции темы

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