передача вектора между функциями через указатели - PullRequest
6 голосов
/ 18 марта 2011

Мне было предложено использовать указатели для добавления вектора, который я хотел передать из существующей функции в другую функцию.Я действительно застрял на том, как получить информацию обратно этого указателя, хотя.Я попробовал несколько вещей, которые я прочитал здесь и там, поэтому позвольте мне продемонстрировать, о чем я говорю.

основная программа:

std::vector<float> * dvertex=NULL;

track.calculate(irrelevant stuff, dvertex)

дополнительная программа (отслеживать, вычислять)

track::caclulate(irrelevant stuff, vector<float> * dvertex)
{
...
vector<float> pos;
... pos filled after some calculations
if(! (dvertex==NULL))
{
  dvertex = &pos1;
}

назад к основному, если я не испортил что-то выше, вот некоторые вещи, которые я пробовал

1

(*dvertex).at(0)
float z = (*dvertex).at(0)

2

(*dvertex)[0]

и куча вещей, которые просто не компилировались.Я застрял, потому что я не уверен, как получить конкретные значения из этого вектора в основной программе.Я даже подумал, что это может быть бит if (! (Dvertex == NULL)), поэтому я изменил его на if (dvertex == NULL), но все равно не радуюсь.Любая помощь будет принята с благодарностью.

* Редактировать / обновить * Огромное спасибо всем за помощь, но я боюсь, что все еще делаю это неправильно.

Итакследуя предложениям, которые я просто передал ссылку: я сделал это:

основной

std::vector<float> dvertex;
track.calculate( foo, &dvertex);

вторичный остался прежним (с! Нулевой проверки)

основной

std::cout<<dvertex[0]<<std:endl; 

(среди прочих попыток фактически использовать данные)

Большое спасибо за любые мысли о том, что я все еще делаю неправильно.Все компилируется, программа просто зависает, когда доходит до того, что используются данные из dvertex.

Редактировать: Окончательное исправление

в дополнительной программе, которая мне нужна

*dvertex = pos1;

вместо

dvertex = &pos1;

Ответы [ 3 ]

11 голосов
/ 18 марта 2011

Я не уверен, почему они не скомпилированы для вас, потому что они действительны до тех пор, пока указатель действителен и не нулевой:

void f(std::vector<int>* v)
{
    if( v != 0 ) {
        int n = (*v)[0];     // ok
        int m = (*v).at(0);  // ok
        int o = v->at(0);    // ok
    }
}

Но не обращайте на это внимания.Используйте ссылку, если вы должны изменить вектор, и ссылку на const, если вы не должны.В редких случаях возникает необходимость брать контейнер по указателю.

Кроме того, я предлагаю вам проверить указатели на 0, а не NULL, потому что иногда NULL определяется как (void*)0 согласно Cкомпиляторы.Но некоторые люди могут спорить иначе здесь.

3 голосов
/ 18 марта 2011

Если вы собираетесь изменить вектор, вы, вероятно, просто хотите передать его по ссылке. Однако если вы используете указатель, вам нужно определить вектор в main, а затем передать адрес этого вектора:

void calculate(std::vector<float> *vertex_array) { 
    vertex_array->pushback(1.0f);
    vertex_array->pushback(2.0f);
}

int main() {    
    std::vector<float> vertexes;
    calculate(&vertexes);

    std::copy(vertexes.begin(), vertexes.end(), 
        std::ostream_iterator<float>(std::cout, "\n"));
    return 0;
}
2 голосов
/ 18 марта 2011

См. Мое примечание выше, но чтобы ваш сценарий работал, вам нужно std::vector<float> * dvertex=NULL;, чтобы быть std::vector<float> * dvertex = new std::vector<float>();

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...