Евгений |
Отправлено: 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, но какой тогда в этом смысл, ну или используйте надоевший всем вектор. 
Отредактировано 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] 
P.S. Георгий набирает быстрее чем я
Отредактировано Asher — 18/02/2005, 15:02
|
 |
Gedeon |
Отправлено: 18.02.2005, 14:09 |
|

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

|
И все же получается вектор сразу захватывает заранее большое количество памяти и с ней работает или все же при добавлении обьекта изменяет обьем занимаемой памяти? Мне на сколько я знаю кажется что 1, поправьте если не прав.
Сори, прочитал внимательнее, получается все же 1, но если я хочу не занимать много памяти, то делаю ресайз и отдаю оси лишнее, так?
Отредактировано Gedeon — 18/02/2005, 12:12
|
 |