09/02 16:19

Ho iniziato a studiare le matrici dinamiche, non ho capito come devo fare per passare ad una stessa routine una matrice dinamica o una matrice statica.
Il seguente codice ha una void che visualizza il contenuto di una matrice con due dimensioni uguali, funziona correttamente con le matrici statiche, ma non se la matrice è stata inizializzata in runtime, pensavo di aver sbagliato l'uso di malloc, ma se stampo la matrice dinamica senza passare per la routine, la matrice sembra allocata e riempita correttamente:
se modifico la dichiarazione della void in:
la routine visualizza(), funziona con la matrice dinamica ma non funziona con la matrice statica...
Il seguente codice ha una void che visualizza il contenuto di una matrice con due dimensioni uguali, funziona correttamente con le matrici statiche, ma non se la matrice è stata inizializzata in runtime, pensavo di aver sbagliato l'uso di malloc, ma se stampo la matrice dinamica senza passare per la routine, la matrice sembra allocata e riempita correttamente:
#include <stdio.h> #include <stdlib.h> #define DIM 5 int **dinamica; int statica[DIM][DIM]; void visualizza(int m[DIM][DIM]){ for (int r=0; r<DIM; r++){ printf("\n"); for (int c=0; c<DIM; c++){ printf("%02d ",m[r][c]); } } printf("\n\n"); } int main() { // riempio la matrice statica a due dimensioni come fosse un vettore seriale printf("Matrice statica a due dimensioni riempita serialmente"); int *s=*statica; // s punta l'inizio della matrice for (int i=0; i<DIM*DIM; i++){ s[i]=i; // posso riempire serialmente } visualizza(statica); // funziona // alloco una matrice dinamica a due dimensioni dinamica = (int **) malloc (DIM*sizeof(int *)); for(int r=0; r<DIM; r++) dinamica[r] = (int *) malloc(DIM*sizeof(int)); // riempio la matrice dinamica per riga e colonna for (int r=0; r<DIM; r++){ for (int c=0; c<DIM; c++){ dinamica[r][c]=c+r*DIM ; } } printf("Matrice dinamica visualizzata errata con routine"); visualizza(dinamica); // ho un warning puntatore incompatibile! come si deve passare? printf("Matrice dinamica visualizzata direttamente e correttamente"); for (int r=0; r<DIM; r++){ printf("\n"); for (int c=0; c<DIM; c++){ printf("%02d ",dinamica[r][c]); } } printf("\n\n"); // dealloco for (int r=0; r<DIM; r++) free(dinamica[r]); free(dinamica); return 0; }
se modifico la dichiarazione della void in:
void visualizza(int **m)
la routine visualizza(), funziona con la matrice dinamica ma non funziona con la matrice statica...
Ultima modifica effettuata da Carlo 11/02 12:01
in programmazione tutto è permesso
