Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - Visualizzazione errata dei valori di una matrice
Forum - C/C++ - Visualizzazione errata dei valori di una matrice

Avatar
crash outside control (Normal User)
Expert


Messaggi: 217
Iscritto: 12/02/2008

Segnala al moderatore
Postato alle 20:27
Martedì, 28/09/2010
Ciao a tutti, qualche giorno fa ho cominciato a vedere come dichiarare una matrice dinamica. Visto che sul libro non c'è ho cercato con google.
Dopo svariati risultati sono giunto a scrivere questo codice:

Codice sorgente - presumibilmente C++

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <malloc.h>
  4.  
  5. void creaM(int ***M, int n, int m);
  6. void inserisci(int **M, int *n, int *m);
  7. void visualizza(int **M, int n, int m);
  8.  
  9. int main(int argc, char *argv[])
  10. {
  11.   int **M, n, m;
  12.  
  13.   inserisci(M, &n, &m);
  14.   visualizza(M, n, m);
  15.   free(M);
  16.   system("PAUSE");    
  17.   return 0;
  18. }
  19.  
  20. void inserisci(int **M, int *n, int *m) {
  21.      int i, j;
  22.      
  23.      do {
  24.           printf("Inserisci il numero di righe\n");
  25.           scanf("%d", n);
  26.      } while(*n<0);
  27.  
  28.      do {
  29.           printf("Inserisci il numero di colonne\n");
  30.           scanf("%d", m);
  31.      } while(*m<0);
  32.      
  33.      creaM(&M, *n, *m);
  34.  
  35.      for (i=0; i<*n; i++) {
  36.          for (j=0; j<*m; j++) {
  37.             printf("Inserisci l'elemento di posizione %d, %d\n", i, j);
  38.             scanf("%d", &M[i][j]);
  39.          }
  40.      }
  41.      
  42. }
  43.  
  44. void visualizza(int **M, int n, int m) {
  45.      int i, j;
  46.      
  47.      for (i=0; i<n; i++) {
  48.          for (j=0; j<m; j++) {
  49.              printf("%d\t", &M[i][j]);
  50.          }
  51.          printf("\n");
  52.      }
  53. }
  54.  
  55. void creaM(int ***M, int n, int m) {
  56.      int i;
  57.  
  58.      *M = (int **)malloc(sizeof(int *)*n); //Alloco n vettori per quante sono le righe
  59.          
  60.      /* Alloco gli elementi di ogni vettore per formare le colonne */
  61.      for (i=0; i<n; i++) {
  62.          *(*M+i) = (int *)malloc(sizeof(int)*m); //Alloco m colonne
  63.      }
  64. }



Solo che quando visualizza i valori letti, restituisce valori errati.
Potete aiutarmi a capire qual'è il problema?
Vi sarei grato anche se mi illustraste procedimenti migliori.

Grazie mille a tutti comunque :)

Ultima modifica effettuata da crash outside control il 28/09/2010 alle 20:30
PM
Avatar
GuglielmoS (Ex-Member)
Pro


Messaggi: 114
Iscritto: 27/11/2009

Up
1
Down
V
Segnala al moderatore
Postato alle 21:01
Martedì, 28/09/2010
Questo visualizza l'indirizzo della cella in posizione (i,j), togliendo '&' dovrebbe andare correttamente.
Codice sorgente - presumibilmente Plain Text

  1. // printf("%d\t", &M[i][j]);
  2. printf("%d\t", M[i][j]);


PM
Avatar
crash outside control (Normal User)
Expert


Messaggi: 217
Iscritto: 12/02/2008

Up
1
Down
V
Segnala al moderatore
Postato alle 21:12
Martedì, 28/09/2010
Ti ringrazio per la risposta, ma senza '&', crasha il programma :yup:

PM
Avatar
TheWorm (Member)
Rookie


Messaggi: 24
Iscritto: 13/09/2009

Up
1
Down
V
Segnala al moderatore
Postato alle 0:46
Mercoledì, 29/09/2010
Penso che dovresti mettere questo
Codice sorgente - presumibilmente C/C++

  1. int i;
  2. for (i = 0; i < n; i++) free(M[i]);



prima di "free(M);" nella funzione main. Devi deallocare ciò che hai allocato in creaM!

PM
Avatar
GuglielmoS (Ex-Member)
Pro


Messaggi: 114
Iscritto: 27/11/2009

Up
0
Down
V
Segnala al moderatore
Postato alle 21:02
Martedì, 28/09/2010
Edit: scusate mi si era impallato il browser.

