Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
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++
#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");
return0;
}
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 il 28/09/2010 alle 20:30
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++
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
staticint*creaM(int, int);
staticvoid 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);
return0;
}
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 il 30/09/2010 alle 0:09