2017-02-18 2 views
-2

J'écris un fichier d'en-tête simple qui peut créer un tableau 2D dynamique et mettre 0 dans la ligne et col, imprimer le tableau et supprimer le tableau. Dans le débogage lors du passage, le tableau 2d est initialisé, il place 0 là-dedans, mais quand my_array.Print_Array();Fichier d'en-tête de tableau 2D simple, échec d'impression

appelé, le compilateur l'ignore. Lorsque j'essaie d'imprimer le tableau à partir du fichier principal, il échoue. toute aide serait l'apprécier.

HEADER DOSSIER:

 class twoD_Array 
{ 
    public: 
     int **Array; 
     int *col, *row; 
     int size_col, size_row; 

     twoD_Array(int, int); 
     ~twoD_Array(); 

     void Print_Array(); 

}; 

twoD_Array::twoD_Array(int size_c, int size_r) 
{  
     size_col = size_c; 
     size_row = size_r; 

     Array = new int *[size_col]; 
     for (int i = 0; i < size_col; i++) 
     { 
      Array[i] = new int[size_row]; 

       for (int j = 0; j < size_row; j++) 
        Array[i][j] = 0; 
     } 

} 

void twoD_Array::Print_Array() 
{ 
    for (int y_i = 0; y_i<size_col; y_i++) 
    { 
     for (int x_i = 0; x_i<size_col; x_i++) 
      std::cout << Array[y_i][x_i]; 

     std::cout << std::endl; 
    } 
} 

twoD_Array::~twoD_Array() 
{ 
    for (int i = 0; i < size_row; i++) 
     delete[] Array[i]; 

    delete[] Array; 
} 

Fichier principal:

#include "stdafx.h" 
#include <iostream> 
#include "2D_Array.h" 

int main() 
{ 
    int x, y; 

    std::cout << "how many x variables?" << std::endl; 
    std::cin >> x; 
    std::cout << "how many y variables?" << std::endl; 
    std::cin >> y; 

    twoD_Array my_array(x, y); 
    my_array.Print_Array(); 


    return 0; 
} 
+0

Une raison de ne pas utiliser 'std :: vector ' pour gérer le tableau sous-jacent? – WhiZTiM

+0

Vous exécutez l'un de vos cycles imbriqués jusqu'à size_col au lieu de size_row – pergy

+0

'lorsque j'essaie d'imprimer le tableau à partir du fichier principal, il échoue 'pouvez-vous définir _it fails_? – Yousaf

Répondre

3

Vous utilisez les variables locales dans le constructeur, mais vous utilisez les variables membres dans la méthode Print_Array, qui ne sont pas initialisé. Vous devez initialiser les variables membres size_col et size_row dans le constructeur où elles sont fournies. En outre, une autre chose à signaler, dans la méthode Print_Array, vous utilisez size_col au lieu de size_row pour la boucle x_i, qui ressemble à une erreur logique. J'ai réécrit le constructeur et Print_Array de regarder cette façon:

twoD_Array::twoD_Array(int size_col, int size_row) 
{ 
    this->size_col = size_col; 
    this->size_row = size_row; 
    Array = new int *[size_col]; 
    for (int i = 0; i < size_col; i++) 
    { 
     Array[i] = new int[size_row]; 
     for (int j = 0; j < size_row; j++) 
     { 
      Array[i][j] = 0; 
     } 
    } 
} 

void twoD_Array::Print_Array() 
{ 
    for (int y_i = 0; y_i < size_col; y_i++) 
    { 
     for (int x_i = 0; x_i < size_row; x_i++) 
     { 
      std::cout << Array[y_i][x_i]; 
     } 

     std::cout << std::endl; 
    } 
} 
+0

J'ai changé le size_col à size_row, il n'imprime toujours pas – BlooB

+0

Okay Justin Time m'a battu à elle. – alhadhrami

3

Dans

twoD_Array::twoD_Array(int size_col, int size_row) 

int size_col définit un nouveau temporaire et locale à la variable constructeur nommée size_col. Ce size_col n'a rien à voir avec la variable membre size_col et comme ils ont le même nom, la variable locale cache la variable membre.

Le résultat final est Print_Array La variable membre size_col n'a été définie sur rien, donc Crom sait seulement ce qui va se passer.

Solution:

Définissez la variable membre:

twoD_Array::twoD_Array(int col, int row): size_col(col), size_row(row) 

deux points (:) indique au compilateur qu'un Member Initializer List arrive. La liste des initialiseurs de membres vous permet d'initialiser un membre de classe avant d'entrer dans le corps du constructeur. Ceci est très important lorsque vous avez une variable membre qui n'a pas de constructeur par défaut ou qui nécessite une initialisation coûteuse que vous ne voulez pas forcer à faire deux fois. Il vous permet également d'initialiser une classe de base.

Notez que j'ai également changé les noms des paramètres pour éviter toute confusion future.

Et pendant que nous sommes ici, évitons ce qui risque d'être le prochain problème de l'OP en demandant What is The Rule of Three? Sérieusement. Cliquer sur le lien. Vous épargner une tonne de débogage.

+0

Merci pour l'aide et infos supplémentaires, j'ai enregistré le lien – BlooB