Евгений |
Отправлено: 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
|
|