PDA

Visualizza la versione completa : [C] Matrice con una dimensione variabile


spike79
11-09-2007, 16:50
Ho letto in altri post su come assegnare memoria dinamicamente per una matrice quadrata.

Nel mio caso una delle due dimensioni è fissa a 10, l'altra vorrei immetterla da tastiera: non cerco quindi una matrice quadrata.

Qualcuno può aiutarmi a risolvere questo problema? :confused: :confused:

Grazie a tutti :)

Mario

MItaly
11-09-2007, 17:08
Ecco un programmino didattico che ho scritto un po' di tempo fa' che illustra come usare l'allocazione dinamica per creare matrici di dimensioni arbitrarie:


/*Per printf, scanf, ...*/
#include "stdio.h"
/*Per getchar*/
#include "conio.h"
/*Per malloc, free, rand, srand*/
#include "stdlib.h"
/*Per time*/
#include "time.h"
/*Costanti di codici di errori standard da winerr.h*/
#define ERROR_SUCCESS 0L
#define ERROR_OUTOFMEMORY 14L

/*Punto d'ingresso*/
int main()
{
/*Puntatore ad interi (dopo punterà all'area per l'array)*/
int *array;
/*Varie variabili*/
unsigned int ind1=0, ind2=0, count1, count2;
/* ^| ^| ^| ^+ contatore per le colonne
| | + contatore per le righe
| + numero di colonne
+ numero di righe
Nota: inizializzo ind1 e ind2 perché le variabili locali non vengono inizializzate
automaticamente; se l'utente in seguito non inserisse nulla o inserisse solo il primo valore,
una o entrambe le variabili resterebbe(ro) immutata(e), ossia con un valore indeterminato. */
printf("Inserire le dimensioni della matrice [righe,colonne]: ");
/*Richiesta delle dimensioni dell'array*/
scanf("%u,%u",&ind1,&ind2);
printf("Servono %u bytes. ",ind1*ind2*sizeof(int));
printf("Allocazione della memoria...\n");
/*Alloca la memoria*/
array=(int *) malloc(ind1*ind2*sizeof(int));
if (array==NULL)
{
/*Se malloc ha restituito un puntatore NULL significa che non c'è abbastanza memoria*/
printf("Memoria insufficiente.\n");
printf("Premere un tasto per uscire...");
getch();
/*Restituisce il codice di errore corrispondente*/
return ERROR_OUTOFMEMORY;
}
/*Ok, la memoria è stata allocata correttamente*/
printf("Memoria allocata.\n");
printf("Inizializzazione generatore numeri casuali...\n");
/*Inizializza il generatore di numeri casuali*/
srand((unsigned int ) time(NULL));
/* ^^^^^^^^^^ restituisce l'ora corrente
^^^^^^^^^^^^^^^^^^^^^^^^^^ ora corrente come intero senza segno usato come seme per srand*/
/*Ciclo per riempire l'array*/
printf("Riempimento array...\n");
for (count2=0;count2<ind2; count2++)
{
for (count1=0; count1<ind1; count1++)
{
*((int *) array+(count1*ind2)+count2)=rand();
/*
Esempio: questa tabella
0 1 2 3 4
+--+--+--+--+--+
0| | | | | |
+--+--+--+--+--+
1| | | | | |
+--+--+--+--+--+
2| | | | | |
+--+--+--+--+--+
3| | |[]| | |
+--+--+--+--+--+
4| | | | | |
+--+--+--+--+--+
5| | | | | |
+--+--+--+--+--+
come si può immaginare, in memoria è così:
Coordinate XY 00 01 02 03 04 10 11 12 13 14 20 21 22 23 24 30 31 32 33 34 40 41 42 43 44 50 51 52 53 54
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
| | | | | | | | | | | | | | | | | |[]| | | | | | | | | | | | |
Posizione +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
(array + ...) 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
Per raggiungere la posizione del quadratino [] (2,3):
1. Si ricava lo shift di posizioni rispetto a (0,0), ossia da array
a. Si moltiplica la riga della posizione desiderata (3) per il numero di colonne (5) -> 3*5=15
b. Si aggiunge la colonna della posizione desiderata (2) -> 15+2=17 (vedi sopra)
2. Si somma lo shift alla locazione di memoria di (0,0), ossia ad array,avendo cura di usare
(tipo *) (qui tipo è int) perché il C applichi correttamente l'aritmetica dei puntatori.
*/

}
}
printf("Array riempito\n");
for (count2=0;count2<ind2; ++count2)
{
for (count1=0 ; count1<ind1; ++count1)
{
/*Stesso ragionamento*/
printf("%d",*((int *) array+(count1*ind2)+count2));
printf("\t");
}
printf("\n");
}
printf("Deallocazione array...\n");
/*Dealloca la memoria*/
free(array);
printf("Premere un tasto per uscire...");
getch();
/*Tutto è andato a finire bene; codice d'uscita standard.*/
return ERROR_SUCCESS;
}

spike79
11-09-2007, 17:16
grazie mille :zizi: :zizi:


il comando chiave mi sembra questo quindi:

array=(int *) malloc(ind1*ind2*sizeof(int));


se fisso uno dei due indici, ad es:

array = (int *) malloc (10 ind2* sizeof(int))


ho risolto giusto?

MItaly
11-09-2007, 17:20
array = (int *) malloc(10 * ind2 * sizeof(int))

spike79
11-09-2007, 17:29
ancora una volta TANTE GRAZIE!!!

:unz: :unz: :unz: :unz:

MItaly
11-09-2007, 17:29
Prego! :ciauz:

Loading