Se dici che funziona non perdo tempo a controllarlo, anche perché non ho capito il senso di alcune variabili (tipo "s" o "mode"...) e funzioni (azzera() e soluzione())
Comunque in tutta sincerità questa funzione
scritta così non mi piace molto, perché quando un parametro è sia di input che di output è "carino" passarlo per riferimento... ora poiché il parametro in questione è già un puntatore a puntatore, passarlo per riferimento significa passare un puntatore a puntatore a puntatore, e se non si fa attenzione si rischia di invecchiare prestocodice:char** nuova(int l, int h, char **p){ int i, j; p=(char **) malloc( h * sizeof(char *)); for (i=0; i<h; i++){ p[i]=(char *) malloc( l * sizeof(char)); } return p; }
(è chiaro che sia l'esempio di sopra che il prossimo ricorrono a dimensioni fisse della matrice - 10x10 - ma non ci vuole nulla a generalizzarli...)codice:#include <stdio.h> #include <stdlib.h> void my_alloc(int ***x) { int i; *x = (int **) malloc ( 10 * sizeof(int *) ); for ( i = 0; i < 10; i++ ) *(*x+i) = (int *) malloc( 10 * sizeof(int) ); } void my_free(int ***x) { int i; for ( i = 0; i < 10; i++ ) { free(*(*x+i)); *(*x+i) = NULL; } free(*x); *x = NULL; } int main(void) { int **x, i, j; my_alloc(&x); for ( i = 0; i < 10; i++ ) for ( j = 0; j < 10; j++ ) x[i][j] = rand()%10; for ( i = 0; i < 10; i++ ) { for ( j = 0; j < 10; j++ ) printf("%d ", x[i][j]); putchar('\n'); } my_free(&x); return 0; }
Il modo più "cristiano" di operare in questo caso sarebbe quello di ricordare che, almeno in C (e ovviamente non è così per tutti i linguaggi) una matrice non è nient'altro che un array costituito dalle colonne della matrice stessa una dopo l'altra, quindi la matrice
1 2 3
4 5 6
7 8 9
in memoria viene salvata come
1
2
3
4
5
6
7
8
9
quindi a questo punto la matrice x di cui sopra si può dichiarare come un semplice puntatore e poi utilizzare la mappa di memorizzazione per accedere ai suoi elementi. Il programma di sopra diventa quindi
dove la mappa di memorizzazione (che si può vedere in entrambi i for) in generale è la seguente:codice:#include <stdio.h> #include <stdlib.h> void my_alloc(int **x) { *x = (int *) malloc ( 10 * 10 * sizeof(int) ); } void my_free(int **x) { free(*x); *x = NULL; } int main(void) { int *x, i, j; my_alloc(&x); for ( i = 0; i < 10; i++ ) for ( j = 0; j < 10; j++ ) *(x + i*10 + j) = rand() % 10; for ( i = 0; i < 10; i++ ) { for ( j = 0; j < 10; j++ ) printf("%d ", *(x + i*10 + j)); putchar('\n'); } my_free(&x); return 0; }
codice:*(indirizzo_base_array + indice_di_riga * n_colonne + indice_di_colonna)

Rispondi quotando