Ultima modifica effettuata da GuglielmoS il 28/09/2010 alle 21:03
PM
Avatar
TheWorm (Member)
Rookie


Messaggi: 24
Iscritto: 13/09/2009

Up
0
Down
V
Segnala al moderatore
Postato alle 0:06
Giovedì, 30/09/2010
Testo quotato

Postato originariamente da crash outside control:

TheWorm, grazie per la correzione, ma non è questo il problema ... Anche se è comunque un errore ;)



Già, infatti non intendevo dire che quello fosse il bug, ma UN bug. O come lo vuoi chiamare; spreco di memoria, garbage... Comunque anch'io sceglierei un'alternativa più semplice, come quella già proposta, anche se non mi piace granchè... Infatti manca ancora una volta del codice per liberare la memoria.
Comunque ecco qui (codice disponibile a http://sprunge.us/HQHY):

Codice sorgente - presumibilmente C++

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <assert.h>
  4.  
  5. static int *creaM(int, int);
  6. static void visualizza(int *, int, int);
  7.  
  8. int main(void)
  9. {
  10.     int *mat, n, m;
  11.  
  12.     printf("Inserisci la dimensione della matrice (x y):\n");
  13.     (void) scanf("%d %d", &n, &m);
  14.     mat = creaM(n, m);
  15.     visualizza(mat, n, m);
  16.     free(mat);
  17.  
  18.     return 0;
  19. }
  20.  
  21. int *creaM(int n, int m)
  22. {
  23.     int *p, *q;
  24.  
  25.     q = p = calloc((size_t)(n * m), sizeof(int));
  26.     assert(p != NULL);
  27.     for (; q<p+m*n; q++)
  28.     {
  29.         printf("Inserisci un numero:\n");
  30.         (void) scanf("%d",q);
  31.     }
  32.  
  33.     return p;
  34. }
  35.  
  36. void visualizza(int *mat, int n, int m){
  37.     int *p = mat;
  38.  
  39.     (void) puts("\nLa matrice:");
  40.     for (; p<mat+n*m; p++)
  41.     {
  42.         if ((mat - p) % n == 0)
  43.             (void) putchar('\n');
  44.         printf("%5d ", *p);
  45.     }
  46.     (void) putchar('\n');
  47.  
  48.     return;
  49. }



Auguri

Ultima modifica effettuata da TheWorm il 30/09/2010 alle 0:09
PM
Avatar
crash outside control (Normal User)
Expert


Messaggi: 217
Iscritto: 12/02/2008

Up
-1
Down
V
Segnala al moderatore
Postato alle 16:07
Mercoledì, 29/09/2010
TheWorm, grazie per la correzione, ma non è questo il problema ... Anche se è comunque un errore ;)

PM
Avatar
Alex (Ex-Member)
Expert


Messaggi: 441
Iscritto: 15/08/2005

Up
-1
Down
V
Segnala al moderatore
Postato alle 18:36
Mercoledì, 29/09/2010
io l'avrei fatto in una maniera molto più semplice...

Codice sorgente - presumibilmente C++

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. int *crea_mat(int n, int m);
  5. void visualizza_mat(int *mat, int n, int m);
  6.  
  7. int main(void){
  8.    int *mat,n,m;
  9.    printf("ins la dimensione della matrice");
  10.    scanf("%d %d",&n,&m);
  11.    mat=crea_mat(n,m);
  12.    visualizza_mat(mat,n,m);
  13.    return 0;
  14. }
  15. int *crea_mat(int n, int m){
  16.      int *p;
  17.      p=calloc(n*m,sizeof(int));
  18.      for(int *q=p;q <p+m*n;q++){
  19.             printf("\nins un numero ");
  20.             scanf("%d",q);
  21.      }
  22.      return p;
  23. }
  24. void visualizza_mat(int *mat, int n, int m){
  25.     for(int *p=mat;p<mat+n*m;p++)
  26.          printf("\n%d",*p);
  27.     return;
  28.    }
  29. int *crea_mat(int n, int m){
  30.      int *p;
  31.      p=calloc(n*m,sizeof(int));
  32.      for(int *q=p;q <=p+m*n;p++){
  33.             printf("\n ins un numero ");
  34.             scanf("%d",q);
  35.      }
  36.      return p;
  37. }
  38. void visualizza_mat(int *mat, int n, int m){
  39.     for(int *p=mat;p<=mar+n*m;p++)
  40.          printf("%d",*p);
  41.     return;
  42.    }



sembra più semplice no?

PM