EL интерпретирует ${class.name}
как описано - имя становится getName () в предположении, что вы используете явные или неявные методы генерации getter / seters
. Вы можете переопределить это поведение, явно указав имя как функция: ${class.name()}
Это вызывает имя функции () напрямую без изменений.
Проблема состоит в том, что Вы добавляете вещи к вектору, таким образом, он заканчивается с большим количеством элементов, чем были в эти myarr
массив, с которым Вы инициализировали его.
, Если Вы хотите скопировать вектор назад в массив, необходимо будет измерить его вниз:
myvec.resize( MAX_SIZE);
Или Вы могли ограничить число элементов, которое Вы копируете назад:
copy( myvec.begin(), myvec.begin()+MAX_SIZE, myarr);
, Если Вы хотите эти myarr
массив содержать все элементы, тогда это должно быть больше, чем MAX_SIZE
, и Вы узнали, почему люди предлагают использовать vector
, а не необработанные массивы (vector
, с знают, как вырасти, массивы не делают).
Примечание, что, в то время как Вы не хотите 'Ответа, который напоминает: "Вы используете C++, отбрасываете реализацию массива стиля c. Использование только вектор для всей реализации массива"', можно часто сходить с рук использование vector
и передача &myvec[0]
к стандартным программам, которые ожидают необработанный массив. vector
требуется, чтобы хранить его элементы непрерывно точно так же, как необработанный массив по просто этой причине.
, Так как Вы получаете 'небезопасную операцию' предупреждение, Вы используете компилятор Microsoft. Для решения проблемы безопасно Вы, как предполагается, используете checked_copy
алгоритм вместо [1 111]. Как [1 115] Evgeny Lazin указывает , можно создать проверенный итератор для массива для передачи checked_copy
алгоритм.
Другие опции сделать копию безопасной, которые не требуют, расширения Microsoft должны были бы обернуть массив в класс (возможно шаблонный), который отслеживает размер массива и предоставляет методы для копирования данных в массив безопасным способом. Что-то как [1 116] STLSoft's array_proxy
шаблон или Повышение boost::array
могло бы помочь.
В целом я предполагаю, что Вы могли сделать что-то вроде этого:
void *myarr;
if((myarr = malloc(myvec.size() * sizeof myvec[0])) != NULL)
{
memcpy(myarr, &myvec[0], myvec.size() * sizeof myvec[0]);
/* Do stuff with the C-style array for a while
.
.
.
*/
free(myarr); /* Don't forget handing back the memory when done. */
}
Это выделяет новый массив C-стиля для содержания элементов вектора и копирует данные на месте. Этот путь нет никакой потребности соответствовать размерам статически.
, Конечно, это является общим, таким образом, это просто дает Вам void *
для доступа к массиву C с, таким образом, необходимо или бросить или просто изменить тип на фактический тип (BYTE
в этом случае).
Можно использовать вычет аргумента шаблона для нахождения массива связанным:
template<typename T, size_t N>
size_t copy(std::vector<T> const& src, T[N] dest) {
size_t count = std::min(N, src.size());
std::copy(src.begin(), src.begin()+count, dest);
return count;
}
Выключают предупреждения Microsoft о материале непроверенном. Они нацелены на соблазнение Вас в написание непортативного кода.
Можно сделать:
memcpy(myarr, &(myvec)[0], myvec.size())
Редактирование: Насколько безопасность идет, согласно это , векторы хранят данные в непрерывных сегментах памяти, таким образом, можно получить доступ к ним "не только использование итераторов, но также и использование смещений на регулярных указателях к элементам".