Visualizzazione dei risultati da 1 a 6 su 6
  1. #1
    Utente di HTML.it
    Registrato dal
    Jan 2007
    Messaggi
    27

    [C] Matrice con una dimensione variabile

    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?

    Grazie a tutti

    Mario

  2. #2
    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:
    codice:
    /*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;
    }
    Amaro C++, il gusto pieno dell'undefined behavior.

  3. #3
    Utente di HTML.it
    Registrato dal
    Jan 2007
    Messaggi
    27
    grazie mille


    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?

  4. #4
    codice:
    array = (int *) malloc(10 * ind2 * sizeof(int))
    Amaro C++, il gusto pieno dell'undefined behavior.

  5. #5
    Utente di HTML.it
    Registrato dal
    Jan 2007
    Messaggi
    27
    ancora una volta TANTE GRAZIE!!!


  6. #6
    Prego!
    Amaro C++, il gusto pieno dell'undefined behavior.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.