-2
votes

Comment imprimer des matrices 2D C

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 OBTN_MATRAX STRT>. P>

4542 64 274 4234
765  53 3523 5345
5145 154 545 545
5435 543 545 14

c

2 commentaires

Il n'y a pas de "tableau" à trouver n'importe où dans votre code. Vous utilisez un * pointeur-pointeur-pointer-to - * int pour simuler un tableau 2D. Vous voudrez également regarder Utilisation de FFLUSH (STDIN) , car puisque vous utilisez getch () < / Code> Windows est une exception non standard à la règle générale ...


obtenn_matrix () ne renvoie pas les valeurs de matrice , m & n . Par conséquent, ils sont toujours indéfinis lorsque vous appelez prnt_matrix () à partir de votre principal () . Vous devriez changer en Void obtenn_matrix (int *** matrice, int * m, int * n) et * matrix = create_matrix (* m, * n); . Et s'il vous plaît faites vous-même une faveur et activez les avertissements du compilateur ... (E.g GCC -Wall )


3 Réponses :


-1
votes

Le code est devenu convolué avec tous les pointeurs, si vous souhaitez envoyer une matrice 2D à une fonction, faites ceci:

void obtenn_matrix (int matrice [] [n], int m, int n) // ou équivalent: void obtenn_matrix (int (* matrice) [n], int m, int n) { ... }

[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)]

Parce que INT ** ne représente pas un tableau 2D - ce serait une gamme de pointeurs aux pointeurs.


1 commentaires

Ceci est invalide car in int matrix [] [n] n est inconnu



1
votes

in obtent_matrix L'affectation de matrice, m et n ne sont pas visibles de Main , vous devez avoir besoin de Utilisez le pointeur vers eux.

Par exemple, à l'aide de la matrice de int * car les dimensions sont inconnues au moment de la compilation: xxx

compilation et exécution : xxx

exécution sous Valgrind xxx

notez qu'il est également possible d'attribuer simplement une Array de m * n int mais dans ce cas plutôt que d'utiliser m [i] [j] vous devez faire m [i * n + j]


3 commentaires

J'aime l'approche, sauf Void obtenn_matrix n'a pas besoin de prendre matrice comme paramètre du tout. Il suffit de le faire int ** obtenn_matrix (int * m, int * n) et retour create_matrix (* m, * n); (vous permet également d'éviter de devenir 3 programmeur -star). Peut également envisager si ((MA [i] = calloc (n, sizeof (int))) == null) Pour assurer tous les entiers sont initialisés zéro juste dans la case OMBIT-INITIALISANT UNE AVANT L'IMPRESSION :)


@ 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.



0
votes

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 le pointeur alloué em> strong> est passé. Bien qu'il soit toujours passé par la valeur et que le pointeur aura sa propre adresse et une adresse très différente de l'original, l'adresse de la mémoire qu'il détient car sa valeur indiquera toujours la même adresse que dans l'appelant. Ce n'est pas différent qui attribuant 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>

Cependant, si vous essayez d'allouer ou de réaffecter de telle sorte que l'adresse de em> strong> le pointeur est modifié, alors les modifications apportées à La fonction sera perdue sur le retour et non visible dans l'appelant. P>

Comment gérez-vous cela? strong> p>

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 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)


0 commentaires