Conversion de tableaux multidimensionnels en pointeurs en c ++
J'ai un programme qui se présente comme suit:
double[4][4] startMatrix;
double[4][4] inverseMatrix;
initialize(startMatrix) //this puts the information I want in startMatrix
Je souhaite maintenant calculer l'inverse de startMatrix et de le mettre en inverseMatrix. J'ai une bibliothèque, à cet effet, dont le prototype est le suivant:
void MatrixInversion(double** A, int order, double** B)
qui prend l'inverse de A et la met dans B. Le problème est que j'ai besoin de savoir comment convertir le double[4][4] dans un double** pour donner à la fonction. J'ai essayé de le faire juste le "évident":
MatrixInversion((double**)startMatrix, 4, (double**)inverseMatrix))
mais cela ne semble pas fonctionner. Est-ce réellement la bonne façon de le faire?
source d'informationauteur Alex319
Vous devez vous connecter pour publier un commentaire.
Non, il n'y a pas de bonne façon de faire précisément cela. Un
double[4][4]
tableau n'est pas convertible en undouble **
pointeur. Ce sont deux alternatives, de l'incompatibilité des moyens à mettre en œuvre un tableau 2D. Quelque chose doit être changé: soit la fonction de l'interface ou de la structure de la matrice passée en argument.La façon la plus simple de faire le dernier, c'est à dire à faire de votre
double[4][4]
tableau compatible avec la fonction, est de créer temporaire "index" des tableaux de typedouble *[4]
pointant vers le début de chaque ligne dans chaque matriceet passer ces "index" des tableaux au lieu
Une fois la fonction terminée, vous pouvez oublier le
startRows
etinverseRows
tableaux, puisque le résultat sera placé dans votre originalinverseMatrix
tableau correctement.Pour la raison que tableau à deux dimensions (un bloc contigu de mémoire) et un tableau de pointeurs (non contigus) sont des choses très différentes, vous ne pouvez pas passer un tableau à deux dimensions à une fonction de travail avec le pointeur de pointeur.
Une chose que vous pouvez faire: modèles. La taille de la seconde dimension d'un paramètre du modèle.
Un autre, un peu plus encombrant peut-être de faire la fonction qui accepte un pointeur vers un seul tableau multidimensionnel, et à la fois la largeur et la hauteur donnés comme arguments, et de calculer les indices dans une représentation en deux dimensions vous-même.
Naturellement, une matrice est quelque chose qui mérite d'une classe qui lui est propre (mais la ci-dessus peuvent encore être utiles, si vous avez besoin d'écrire des fonctions d'assistance).
Puisque vous êtes à l'aide de C++, la bonne façon de faire quelque chose comme ce serait avec une classe personnalisée et certains modèles. L'exemple suivant est assez approximative, mais elle est le point de base à travers.
Tableau à deux dimensions n'est pas un pointeur de pointeur ou quelque chose de similaire. Le type est correct pour vous startMatrix est
double (*)[4]
. Pour votre fonction, la signature doit être comme:Il y a une solution en utilisant le pointeur par bobobobo
William Sherif (bobobobo) utilisé la version de C et je veux juste vous montrer la version C++ de bobobobo de réponse.
Le reste du code est le même avec bobobobo.
Le problème est qu'un tableau à deux dimensions n'est pas le même comme un tableau de pointeurs. Un tableau à deux dimensions stocke les éléments d'une ligne après l'autre — de sorte que, lorsque vous passez un tableau autour de, seulement un pointeur vers le départ est donné. La fonction de réception peut travailler sur la façon de trouver n'importe quel élément du tableau, mais que si elle sait la longueur de chaque ligne.
Donc, à la réception de votre fonction doit être déclarée comme
void MatrixInversion(double A[4][], int order, double B[4][])
.nice de codage si c++:
de sorte que le interface serait
et de l'utiliser
L'avantage
Ou de cette façon
Une vilaine façon c
EDIT: code de référence pour MatrixInversion qui ne va pas planter: