PDA

Visualizza la versione completa : [C] Allocazione dinamica per array bidimensionale e passaggio come parametro


Fenzo
07-01-2011, 17:04
ciao a tutti
ho un problema con un esercizio.
Devo creare un array bidimensionale di tipo char dopo aver dato la dimensione in input.
Poi tale array deve essere passato come argomento in una funzione.
Il problema è il programma si chiude subito, non posso immettere nenche i parametri. Penso che il problema sia proprio nella creazione della matrice; dato che sono ancora agli inizi con il C mi affido alla vostra sapienza
grazie

questo è il codice


int main(){
int k, n, r0, c0;
char M[n][n], *a;
printf("inserisci ordine matrice\n");
scanf("%d",&n);
printf("inserisci indice prima riga\n");
scanf("%d",&r0);
printf("inserisci indice prima colonna\n");
scanf("%d",&c0);
printf("inserisci ordine tappeto\n");
scanf("%d",&k);
a=malloc(n*n*sizeof(char));
M[0][0]=*a;
sierpinskiCarpet(n,M[n][n],r0,c0,k);
system("PAUSE");
return 0;
}

Celebron
07-01-2011, 17:17
Originariamente inviato da Fenzo
ciao a tutti
ho un problema con un esercizio.
Devo creare un array bidimensionale di tipo char dopo aver dato la dimensione in input.
Poi tale array deve essere passato come argomento in una funzione.
Il problema è che dopo aver immesso tutti i parametri richiesti dal main, il programma si chiude, come se la funzione non venisse chiamata. Penso che il problema sia proprio nella creazione della matrice; dato che sono ancora agli inizi con il C mi affido alla vostra sapienza
grazie

questo è il codice


int main(){
int k, n, r0, c0;
char M[n][n], *a;
printf("inserisci ordine matrice\n");
scanf("%d",&n);
printf("inserisci indice prima riga\n");
scanf("%d",&r0);
printf("inserisci indice prima colonna\n");
scanf("%d",&c0);
printf("inserisci ordine tappeto\n");
scanf("%d",&k);
a=malloc(n*n*sizeof(char));
M[0][0]=*a;
sierpinskiCarpet(n,M,r0,c0,k);
system("PAUSE");
return 0;
}


a=malloc(n*n*sizeof(char)); <--- WRONG

prima allochi le righe
poi con un for allochi le colonne

con la tua soluzione hai semplicemente creato un array A di n*n "caselle"

edit: in più non capisco la parte iniziale dove hai un
char M[n][n] senza avere n inizializzata a nessun valore

ma scusa il compilatore non ti restituisce nessun warning? Se no, per favore, cambialo

e non capisco nemmeno il fatto che poi a M assegni "a"
facendo un M[n][n] già allochi (allocazione automatica), non ha senso fare ciò che tu hai fatto.

Dovresti prima creare un char** M;
quindi fare l'allocazione dinamica come ti ho spiegato sopra

a quel punto puoi accedere alle posizione di M come se fosse una matrice normale.

Fenzo
07-01-2011, 17:35
Originariamente inviato da Celebron
a=malloc(n*n*sizeof(char)); <--- WRONG

prima allochi le righe
poi con un for allochi le colonne

con la tua soluzione hai semplicemente creato un array A di n*n "caselle"

quindi se ho capito bene dovrei scrivere


a=malloc(n*sizeof(char));
for (i=0,i<=n,i++)
*(a+i)=malloc(n*sizeof(char))




edit: in più non capisco la parte iniziale dove hai un
char M[n][n] senza avere n inizializzata a nessun valore

ma scusa il compilatore non ti restituisce nessun warning? Se no, per favore, cambialo

e non capisco nemmeno il fatto che poi a M assegni "a"
facendo un M[n][n] già allochi (allocazione automatica), non ha senso fare ciò che tu hai fatto.

Dovresti prima creare un char** M;
quindi fare l'allocazione dinamica come ti ho spiegato sopra

a quel punto puoi accedere alle posizione di M come se fosse una matrice normale.

per quanto riguarda il compilatore, uso devc++. Lo so che fa schifo ma sul computer che sto usando ora ho windows e non sono riuscito a trovare di meglio. E comunque (e la cosa mi preoccupa!) non mi da nessun warning.
Il fatto è che questo è uno degli esercizi che ha assegnato il professore. Già non sono sicuro di poter usare l'allocazione dinamica e inoltre la funzione che devo fare deve avere come parametro M[n][n] non un puntatore.

Celebron
07-01-2011, 17:52
Originariamente inviato da Fenzo
quindi se ho capito bene dovrei scrivere


a=malloc(n*sizeof(char));
for (i=0,i<=n,i++)
*(a+i)=malloc(n*sizeof(char))




per quanto riguarda il compilatore, uso devc++. Lo so che fa schifo ma sul computer che sto usando ora ho windows e non sono riuscito a trovare di meglio. E comunque (e la cosa mi preoccupa!) non mi da nessun warning.
Il fatto è che questo è uno degli esercizi che ha assegnato il professore. Già non sono sicuro di poter usare l'allocazione dinamica e inoltre la funzione che devo fare deve avere come parametro M[n][n] non un puntatore.

no, essendo a un char **, l'allocazione deve essere congrua con il tipo


a = (char**) malloc( n* sizeof(char*));
for (i=0; i<n; i++) // <, non <=
a[i]= (char*) malloc(n*sizeof(char));


in ogni caso, quando passi una matrice a una funzione, nel prototipo della funzione scrivi:

funzione(tipo_t** mat){
//qua dentro poi può far riferimento con i metodi di accesso classico
}

Magari alla funzione passa anche gli indici max_riga e max_colonna, in modo che tu possa controllare in eventuali cicli di non andare outofbound

Fenzo
07-01-2011, 20:24
ok ho capito.
comunque il prototipo della funzione che devo fare e questo


void sierpinskiCarpet(int n, char[n][n], r0, c0, k)


il fatto è che ho chiesto al professore e ha detto che l'allocazione non serve.
Ora mi viene la curiosità di capire come posso creare quell'array senza usare malloc...

shodan
07-01-2011, 20:33
Dovresti anche chiedergli a che standard C fa riferimento, se C89 o C99.
Una dichiarazione simile (al di la che n non sia inizializzata) funziona solo in C99.


int k, n , r0, c0;
char M[n ][n ], *a;

ma non in C89 o in C++. In DEVC++ dovresti avere uno switch del compilatore per forzare l'uso tra i due standard.

Fenzo
07-01-2011, 21:37
il manuale che ha consigliato fa riferimento a ANSI C, quindi penso che il professore faccia riferimento a quello.

Nel frattempo mi sto scaricando ubuntu, almeno avrò un compilatore decente.
Ora un 'altra domanda: è possibile fare una cosa del genere


int main (){
int n;
printf("inserisci ordine matrice\n");
scanf("%d", &n);
.
.
.
char M[n][n];


cioè dichiarò l'array dopo aver letto n?
Inoltre, quando chiamo la funzione, dato che le dimensioni dell'array devono essere indicate, posso usare n oppure deve essere per forza un numero?

Loading