C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
Как определить массив известной размерности ?
Евгений
Отправлено: 16.02.2005, 22:11


Не зарегистрирован







Почему компилятор ругается на такой код:
CODE

int i = 10;
float m[i];


И вопрос такой: как сделать то, что приведено выше, но чтобы понравилось компилятору, не прибегая к динамическому созданию типа:
CODE

int i = 10;
float *a;
a = new float [i];


Я в процессе вычисления получаю длину массива, который и хочу определить. Вот как сделать ?
Valdemar
Отправлено: 17.02.2005, 08:29


Мастер участка

Группа: Участник
Сообщений: 433



Если размер массива вы получаете в процессе вычислений, то память под него придется выделять динамически, т.к. при таком объявлении массива int mas[i], i должна быть константой.
Gedeon
Отправлено: 17.02.2005, 09:11


Ветеран

Группа: Модератор
Сообщений: 1742



Совершенно верно, Вам надо или переменную обьявить как const int, но какой тогда в этом смысл, ну или используйте надоевший всем вектор. biggrin.gif

Отредактировано Gedeon — 17/02/2005, 10:13
AVC
Отправлено: 17.02.2005, 10:48


Ветеран

Группа: Модератор
Сообщений: 1583



А может его интересует как поработать с массивом, объявленным где то в другом месте? Тогда указатель и смещения.
Георгий
Отправлено: 17.02.2005, 11:51


Почетный железнодорожник

Группа: Модератор
Сообщений: 874



QUOTE (Евгений @ 16/02/2005, 22:11)
И вопрос такой: как сделать то, что приведено выше, но чтобы понравилось компилятору, не прибегая к динамическому созданию типа:
CODE

int i = 10;
float *a;
a = new float [i];

теории и без меня много сказали, и остаётся добавить только код
CODE
vector<float>a;
a.resize(i);
a[666]=13;
Boyko
Отправлено: 17.02.2005, 17:40


Станционный диспетчер

Группа: Участник
Сообщений: 88



Думаю что можно написать
CODE

void A(int i)
{
 float m[i];
 .............
}

int i = 10;
A(i);


Bond
Отправлено: 17.02.2005, 18:59


Станционный диспетчер

Группа: Участник
Сообщений: 142



Неправильно — компилятору все-таки необходима константа, дабы знать сколько памяти резервировать
Oper01
Отправлено: 18.02.2005, 00:21


Станционный диспетчер

Группа: Участник
Сообщений: 145



QUOTE
CODE  
vectora;
a.resize(i);
a[666]=13;


Поясните приведённый код. Просто не знаю что это и как .
Георгий
Отправлено: 18.02.2005, 02:50


Почетный железнодорожник

Группа: Модератор
Сообщений: 874



использовался класс-шаблон из библиотеки STL (стандартной библиотеки шаблонов) массив (vector).
объект хранит в себе массив объектов заданного типа (того, который после слова vector в угловых скобках написан) длину массива можно менять используя метод resize.
у объекта перегружен оператор [] причём и как возвращающий ссылку на значение, и значение. что позволяет использовать объект класса vector и как LValue и, как RValue.

более подробно см. книги ссылки на которые вываливает гугл при запросе "стандартная библиотека шаблонов"
Gedeon
Отправлено: 18.02.2005, 12:21


Ветеран

Группа: Модератор
Сообщений: 1742



Кстати а зачем делать resize у ентого вектора есть пушбэк к-рый добавляет и так, у него еще есть max_size к-рый возвращает огромные значения, а ресайзом я так понимаю надо пользоваться если за них вылазишь, или я не прав?
Георгий
Отправлено: 18.02.2005, 13:56


Почетный железнодорожник

Группа: Модератор
Сообщений: 874



если знаешь, что будешь добавлять по одному значению, то конечно пушбак, а если надо сразу кучу значений вставить — то сначала resize, а потом напрямую либо в память пиши, либо через перегруженный operator[]. отсутствие многократных, неявных resize, которые за пушем скрываются и последующих копирований областей памяти даст ощутимый выигрыш в скорости
Asher
Отправлено: 18.02.2005, 13:59


Мастер участка

Группа: Модератор
Сообщений: 550



Привет.
Если вылазишь — он сам ресайзится.
Явный вызов необходим чтобы избежать лишних выделений памяти.
При выходи push за размер он выделяет памяти в два раза больше чем было, и пересыпает туда все.
В начале все тормозит нещадно. Выделения хоть и маленькие, но часто.

Но это можно и с помощью Reserve предотвратить.

Resize нужен чтобы потом можно было по индексу работать и через memcpy заполнять удобно... через &v[0] biggrin.gif

P.S. Георгий набирает быстрее чем я

Отредактировано Asher — 18/02/2005, 15:02
Gedeon
Отправлено: 18.02.2005, 14:09


Ветеран

Группа: Модератор
Сообщений: 1742



И все же получается вектор сразу захватывает заранее большое количество памяти и с ней работает или все же при добавлении обьекта изменяет обьем занимаемой памяти? Мне на сколько я знаю кажется что 1, поправьте если не прав.

Сори, прочитал внимательнее, получается все же 1, но если я хочу не занимать много памяти, то делаю ресайз и отдаю оси лишнее, так?

Отредактировано Gedeon — 18/02/2005, 12:12

Вернуться в Вопросы программирования в C++Builder