Oppure

Loading
28/09/10 18:27
crash outside control
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:

#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>

void creaM(int ***M, int n, int m);
void inserisci(int **M, int *n, int *m);
void visualizza(int **M, int n, int m);

int main(int argc, char *argv[])
{
  int **M, n, m;
  
  inserisci(M, &n, &m);
  visualizza(M, n, m);
  free(M);
  system("PAUSE");    
  return 0;
}

void inserisci(int **M, int *n, int *m) {
     int i, j;
     
     do {
          printf("Inserisci il numero di righe\n");
          scanf("%d", n);
     } while(*n<0);

     do {
          printf("Inserisci il numero di colonne\n");
          scanf("%d", m);
     } while(*m<0);
     
     creaM(&M, *n, *m);

     for (i=0; i<*n; i++) {
         for (j=0; j<*m; j++) {
            printf("Inserisci l'elemento di posizione %d, %d\n", i, j);
            scanf("%d", &M[i][j]);
         }
     }
     
}

void visualizza(int **M, int n, int m) {
     int i, j;
     
     for (i=0; i<n; i++) {
         for (j=0; j<m; j++) {
             printf("%d\t", &M[i][j]);
         }
         printf("\n");
     }
}

void creaM(int ***M, int n, int m) {
     int i;

     *M = (int **)malloc(sizeof(int *)*n); //Alloco n vettori per quante sono le righe
          
     /* Alloco gli elementi di ogni vettore per formare le colonne */
     for (i=0; i<n; i++) {
         *(*M+i) = (int *)malloc(sizeof(int)*m); //Alloco m colonne
     }
}
         


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 28/09/10 18:30
aaa
28/09/10 19:01
GuglielmoS
Questo visualizza l'indirizzo della cella in posizione (i,j), togliendo '&' dovrebbe andare correttamente.
// printf("%d\t", &M[i][j]);
printf("%d\t", M[i][j]);
aaa
28/09/10 19:02
GuglielmoS
Edit: scusate mi si era impallato il browser.
Ultima modifica effettuata da GuglielmoS 28/09/10 19:03
aaa
28/09/10 19:12
crash outside control
Ti ringrazio per la risposta, ma senza '&', crasha il programma :yup:
aaa
28/09/10 22:46
TheWorm
Penso che dovresti mettere questo
int i;
for (i = 0; i < n; i++) free(M[i]);


prima di "free(M);" nella funzione main. Devi deallocare ciò che hai allocato in creaM!
aaa
29/09/10 14:07
crash outside control
TheWorm, grazie per la correzione, ma non è questo il problema ... Anche se è comunque un errore ;)
aaa
29/09/10 16:36
Alex
io l'avrei fatto in una maniera molto più semplice...

#include <stdio.h>
#include <stdlib.h>

int *crea_mat(int n, int m);
void visualizza_mat(int *mat, int n, int m);

int main(void){
   int *mat,n,m;
   printf("ins la dimensione della matrice");
   scanf("%d %d",&n,&m);
   mat=crea_mat(n,m);
   visualizza_mat(mat,n,m);
   return 0;
}
int *crea_mat(int n, int m){
     int *p;
     p=calloc(n*m,sizeof(int));
     for(int *q=p;q <p+m*n;q++){
            printf("\nins un numero ");
            scanf("%d",q);
     }
     return p;
}
void visualizza_mat(int *mat, int n, int m){
    for(int *p=mat;p<mat+n*m;p++)
         printf("\n%d",*p);
    return;
   }
int *crea_mat(int n, int m){
     int *p;
     p=calloc(n*m,sizeof(int));
     for(int *q=p;q <=p+m*n;p++){
            printf("\n ins un numero ");
            scanf("%d",q);
     }
     return p;
}
void visualizza_mat(int *mat, int n, int m){
    for(int *p=mat;p<=mar+n*m;p++)
         printf("%d",*p);
    return;
   }



sembra più semplice no?
aaa
29/09/10 22:06
TheWorm
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 sprunge.us/…):

#include <stdio.h>
#include <stdlib.h>
#include <assert.h>

static int *creaM(int, int);
static void visualizza(int *, int, int);

int main(void)
{
    int *mat, n, m;

    printf("Inserisci la dimensione della matrice (x y):\n");
    (void) scanf("%d %d", &n, &m);
    mat = creaM(n, m);
    visualizza(mat, n, m);
    free(mat);

    return 0;
}

int *creaM(int n, int m)
{
    int *p, *q;

    q = p = calloc((size_t)(n * m), sizeof(int));
    assert(p != NULL);
    for (; q<p+m*n; q++)
    {
        printf("Inserisci un numero:\n");
        (void) scanf("%d",q);
    }

    return p;
}

void visualizza(int *mat, int n, int m){
    int *p = mat;

    (void) puts("\nLa matrice:");
    for (; p<mat+n*m; p++)
    {
        if ((mat - p) % n == 0)
            (void) putchar('\n');
        printf("%5d ", *p);
    }
    (void) putchar('\n');

    return;
}


Auguri
Ultima modifica effettuata da TheWorm 29/09/10 22:09
aaa