Visualizzazione dei risultati da 1 a 9 su 9
  1. #1
    Utente di HTML.it
    Registrato dal
    Jun 2009
    Messaggi
    5

    [C]Aiuto per allocazione dinamica di una matrice

    Salve a tutti quanti..
    Sono alle prese con un problema che nn riesco a risolvere..
    Programmando un po in C ho avuto dei problemi con una funzione che mi allocava dinamicamente una matrice avendo passato per indirizzo un puntatore a matrice..
    Con una funzione che prevedeva il ritorno del puntatore a matrice ci sono riuscito ,invece se cerco di creare una funzione void che mi allochi memoria x la matrice senza il ritorno di niente mi da un errore nell'esecuzione del programma.. Di seguido posto le linee di codice del programmino sperando che qualke anima buona mi sappia spiegare il xk nn funge
    Grazie a tutti anticipatamente per l'aiuto, e spero di contribuire anche io alla risoluzione del problema..

    Dechk


    codice:
    #include <stdlib.h>
    #include <stdio.h>
    
    void alloca_matrice(int***,int,int);
    void carica_matrice(int***,int,int);
    void stampa_matrice(int**,int,int);
    
    int main()
    {
    	int righe,colonne;
    	int **matrice = NULL;
    	printf("Inserire numero di righe della matrice da allocare: ");
    	scanf("%d",&righe);
    	printf("\n\nInserire numero di colonne della matrice da allocare: ");
    	scanf("%d",&colonne);
    
    
    	alloca_matrice(&matrice, righe, colonne);
    
    	carica_matrice(&matrice,righe,colonne);
    
    	stampa_matrice(matrice,righe,colonne);
    
    	getchar();
    	getchar();
    	return 0;
    }
    
    void alloca_matrice(int ***m,int r,int c){
    	int i,j;
    	*m = malloc(r*sizeof(int*));
    	for(i=0;i<r;i++){
    		printf("\nAllocata riga %d",i+1);
    		m[i] = malloc(c*sizeof(int));
    	}
    	for(i=0;i<r;i++)
    		for(j=0;j<c;j++)
    			m[i][j] = 0;
    		
    	for(i=0;i<r;i++){
    		printf("\n");
    		for(j=0;j<c;j++)
    			printf("\t%d\t",m[i][j]);
    		}
    }
    
    void carica_matrice(int ***m,int r,int c){
    	int i,j;
    	for(i=0;i<r;i++)
    		for(j=0;j<c;j++){
    			printf("\n\nInserisci valore in [%d][%d]: ",i,j);
    			scanf("%d",&m[i][j]);
    		}
    
    }
    
    void stampa_matrice(int **m,int r,int c){
    	int i,j;
    	for(i=0;i<r;i++)
    		printf("\n");
    		for(j=0;j<c;j++)
    			printf("\t%d\t",m[i][j]);
    	
    }

  2. #2
    Utente di HTML.it
    Registrato dal
    Jul 2008
    Messaggi
    1,326
    Guarda tempo fa si discuteva praticamente della stessa cosa in questo topic

    http://forum.html.it/forum/showthrea...readid=1335351

    in realtà qui il problema era un altro, ma lascia stare e leggi il sesto post: puoi vedere che ho scritto proprio come risolvere il problema che ti sei posto, cioè l'allocazione (e la deallocazione) dinamica della memoria di una matrice all'interno di procedure.

    A parte passare alla funzione un puntatore a puntatore a puntatore (che è gestibile, ma magari può dare fastidio) si può ricorrere anche ad un puntatore singolo. Ci sono entrambe le soluzioni... leggi e se hai problemi posta pure.

    Fatto questo, ti consiglio (per esercizio) di provare a fare lo stesso con una matrice tridimensionale... in pratica la funzione di allocazione (e similmente quella di deallocazione) sarà dichiarata tipo così:

    void my_alloc(int ****x)

    può non essere facile riuscire a farlo, ma se ci riesci puoi praticamente dire di aver capito cos'è un puntatore :_D
    every day above ground is a good one

  3. #3
    Utente di HTML.it
    Registrato dal
    Jun 2009
    Messaggi
    5
    Ciao YuYevon, grazie tante x la risposta e x l'aiuto..
    Solo una cosa nn mi è chiara, ovvero quando hai scritto :
    codice:
    *(*x+i) = (int *) malloc( 10 * sizeof(int) );
    Sarebbe lo stesso se io scrivessi
    codice:
    *x[i]= (int *) malloc( 10 * sizeof(int) );
    o mi sto sbagliando? e se sta bene xk quando ho provato lo stesso nn me la fa allocare? grazie ankora x i consigli!!

  4. #4
    Utente di HTML.it
    Registrato dal
    Jul 2008
    Messaggi
    1,326
    Penso che la questione riguardi la priorità degli operatori. Come è scritto qui:

    http://digilander.libero.it/uzappi/C/C-precedenze.html

    le parentesi quadre hanno priorità maggiore sull'operatore di deferenziazione *, quindi la scrittura

    *x[i]

    dovrebbe equivalere a

    *(*(x + i)

    che ovviamente non è la stessa cosa di

    *(*x+i)

    quindi in questo caso è meglio utilizzare la notazione a puntatore, così ricorriamo alle parentesi tonde e lasciamo perdere tutte le considerazioni sulle priorità degli operatori :]
    every day above ground is a good one

  5. #5
    Utente di HTML.it
    Registrato dal
    Jun 2009
    Messaggi
    5
    Capisco ma purtroppo nn mi funge ancora
    Ho fatto letteralmente copia ed incolla sul programmino ma lo stesso(cambiando le variabili ecc.) ma esce sempre lo stesso errore.. Facendo stampare "Allocata riga i-esima" vedo che alloca la prima e la seconda e poi crasha.. E nn so spiegarmi il motivo.. Forse va a toccare parti di memoria riservata ad altro oppure nn so

  6. #6
    Utente di HTML.it
    Registrato dal
    Jul 2008
    Messaggi
    1,326
    Scusa ma se provi a compilare esattamente quel codice che ho scritto io ti da problemi? Io lo provai sia su Windows (con Dev) che su Linux (con gcc) e non avevo problemi né in compilazione né in esecuzione.
    Quali sono le modifiche che hai fatto? Posta il codice completo che non va...
    every day above ground is a good one

  7. #7
    Utente di HTML.it
    Registrato dal
    Jun 2009
    Messaggi
    5
    Allora, compilando (su visual studio 6.0) il programma che hai scritto tu mi va tutto liscio, solo che apportando le modifiche al mio lo stesso mi da un errore a runtime..
    Ecco la mia funziona alloca :

    codice:
    void alloca_matrice(int ***m ,int r ,int c){
    	int i,j;
    	*m = (int **) malloc ( r * sizeof(int *) );  
    	
                 for(i=0;i<r;i++){
    		printf("\nAllocata riga %d",i+1);
    		*(*m+i) = (int *) malloc( c * sizeof(int) );
    	}
    	for(i=0;i<r;i++)
    		for(j=0;j<c;j++)
    			m[i][j] = 0;
    		
    	for(i=0;i<r;i++){
    		printf("\n");
    		for(j=0;j<c;j++)
    			printf("\t%d\t",m[i][j]);
    		}
    }

  8. #8
    Utente di HTML.it
    Registrato dal
    Jul 2008
    Messaggi
    1,326
    Sì ovvio perché nel doppio ciclo for di assegnazione e in quello di stampa stai trattando m come se fosse una matrice, cioè un puntatore a puntatore, ma tu lì hai un puntatore a puntatore a puntatore...

    Devi modificare così

    codice:
    	for(i=0;i<r;i++)
    		for(j=0;j<c;j++)
    			(*m)[i][j] = 0;
    per il ciclo di inizializzazione... e praticamente la stessa cosa per la stampa.

    Con la notazione a puntatore, questa riga

    (*m)[i][j] = 0;

    dovrebbe equivalere a

    *(*(*x + i) + j);

    EDIT: comunque se devi inizializzare tutti gli elementi della matrice a 0 (e non ad altri valori), tanto vale fare l'allocazione dinamica con la calloc() anziché la malloc()...
    every day above ground is a good one

  9. #9
    Utente di HTML.it
    Registrato dal
    Jun 2009
    Messaggi
    5
    Ah si è vero che sbadato
    ora grazie ai tuoi aiuti ho risolto il problema grazie infinite x tutto quanto
    Ps no nn mi serviva necessariamente inizializzare la matrice a 0, era solo una piccola prova x vedere se me la allocava bene

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.