2015-05-28 3 views
-1

У меня есть код ниже, который генерирует 1D-вектор, содержащий одинаково разнесенные точки из [xmin, xmax]. Когда я вызываю функцию, он не возвращает вектор VX. Что я делаю не так?Возврат вектора в C++

double meshGen1d(double xmin, double xmax, int k) 
{ 
    int i; 
    int nV = k + 1; 
    boost::multi_array< double, 1 > VX(boost::extents[ nV - 1 ]); 

    //std::vector<double> VX(nV - 1); 

    std::cout<<" Setting up the 1D mesh "<<std::endl; 

    //Generate node coordinates 
    VX[0] = xmin; 

    for (i=0; i<nV; i++) 
    { 
     VX[ i ] = VX[ i - 1 ] + (xmax - xmin)/k; 
    } 
    return VX; 
} 
+7

Если вы хотите вернуть вектор, вам необходимо изменить возвращаемый тип функции. Прямо сейчас у вас это как двойное. – NathanOliver

+0

, который работал, я только что скопировал boost :: multi_array вместо двойного. – Andrei

ответ

0

оригинальный VX объект уничтожается, когда объем ваших концов функция meshGen1d. Вы могли бы передать в объект по ссылке, например:

void meshGen1d(double xmin, double xmax, int k, boost::multi_array<double, 1>& VX) 
{ 
    // ... 
} 

Это предотвратит создание (и уничтожение) дополнительную копию, которая может быть полезна, если объект большой памяти.

+3

Вместо поправки вы должны просто удалить второй абзац (и первый, потому что это, следовательно, не имеет значения). Это ужасная идея, и она никогда не должна быть сделана. Кроме того, в отношении «избегайте копий», [copy elision] (http://en.cppreference.com/w/cpp/language/copy_elision). –

+0

Вы имеете в виду часть за отправку? если да: не могли бы вы объяснить, почему это ужасно? – KompjoeFriek

+1

Нет, я имею в виду * "вы должны создать его с новым, и уничтожить его вне этой функции с помощью delete." * part. Второй абзац. Передача по ссылке приемлема, хотя и не мое личное предпочтение, когда результат не зависит от текущего состояния аргумента. –

Смежные вопросы