2012-12-07 2 views
1

J'ai commencé à écrire en C++ il y a quelques mois et j'ai de la difficulté à utiliser des pointeurs. Dans le code que j'ai écrit pour le travail, j'ai défini plusieurs matrices en utilisant la classe matrix_t que j'ai écrite. J'ai créé un vecteur qui contient des pointeurs vers ces matrices. Je passe le vecteur à une fonction qui accède aux matrices. Voici un exemple simple de ce que je suis en train de faire:Accès aux matrices à partir du vecteur des pointeurs transmis à la fonction en C++

#include <iostream> 

#include "matrix_t.h" 

using namespace std; 

int mat_access (vector <matrix_t<int>*> &pmatrices) 
{ 
    matrix_t<int> mat = *pmatrices[0]; 
    return mat.get_cell(0, 0); 
    /*get_cell(r, c) returns the value at row r, column c*/ 
} 

int main() 
{ 
    vector <matrix_t<int>*> pmatrices(1); 

    matrix_t <int> mat (1, 1, 1); 
    /*mat_1(v, r, c) has r rows, c columns, and is filled with the value v*/ 
    pmatrices[0] = &mat; 

    for (size_t i = 0; i < 5; i ++) 
    { 
     int k = mat_access(pmatrices); 
     cout << k; 
    } 
} 

Si je fais un pas dans la fonction pendant le débogage, il fonctionne la première fois est appelée la fonction mat_access. Cependant, la deuxième fois que get_cell est appelée (même si c'est pour la même ligne et la même colonne de la même matrice), un point d'arrêt est déclenché et j'obtiens un message d'erreur dans la sortie indiquant qu'une adresse invalide est en cours d'accès. J'utilise App Verifier et l'emplacement de la pile d'appels renvoyé n'a pas de code source. Si je ne passe pas le vecteur des pointeurs à une fonction, mais que j'y accède directement dans la méthode principale, cela fonctionne bien. En outre, si je cours le même code en utilisant des vecteurs au lieu de matrices, cela fonctionne très bien. Je ne pense pas que ce soit un problème avec get_cell parce que je l'ai utilisé à plusieurs autres endroits dans mon code et je suis sûr que l'indexation est correcte. Voici à quoi il ressemble dans la classe de matrix_t:

T get_cell (size_t row, size_t col) const 
{ try 
    { 
     if (row >= n_rows || col >= n_cols) 
      throw myerror("Index out of bounds"); 
    } 
    catch (exception &e) 
    { 
     cout << "Exception: " << e.what() << '\n'; 
    } 
    return t_array [col * n_rows + row]; 
} 

t_array contient les éléments de la matrice et n_rows est le nombre de lignes de la matrice. Si tout le reste échoue, je vais juste combiner mes matrices dans une matrice et passer cela à la fonction, mais j'aimerais comprendre pourquoi cela ne fonctionne pas. Toute contribution serait appréciée.

+1

Pouvez-vous poster les messages d'erreur? – Barney

+0

De plus, affichez ici les parties ** pertinentes ** de votre matrice. – Barney

Répondre

0

Syntaxiquement, je ne vois aucun problème avec votre code. Essayez d'exécuter cet extrait (équivalent à ce que vous avez ci-dessus) et voyez si vous rencontrez la même erreur. Sinon, le problème est probablement dans votre code matriciel.

int foo(vector<int*> &v) { 
    int x = *v[0]; 
    return x; 
} 

int main() { 
    vector<int*> v(1); 
    int x = 9; 
    v[0] = &x; 
    for(int i = 0; i < 5; ++i) { 
     int y = foo(v); 
     cout << y << endl; 
    } 

    return 0; 
} 
Questions connexes