2011-04-01 1 views
1

Je veux savoir s'il y a un moyen de prendre la taille d'un tableau dimensionnel de l'utilisateur? par exemple pour la taille d'une matrice j'ai essayé de définir un pointeur, et après avoir pris la taille de la matrice faites la mémoire. c'est: `Y at-il un moyen de prendre la taille du tableau de l'utilisateur en C++?

void getMatrixSize(&int,&int); 
void makeMatrix(int **mat,int,int); 
void getMatrixData(int **mat,int,int); 

int matrixRow,matrixColumn; 
int **A=NULL; 

int main() 
{ 
    int row,column; 
    getMatrixSize(row,column); 
    makeMatrix(A,row,column); 
    getMatrixData(A,row,column); 
} 
getMatrixSize(int &row,int &column) 
{ 
    cout<<"Enter matrix row:"; 
    cin>>matrixRow; 
    row=matrixRow; 
    cout<<"Enter matrix column:"; 
    cin>>matrixColumn; 
    column=matrixColumn; 
} 
makeMatrix(int**mat,int row,int column) 
{ 
    int i=0; 
    mat=(int**)malloc(sizeof(int)*row); 
    if(mat==NULL) 
    { 
     cout<<"Error in getting memory"; 
     exit(1); 
    } 
    for(i=0;i<row;i++) 
    { 
     mat[i]=(int*)malloc(sizeof(int))*column); 
     if(mat[i]==NULL) 
     { 
     cout<<"Error in getting memory"; 
     exit(1); 
     } 
    } 
} 
void makeMatrixData(int**mat,int row,int column) 
{ 
    int i,j; 
    for(i=0;row>i;i++) 
    { 
     for(j=0;column>j;j++) 
     { 
     printf("m[%d][%d]=",i+1,j+1) 
     cin>>mat[i][j]; 
     } 
    } 
} 

le programme ne donnent aucune erreur, mais quand je le lance, il ne fonctionne pas. quand j'ai vérifié le debuge je me suis rendu compte qu'il prend la mémoire pour mat pas pour A.
ceci était mon idée et n'a pas trouvé de toute façon pour le faire fonctionner. nous avons n'importe quelle manière de prendre la taille d'un tableau dimensionnel de l'utilisateur?

+0

Je ne suis pas un flic de grammaire, et je comprends qu'il y en a beaucoup ici pour qui l'anglais est une deuxième langue, mais les fautes d'orthographe et de grammaire me mettent sur l'inclinaison singe sauvage. –

Répondre

1

Outre votre utilisation de cin et cout, votre code se lit comme C, pas C++.

Il n'y a aucune notion de la taille d'un tableau en C++. La façon dont vous le faites, vous devrez le garder manuellement, donc si vous envisagez d'écrire du code matriciel en C++, je vous suggère d'implémenter Matrix en tant que classe, que vous envisagez sérieusement d'utiliser un conteneur pré-emballé pour vos valeurs (vecteur de vecteurs est bien, mais vous pouvez aussi utiliser un seul vecteur, un seul valarray, un seul champ de portée de boost) au lieu de gérer la mémoire par vous-même (sauf si c'est l'objectif de l'exercice, je vous suggère d'utiliser new et delete au lieu de malloc et release). La raison pour laquelle je suggère que vous utilisez des conteneurs pré-emballés est qu'aujourd'hui, vous ne devriez plus vous soucier de la gestion manuelle de la mémoire en C++ (beaucoup de gens qui se plaignent de fuites de mémoire étant trop faciles à créer en C++ ne le réalise pas). C'est ce que les conteneurs et les pointeurs intelligents existent.

Si vous vous demandez comment utiliser un seul tableau, un seul valarray ou vecteur, lisez sur valarray et tranches. Cela vous dirigera dans la bonne direction. Enfin, si vous écrivez en C++, ne faites pas exit (1); vous devriez jeter une exception (qui d'ailleurs, est ce que vous obtiendrez en utilisant des conteneurs préemballés ou le nouvel opérateur).

Bon apprentissage.

0

mat est une variable locale sur la pile. Vous feriez mieux de la valeur de retour d'utiliser pour passer le pointeur alloué, mais si vous voulez passer par les paramètres - vous devez utiliser des références:

void makeMatrix(int **&mat,int,int); 

ou « vide makeMatrix (int *** mat, int, int) " et passez & A (et faites *mat = à l'intérieur).

+2

Il est toujours le 1er avril, mais '***' en C++? S'il vous plaît! –

+0

@Bo - aussi laid et non recommandé que cela puisse être, c'est toujours un code valide. La personne essaie manifestement d'apprendre des pointeurs, des références et tout ce genre de choses. Si vous avez d'autres suggestions - ajoutez une réponse, ne vous fréquentez pas. – littleadv

+0

@Bo: Exemple de triple pointeur: http://stackoverflow.com/questions/540822/allocating-memory-for-triple-pointer –

1

Avez-vous envisagé d'utiliser un vecteur de vecteurs et de le faire circuler par référence?

std::vector<std::vector<int> > mat(rows, std::vector(cols, 0)); doit initialiser une matrice à tous les zéros.

0

J'ai juste trouvé un moyen avec l'allocation de mémoire. seulement besoin que faire un type et adresse alors il est variable dans le function.like ceci:

typedef int mymatrix; 
void makeMatrix(mymatrix &mat,int,int); 

et principal besoin de définir un pointeur et placez le pointeur en fonction:

int **A; 
makeMatrix(A,row,column); 

il est donc possible de prendre la taille du tableau dimetional de l'utilisateur.

Questions connexes