Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Массив переменной длинны


Автор: decembrist 23.9.2004, 11:28
Как задать массив, если его длина определяется в процессе вычисленний программы? В данном случае vector не подходит qstn.gif

Автор: Borisff2003 23.9.2004, 11:31
Код

int *A
A=new int[count];
.....

delete[]  A;




Автор: cardinal 23.9.2004, 11:42
или читай тут:
http://forum.vingrad.ru/index.php?showtopic=28161

Автор: srd 23.9.2004, 12:05
А почему не подходит vector?

Автор: decembrist 23.9.2004, 13:59
Я использую ф-цию setValues(starting index, member of values, pointer to array of values)
Например если
Код
float pts[7][3] = {{},...{}};

то
Код
point.setValues(0,7,pts);

то есть я не могу подставить в качестве третьего аргумента vector. Его надо как то перевести в array. qstn.gif

Автор: Borisff2003 23.9.2004, 14:12
А вот такое работает
Код

#include <iostream.h>
#include <vector>
using namespace std;

void Privet(int f[])
{

int t=f[6];

};

int main(int argc, char* argv[])
{
int var;
int r;
vector<int> v(10);
v[6]=156;
Privet(v.begin());
}

Автор: DENNN 23.9.2004, 14:13
Цитата
я не могу подставить в качестве третьего аргумента vector.

Достаточно передать итератор на первый элемент.
А вообще, раз такой вопрос возник, значит не слишком хорошо STL освоил - книги в руки и просвещаться smile.gif

Добавлено @ 14:16
Borisff2003
В твоем примере вызываемая функция ничего не знает о том, сколько элементов в контейнере. Кроме того, происходит явное преобразование типов из итератора в (int*), по данному стандарту оно работает, но ведь иераторами не просто так пользуются wink.gif

Автор: decembrist 23.9.2004, 14:41
Цитата
книги в руки и просвещаться

ссылки есть какие-нибудь? Нет у меня подходящих книг кроме Страуструпа

Автор: Dark Elf 23.9.2004, 15:53
ИМХО, Страуструп как раз для этого и подходит.

А ещё на RSDN.RU есть описание STL (в CHM-формате)

Автор: Borisff2003 24.9.2004, 05:20
DENNN
Ну так я пример давал,
decembrist надо связать старый код и STL так что думаю у него функция получще выглядит, да и насколько я понимаю, vector так и описан в стандарте, чтобы быть полностью совместимым с массивами в классическом виде. Тут либо преобразовывать, либо описание функции немного переделать(если код есть)

Автор: decembrist 24.9.2004, 10:45
Цитата
Тут либо преобразовывать, либо описание функции немного переделать(если код есть)

ф-ция стандартная. А преобразовать -то как можно?

Автор: Adil' 24.9.2004, 12:07
decembrist, я бы на твоем месте сначала разобрался с указателями, т. е. сделал бы как
Borisff2003 (сообщение №2) предложил. Не зная указателей за STL хвататься - не хорошо как то. Вот освоишься с ними более-менее, тогда можно и за STL взяться (если захочешь smile.gif )
З.Ы. Это мое ИМХО.


Автор: Vyacheslav 24.9.2004, 12:45
В современной исправленной редакции(изменение от сетнября 2002 года ISO/IEC 14882:2002(3)) стандарт требует, что бы vector выполнял следующие условия

&v[n] == &v[0] + n for all 0<= n < v.size()

То есть элементы вектора должны располагаться в памяти непрерывно.
Таким образом преобразование вектора к обычному массиву производится получением адреса на первый элемент вектора и если используемая редакция STL отвечает стандарту, то вполне справдлив следущей код
Код

vector<int> v(10);
Privet(&v[0]);


Кстати в ранее действующющей редакции стандарта ISO/IEC 14882:1998(E) это никак не регламентировалось, и такой код в различных реализациях STL мого приводить к ошибке и соответственно такое использование рассматривалась как грубейшая ошибка

Автор: decembrist 24.9.2004, 14:50
Большое всем спасибо! biggrin.gif Я все понял. А с STL придется разбираться wink.gif

Автор: mr.DUDA 24.9.2004, 21:18
2 decembrist,

Цитата(decembrist @ 24.9.2004, 14:50)
Большое всем спасибо!  Я все понял. А с STL придется разбираться

Вам сюда:

http://forum.vingrad.ru/index.php?showtopic=16860

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)