Ошибка использования векторного указателя в функции - PullRequest
1 голос
/ 01 марта 2010

У меня есть этот код, но он не скомпилируется, и я не могу понять, что не так - я думаю, что указание вектора неверно. Моя идея состояла в том, чтобы собрать некоторые числа в main () и сохранить их в векторе и массиве, а затем передать их адрес памяти функции и использовать указатели для печати сохраненных данных.

Я придумал это, когда прочитал что-то об указателях, в которых говорилось, что я должен использовать их для экономии памяти, поэтому код IMO ниже не будет копировать содержимое вектора и массива, а будет использовать указатель для доступа к место в памяти - это то, что я хочу сделать.

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

void function(vector<int>* a, int *s)
{
    cout << "function starts.." << endl;
    for(int i=0;i<a->size();i++)
    {
        cout << a[i] << endl;
        cout << s[a[i]] << endl;
    }
    cout << "function ends..." << endl;
}


int main(void)
{
    vector<int> m;
    int s[102];
    for(int i=0;i<10;i++)
    {
        m.push_back(i*i);
        s[i*i] = i-2;
    }
    function(&m, &s);
    return 0;
}

Я получаю несколько ошибок при компиляции, что-то не так.

Скажите, пожалуйста, что не так с моим кодом и как его исправить. спасибо ...

Ответы [ 5 ]

5 голосов
/ 01 марта 2010

Вы должны передать вектор по ссылке, а не по указателю:

void function(vector<int>& a, int *s)

А потом

function(m, ...);

Использование [] для указателя на вектор, безусловно, вызовет странные проблемы, поскольку он ведет себя так, как если бы он указывал на массив std :: vectors (тогда как на самом деле он указывает только на один). Сами векторы никогда не индексируются этим. Вы также можете использовать (*a)[...] для индексации вектора по указателю.

2 голосов
/ 01 марта 2010

если вы настаиваете на синтаксическом анализе по указателю, то правильный синтаксис должен быть:

void function(vector<int>* a, int *s[]) 
{ 
    cout << "function starts.." << endl; 
    for(int i=0;i<a->size();i++) 
    { 
        cout << (*a)[i] << endl; 
        cout << (*s)[(*a)[i]] << endl; 
    } 
    cout << "function ends..." << endl; 
} 
1 голос
/ 01 марта 2010

Прежде всего в основной программе s указатель на int, а m вектор.Таким образом, вызов функции должен выглядеть следующим образом:

function (& m, s);

Во-вторых, в функции a есть указатель на вектор, поэтому следует индексировать его следующим образом:) [i].

Однако вы действительно должны использовать ссылки const для передачи вашего вектора:

void функция (const vector & a, int * s) {.. cout << a [я] << endl;..} </p>

И назовите это как:

функция (м, с);

1 голос
/ 01 марта 2010

(исправлено)

&s на самом деле int(*)[102]: указатель на указатель на массив из 102 элементов.

Вы должны просто сказать

function(&m, s);

Это потому, что по старому устаревшему правилу C массив по существу является константным указателем на свой элемент с индексом 0. Таким образом, s уже int*

0 голосов
/ 01 марта 2010

Эта версия работает:

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

void function(const vector<int>& a, int s [102])
{
    cout << "function starts.." << endl;
    for(int i=0;i<(int)a.size();i++)
    {
        cout << a [i] << endl;
        cout << s[a [i]] << endl;
    }
    cout << "function ends..." << endl;
}


int main(void)
{
    vector<int> m;
    int s[102];
    for(int i=0;i<10;i++)
    {
        m.push_back(i*i);
        s[i*i] = i-2;
    }
    function(m, s);
    return 0;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...