Здравствуйте, LaptevVV, Вы писали:
LVV>Здравствуйте, Marty, Вы писали: M>> Допустим, есть: M>>
M>>void SomeFunc( int *pData, size_t dataSize)
M>>
M>>Можно ли использовать для этого вектор: LVV>Можно. Но я б рекомендовал параметрами SomeFunc сделать в стиле stl M>>
M>>void SomeFunc( int *begin, int *end)
M>>
Это только если SomeFunc твоя функция. У меня в одном приложении было нечто похожее. Внутри гнал массивы через векторы (особенно полезно когда надо передавать два массива или три, экономим параметры под размеры массивов). А с WinAPI стыковался через &vec.front(), vec.size().
Re[2]: Можно использовать вектор как массив для возврата зна
LVV>Можно. Но я б рекомендовал параметрами SomeFunc сделать в стиле stl M>>
M>>void SomeFunc( int *begin, int *end)
M>>
не вижу никакого бенефита в такой форме. Бенефит был бы, если бы функция стала шаблонной, а если жестко прописаны int*, то какая разница begin+size или begin+end?
Re[3]: Можно использовать вектор как массив для возврата зна
People who are more than casually interested in computers should have at least some idea of what the underlying hardware is like. Otherwise the programs they write will be pretty weird (c) D.Knuth
Re[3]: Можно использовать вектор как массив для возврата зна
Здравствуйте, dilmah, Вы писали:
LVV>>Можно. Но я б рекомендовал параметрами SomeFunc сделать в стиле stl M>>>
M>>>void SomeFunc( int *begin, int *end)
M>>>
D>не вижу никакого бенефита в такой форме. Бенефит был бы, если бы функция стала шаблонной, а если жестко прописаны int*, то какая разница begin+size или begin+end?
Уточню, бенифит от begin + end мы достигаем когда используем итераторы таких контейнеров как list.
тоесть там где мы не можем себе позволить хранить сайз
я не волшебник, я только учусь!
Re: Можно использовать вектор как массив для возврата значен
Единственный криминал — это отсутствие проверки на 0.
Если dataSize=0, то vector<int>(dataSize) пуст.
Его begin()==end(), а end() разыменовывать нельзя. Даже для последующего взятия адреса.
Равно как нельзя обращаться к [0] и front().
Это undefined behavior.
(Во-первых, вектор может сконструироваться с NULL-указателями, а во-вторых, там — в дебажной версии точно — могут стоять проверки на вылет из диапазона).
Поэтому, нужно либо гарантированно резервировать, vector<int>(max(1,dataSize))
либо ветвить: SomeFunc(dataSize ? &v.front() : NULL_OR_ZERO_LENGTH_ARRAY, dataSize)
Кстати, обращаю внимание: вместо assign можно сразу в конструктор вектора передавать размер.
Перекуём баги на фичи!
Re[2]: Можно использовать вектор как массив для возврата зна
Здравствуйте, Кодт, Вы писали:
К>Здравствуйте, Marty, Вы писали:
К>Единственный криминал — это отсутствие проверки на 0.
Ну, подразумевается, что 0 никогда не будет.
Смысл затеи — возвращать вектора простых (хотя бы) типов через сишный интерфейс.
Идея в том, что первый вызов (вместо указателя передаем 0) дает размер массива, который будет возвращен, затем подготавливается вектор под это дело и
передаем указатель на первый элемент. Как возвращать размер на первом шаге — наверно надо сделать dataSize указателем на size_t, и принимать размер в него. Хотя, тогда на втором шаге не так удобно.
Спасибо за подсказку.
К>Кстати, обращаю внимание: вместо assign можно сразу в конструктор вектора передавать размер.
Да я просто мучался перед написанием поста с тем, что инициализация конструктором с параметрами не компилировалась (в gcc вроде), выдавалось что-то невнятное, как я понял, компилятор воспринял это как объявление функции
Здравствуйте, Marty, Вы писали:
M>Да я просто мучался перед написанием поста с тем, что инициализация конструктором с параметрами не компилировалась (в gcc вроде), выдавалось что-то невнятное, как я понял, компилятор воспринял это как объявление функции
Пример кода?
Трюк с лишними скобками знаешь?
Перекуём баги на фичи!
Re: Можно использовать вектор как массив для возврата значен
Здравствуйте, Слава, Вы писали:
С>Здравствуйте, March_rabbit, Вы писали:
M>>>Можно ли использовать для этого вектор: M>>>
M>>>std::vector<int> vec;
M>>>vec.assign( 32, 0 ); // подготовили место
M>>>SomeFunc( &(*vec.begin()), vec.size() ); // хотим получить новые значения
M>>>
M>>>На мой взгляд, криминала нет, но вдруг я ошибаюсь? M_>>ИМХА говорит, что все нормально, хоть и выглядит не красиво.
С>А так красивее?
С>SomeFunc( &vec[0], vec.size() );
это вопрос эстетики второй вариант покрасивше, символов поменьше.
но (как уже и говорил) — все нормально.
Re[3]: Можно использовать вектор как массив для возврата зна
Здравствуйте, Marty, Вы писали:
К>>Единственный криминал — это отсутствие проверки на 0.
M>Ну, подразумевается, что 0 никогда не будет. M>Смысл затеи — возвращать вектора простых (хотя бы) типов через сишный интерфейс. M>Идея в том, что первый вызов (вместо указателя передаем 0) дает размер массива, который будет возвращен, затем подготавливается вектор под это дело и передаем указатель на первый элемент.
Ну и в частном случае первый вызов скажет, что размер данных — 0. Подготавливаем вектор, пытаемся передать указатель на первый элемент — и вываливаемся в проверке (index < size) в vector::operator[].
Re[2]: Можно использовать вектор как массив для возврата зна
Вредные советы.
Коль уж есть api в стиле "c", то и нужно их таковми делать.
Т.е. мой выбор — или 2 итератора на входе, или как есть.
LVV>Здравствуйте, Marty, Вы писали: M>> Допустим, есть: M>>
M>>void SomeFunc( int *pData, size_t dataSize)
M>>
M>>Можно ли использовать для этого вектор: LVV>Можно. Но я б рекомендовал параметрами SomeFunc сделать в стиле stl M>>
M>>void SomeFunc( int *begin, int *end)
M>>
Re[4]: Можно использовать вектор как массив для возврата зна
Точно уже не скажу, я забил и переделал так, что вся эта фигня не понадобилась. Последний вариант такой, он тоже что не заработал, хотя может уже где-то в другом месте, предыдущий по памяти восстановил ниже:
typedef vector< COLORREF, IPoolAllocator<COLORREF> > colorref_vector;
::std::vector< colorref_vector, IPoolAllocator<colorref_vector> > faceColors = ::std::vector< colorref_vector, IPoolAllocator<colorref_vector> >( IPoolAllocator<colorref_vector>(poolPtr) );
::std::vector< colorref_vector, IPoolAllocator<colorref_vector> > faceColors( IPoolAllocator<colorref_vector>(poolPtr) ); // не работал вот этот, похоже по сообщениям воспринимался как прототип.
К>Трюк с лишними скобками знаешь?
Примерно так:
CMyType var()( /* bla-bla */);
Что-то вроде этого? Это вроде похоже на вызов оператора (). Нет, не знаю
Здравствуйте, Centaur, Вы писали:
C>Ну и в частном случае первый вызов скажет, что размер данных — 0. Подготавливаем вектор, пытаемся передать указатель на первый элемент — и вываливаемся в проверке (index < size) в vector::operator[].
Ну, если кол-во возвращаемых данных — 0, то наверно можно и вообще не вызывать Хотя это от функции зависит, конечно.