Visualizzazione dei risultati da 1 a 7 su 7
  1. #1

    [C] Matrici multidimensionali dinamiche?

    Ciao a tutti,
    ho un problema nella creazione di matrici multidimensionali a dimensione variabile.

    Attualmente riesco a creare un array (singola dimensione) tramite malloc.

    Codice PHP:
    mioArray = (int *) malloc(sizeof(int)); 
    Se io volessi creare una matrice 2x2 per esempio?

  2. #2
    Utente di HTML.it L'avatar di KrOW
    Registrato dal
    Feb 2009
    Messaggi
    281
    Ciao . . . Devi prima allocare un numero di puntatori a int pari al numero delle righe della matrice, poi, per ogni riga, devi allocare un numero di interi pari al numero delle colonne della matrice:
    codice:
    #define N_ROW 2
    
    #define N_COL 2
    . . . 
    int** matrix = (int**)malloc( sizeof(int*) * N_ROW );
    for( int i=0; i < N_ROW; ++i )
    {
    matrix[ i ] = (int*)malloc( sizeof(int) * N_COL );
    }
    C++ 4ever
    496e2062696e6172696f206e6f6e2063692061767265737469 206e656d6d656e6f2020726f7661746f203a29

  3. #3
    Giusto, non ci avevo pensato!
    Grazie mille!

  4. #4
    Utente di HTML.it L'avatar di Alex'87
    Registrato dal
    Aug 2001
    residenza
    Verona
    Messaggi
    5,802
    Originariamente inviato da KrOW
    Ciao . . . Devi prima allocare un numero di puntatori a int pari al numero delle righe della matrice, poi, per ogni riga, devi allocare un numero di interi pari al numero delle colonne della matrice:
    codice:
    #define N_ROW 2
    
    #define N_COL 2
    . . . 
    int** matrix = (int**)malloc( sizeof(int*) * N_ROW );
    for( int i=0; i < N_ROW; ++i )
    {
    matrix[ i ] = (int*)malloc( sizeof(int) * N_COL );
    }
    Curiosità, perché hai dichiarato matrix come un puntatore a puntatore?
    SpringSource Certified Spring Professional | Pivotal Certified Enterprise Integration Specialist
    Di questo libro e degli altri (blog personale di recensioni libri) | ​NO M.P. TECNICI

  5. #5
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,466
    Originariamente inviato da Alex'87
    Curiosità, perché hai dichiarato matrix come un puntatore a puntatore?
    Proprio perchè deve puntare a un insieme di puntatori ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  6. #6
    Utente di HTML.it
    Registrato dal
    Jul 2008
    Messaggi
    1,326
    Se poi vuoi realizzare davvero matrici a "dimensione variabile", come da titolo, allora non credo che si possa fare altro che ricorrere ad un array monodimensionale sfruttando però la conoscenza del fatto che l'allocazione in memoria di matrici n-dimensionali, in C, avviene per righe, cioè una matrice bidimensionale tipo

    1 2 3
    4 5 6
    7 8 9

    viene memorizzata come

    1
    2
    3
    4
    5
    6
    7
    8
    9

    quindi anche se si tratta di un array 2D è possibile gestirlo come se fosse monodimensionale. Stessa cosa sarebbe per array a più dimensioni.

    Tempo fa scrissi un po' di codice per "uso personale", lo posto qui ma non ho curato alcun controllo e/o ottimizzazione, proprio perché non serviva praticamente a nulla. Tra l'altro sarebbe da migliorare la visualizzazione, che per ora non fa altro che mostrare tutte le sottomatrici 2D che costituiscono l'array n-dimensionale.

    codice:
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <errno.h>
    
    void my_alloc(int **x, int n)
    {
    	*x = (int *) malloc ( n * sizeof(int) );
    	if ( *x == NULL ) {
    		fprintf(stderr, "Errore durante l'allocazione della memoria: %s\n", strerror(errno));
    		exit(errno);
    	}
    }
    
    void my_free(int **x)
    {
    	free(*x);
    	*x = NULL;
    }
    
    int main(void)
    {
    	int *x, i, j = 0,
    	    *dimensioni, n_dim, size = 1,
    	    m, mn;
    
    	printf("Immettere il numero delle dimensioni della matrice da generare: ");
    	scanf("%d", &n_dim);
    
    	my_alloc(&dimensioni, n_dim);
    
    	printf("Per ogni dimensione, immetterne la lunghezza...\n");
    	for ( i = 0; i < n_dim; i++ ) {
    		printf("Dimensione %d\n", i);
    		scanf("%d", dimensioni + i);
    		size *= dimensioni[i];
    	}
    
    	m = dimensioni[0];
    
    	if ( n_dim > 1 )
    		mn = m*dimensioni[1];
    
    	my_alloc(&x, size);
    
    	for ( i = 0; i < size; i++ )
    		x[i] = rand() % 100;
    
    	for ( i = 0; i < size; i++ ) {
    
    		if ( ! (i % mn) ) {
    			printf("\n\nMatrice: %d\n", j);
    			j++;
    		}
    		if ( ! (i % m) )
    			putchar('\n');
    		
    		printf("%2d ", x[i]);
    	}
    
    	puts("\n\n");
    
    	my_free(&x);
    	my_free(&dimensioni);
    
    	return 0;
    }
    every day above ground is a good one

  7. #7
    Utente di HTML.it L'avatar di Alex'87
    Registrato dal
    Aug 2001
    residenza
    Verona
    Messaggi
    5,802
    Originariamente inviato da oregon
    Proprio perchè deve puntare a un insieme di puntatori ...
    :master: Qualche tempo fa avevo letto questo ma evidentemente avrò capito male
    SpringSource Certified Spring Professional | Pivotal Certified Enterprise Integration Specialist
    Di questo libro e degli altri (blog personale di recensioni libri) | ​NO M.P. TECNICI

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.