J'essaie de simuler des matrices à l'aide de matrices 2D. Mais je suis coincé à une erreur d'exécution. Je suis sûr que cela survient à la fonction d'impression, mais je n'ai pas pu trouver une solution du tout.
obtenu obteneur strong> est une fonction que j'utilise pour créer une matrice de matrice. Je n'ai pas partagé la fonction de remplissage qui est utilisée pour obtenir des valeurs INT pour les éléments de la matrice de matrice, les valeurs imprimées seront donc telles que la mémoire. Cependant, le problème est que je ne peux pas imprimer les valeurs du tout. Programme se bloque après 4542 64 274 4234
765 53 3523 5345
5145 154 545 545
5435 543 545 14
3 Réponses :
Le code est devenu convolué avec tous les pointeurs, si vous souhaitez envoyer une matrice 2D à une fonction, faites ceci: P>
[En supposant que vous assignez n une valeur avant sa transmission à la fonction (vous pouvez également lui donner une valeur aléatoire, puis ajouter de l'espace avec MALLOC)] P>
Parce que INT ** ne représente pas un tableau 2D - ce serait une gamme de pointeurs aux pointeurs. P> void obtenn_matrix (int matrice [] [n], int m, int n)
// ou équivalent: void obtenn_matrix (int (* matrice) [n], int m, int n)
{
...
} code> p>
Ceci est invalide car in int matrix [] [n] code> n i> est inconnu
in Par exemple, à l'aide de la matrice de compilation et exécution : p> exécution sous Valgrind em> p> notez qu'il est également possible d'attribuer simplement une Array de m * n em> int em> mais dans ce cas plutôt que d'utiliser obtent_matrix code> L'affectation de matrice, m em> et n em> ne sont pas visibles de Main em>, vous devez avoir besoin de Utilisez le pointeur vers eux. int * code> car les dimensions sont inconnues au moment de la compilation: p> m [i] [j] code> vous devez faire m [i * n + j] code> p> p>
J'aime l'approche, sauf Void obtenn_matrix code> n'a pas besoin de prendre matrice code> comme paramètre du tout. Il suffit de le faire int ** obtenn_matrix (int * m, int * n) code> et retour create_matrix (* m, * n); code> (vous permet également d'éviter de devenir 3 programmeur -star). Peut également envisager si ((MA [i] = calloc (n, sizeof (int))) == null) code> Pour assurer tous les entiers sont initialisés zéro juste dans la case OMBIT-INITIALISANT UNE AVANT L'IMPRESSION :) code>
@ Davidc.rankin je viens de suivre le plus que je puisse le code d'origine ;-)
Oui, je l'ai eu, je venais de pointer ceux-ci. Comme je l'ai dit, j'aime l'approche.
Si vous n'avez pas complètement enveloppé votre tête autour du problème de base que vous rencontrez, le problème est celui-ci, C réussit les paramètres aux fonctions par valeur. Cela signifie que lorsqu'un paramètre est passé, la fonction reçoit une copie de la variable qu'elle est libre de modifier - mais toutes les modifications sont perdues lorsque la fonction renvoie.
Une mise en garde à ceci est quand une Cependant, si vous essayez d'allouer ou de réaffecter de telle sorte que l'adresse Vous avez deux options (1). adresse em> strud> le pointeur, de sorte que toute modification de l'adresse peut être affectée au pointeur déréférencé (c.-à-d. L'adresse du pointeur d'origine) ou (2) modifier le type de retour de Void code> au type de pointeur qui doit être renvoyé et renvoyer le pointeur nouvellement attribué / réaffecté pour une affectation dans l'appelant. P> Par exemple, dans votre cas, vous n'avez pas besoin de passer Matrix code> en tant que paramètre sur int A = 5; code> puis transmettant a code> comme paramètre, la fonction reçoit une copie de la variable, mais elle contient toujours 5 code>. p> OBTN_MATRIX () code> du tout. Vous pouvez simplement utiliser l'option (2) ci-dessus et modifier le type de retour de obtent_matrix () code> à int ** code> et retour Créer_matrix (* m, * n); CODE> à la fin, par exemple P> $ valgrind ./bin/matrix_cr_obtn
==10251== Memcheck, a memory error detector
==10251== Copyright (C) 2002-2015, and GNU GPL'd, by Julian Seward et al.
==10251== Using Valgrind-3.12.0 and LibVEX; rerun with -h for copyright info
==10251== Command: ./bin/matrix_cr_obtn
==10251==
enter number of rows: 5
enter number of cols: 3
0 0 0
0 0 0
0 0 0
0 0 0
0 0 0
==10251==
==10251== HEAP SUMMARY:
==10251== in use at exit: 0 bytes in 0 blocks
==10251== total heap usage: 6 allocs, 6 frees, 100 bytes allocated
==10251==
==10251== All heap blocks were freed -- no leaks are possible
==10251==
==10251== For counts of detected and suppressed errors, rerun with: -v
==10251== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0)
Il n'y a pas de
"tableau" code> à trouver n'importe où dans votre code. Vous utilisez un * pointeur-pointeur-pointer-to - *int code> pour simuler un tableau 2D. Vous voudrez également regarder Utilisation de FFLUSH (STDIN) , car puisque vous utilisezgetch () < / Code> Windows est une exception non standard à la règle générale ...obtenn_matrix () code> ne renvoie pas les valeurs dematrice code>,m code> &n code>. Par conséquent, ils sont toujours indéfinis lorsque vous appelezprnt_matrix () code> à partir de votreprincipal () code>. Vous devriez changer enVoid obtenn_matrix (int *** matrice, int * m, int * n) code> et* matrix = create_matrix (* m, * n); code>. Et s'il vous plaît faites vous-même une faveur et activez les avertissements du compilateur ... (E.gGCC -Wall code>)