У меня есть двумерный вектор целых чисел:

std::vector<std::vector<int> > matrix;

И я хочу вызвать функцию для этого объекта. Функция:

int coverTransactions(int k, const std::vector<std::vector<int> > matrix ) { //k nombre de clusters
    int compteur = 0;
    for(int t = 0; t != 11; t++) {
        compteur = 0;
        for(int i = 0; i != k; i++) {
            if(matrix[t][i] == 1)
                compteur++;
        }
        if(compteur != 1)
            return -1; //on retourne -1 si la transaction n'appartient pas à un et un seul cluster
    }
    return 0;//si tout se passe correctement, cad t appartient à un et un seul cluster on retourne 0
}

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

Почему-то при таком вызове функции:

std::cout << coverTransactions(3, &matrix) << std::endl;

Я получаю следующую ошибку:

 coderror: cannot convert ‘std::vector<std::vector<int> >*’ to ‘int (*)[3]’ for argument ‘2’ to ‘int coverTransactions(int, int (*)[3])’

Я не понимаю почему, потому что они одного типа ...

-1
Guillaume Leseur 26 Ноя 2016 в 14:35

3 ответа

Лучший ответ

Здесь происходит pass by reference, который отличается от pass by pointer, где вы передаете адрес переменной в функцию (при ее вызове), а определение функции принимает указатель. Здесь вы в основном передаете указатель на вектор в качестве аргумента и, таким образом, выполняете pass by pointer:

coverTransactions(3, &matrix)

, тогда как согласно определению вашей функции здесь происходит pass by reference, следовательно, просто передайте вектор, как он есть в функции:

coverTransactions(3, matrix)

Разница между двумя указанными выше методами состоит в том, что pointer может быть NULL, но references никогда не будет NULL, и поэтому мы уверены, что ссылаемся на допустимую переменную. Вот почему рекомендуется использовать references, когда это возможно, и использовать pointers только тогда, когда это необходимо.

2
Jarvis 26 Ноя 2016 в 11:58
    int coverTransactions(int k, const std::vector<std::vector<int> > &matrix ) { //k nombre de clusters
    int compteur = 0;
    for(int t = 0; t != 11; t++) {
        compteur = 0;
        for(int i = 0; i != k; i++) {
            if(matrix[t][i] == 1)
                compteur++;
        }
        if(compteur != 1)
            return -1; //on retourne -1 si la transaction n'appartient pas à un et un seul cluster
    }
    return 0;//si tout se passe correctement, cad t appartient à un et un seul cluster on retourne 0
}

Итак, при вызове функции:

std::cout << coverTransactions(3, matrix) << std::endl;

Теперь пора!

1
adiga 6 Апр 2019 в 05:59

Вы пытаетесь передать указатель на matrix вместо ссылки. Удалите &:

std::cout << coverTransactions(3, matrix) << std::endl;
1
Christian Hackl 26 Ноя 2016 в 11:38