[c] Passaggio di array 2D a funzione

di il
10 risposte

[c] Passaggio di array 2D a funzione

Salve a tutti,
ho un quesito.

Leggo da file una matrice n*n
e devo passare i valori letti ad una funzione.

questo è il codice:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define N_SEDI 9

/* dichiarazione delle funzioni */
int legge_matrice_costi();
void stampa_matrice_letta(int [][N_SEDI]);


/*** definizione delle funzioni ***/

/* legge la matrice di adiacenza dei costi */
int legge_matrice_costi()
{
	int i = 0,
	    j = 0,
		 n = N_SEDI;
	
	FILE *file_costi;
	
   file_costi = fopen("costi.txt", "r");
   
	int costo[n][n];
	
	if(file_costi == NULL)
		printf("Impossibile aprire il file");
	else
	{
		for (i = 0; i < n; i++)
			for (j = 0; j < n; j++)
				fscanf(file_costi, "%d", &costo[i][j]);
	}
				
	fclose(file_costi);

	return(costo[i][j]);
}

/* stampa a video i valori letti dai file */
void stampa_matrice_letta(int costo[N_SEDI][N_SEDI])
{	
	int i,
       j,
		 n = N_SEDI;
	
	printf("    ");
      
	for (i = 0; i < n; ++i)
   {
		for (j = 0; j < n; ++j)
			printf("%d", costo[i][j]);
         printf("\n");
	}
	printf("\n");
}

int main(void)
{
	int costo[N_SEDI][N_SEDI];
	
   costo[N_SEDI][N_SEDI] = legge_matrice_costi();
	
	stampa_matrice_letta(costo[N_SEDI][N_SEDI]);
	
   return(0);
}
in fase di compilazione ho i seguenti errori:
01_funzioni.c: In function ‘main’:
01_funzioni.c:75:2: warning: passing argument 1 of ‘stampa_matrice_letta’ makes pointer from integer without a cast [enabled by default]
01_funzioni.c:52:6: note: expected ‘int (*)[9]’ but argument is of type ‘int’

dove sbaglio?
grazie per le eventuali risposte

10 Risposte

  • Re: [c] Passaggio di array 2D a funzione

    int legge_matrice_costi()
    questa ritorna un int. Tu stai assegnando un int ad una matrice nel main. Cos'è che vorresti fare?
  • Re: [c] Passaggio di array 2D a funzione

    Devo acquisire tutti i valori della matrice
    e passarli alla funzione
    tutto qui!
  • Re: [c] Passaggio di array 2D a funzione

    Fai accettare alla funzione legge_matrice_costi una matrice e modifica la funzione in modo che ritorni nulla. a sto punto chiama la funzione in questo modo:
    
    int main(void)
    {
       int costo[N_SEDI][N_SEDI];
       
       legge_matrice_costi(costo);
       
       stampa_matrice_letta(costo);
       
       return(0);
    }
    
  • Re: [c] Passaggio di array 2D a funzione

    Grazie skynet per le risposte!!

    certo, può essere una soluzione, anche se sinceramente preferirei che la funzione
    legge_matrice_costi();
    restituisca un valore
    in modo tale che possa riutilizzarli nelle altre funzioni
    o passarli alle strutture.

    In ogni caso, ...
    il tuo suggerimento restituisce gli indirizzi della memoria dei valori
    e non i valori, ovvero:
    99909999999991213999999
    79990599999999999910
    8999508999999999999
    99999999980109995999
    999129999991007999999
    999139999999997079
    9999999999995999701
    -1073745732134513964134514498134514496-1207962308-1208089452-1207991706-120796230824
    -1073745852-1208025086-1208004964136614974720-1208089900-1209753600-1208021931-1073745732

    cosa sbaglio?
  • Re: [c] Passaggio di array 2D a funzione

    anche se sinceramente preferirei che la funzione
    legge_matrice_costi();
    restituisca un valore
    Allora fai si che la funzione restituisca un int ** ed utilizza l'allocazione dinamica. esempio:
    
    int ** legge_matrice_costi()
    {
        int **m;
        m = (int**)malloc(N_SEDI * sizeof(int *));
         for(i = 0; i < N_SEDI; i++)
               m[i] = (int*) malloc(N_SEDI * sizeof(int));
    ..........................
    
    return m;
    }
    
    ..............
    
    int main(void)
    {
       int **costo = legge_matrice_costi();
       
       stampa_matrice_letta(costo);
       
       return(0);
    }
    
    
    non ti dimenticare di liberare lo spazio dopo l'utilizzo con free.
  • Re: [c] Passaggio di array 2D a funzione

    La soluzione che mi hai proposto dell'allocazione dinamica della memoria è la mia scelta iniziale,
    e tutto ha funzionato bene!!!
    i valori vengono acquisiti correttamente e riesco a passarli correttamente.
    Ma, ...
    ad un certo punto del programma
    utilizzando l'ennesima funzione
    il debagger ha restituito il classico errore
    "segmentation fault"
    ed in questo caso sono costretto ad aumentargli la dimensione n della memoria!!!

    Mi chiedevo quindi, ...
    se la dimensione della matrice n*n io la conosco a priori
    n = 9;
    perchè devo utilizzare un'allocazione dinamica se il mio array 2D è in realtà statico???

    tnks
  • Re: [c] Passaggio di array 2D a funzione

    Allora devi fare un pò di chiarezza. Una funzione non puo ritornarti una matrice in modo statico perche il ritorno viene per valore. Questa funzione ti ritorna solo la posizione del puntatore iniziale ma siccome le variabili locali cessano di esistere appena si esce dalla funzione, il puntatore che la funzione ti ritorna non è valido perche ciò a cui lui punta è stato distrutto.
    esempio
    
    int ** legge_matrice_costi()
    {
       int m[N_SEDI][N_SEDI];
    .......
    
      return m;
    }
    
    a te viene ritornato (per valore) solo dove punta m, ma siccome sei uscito dalla funzione il contenuto di m viene distrutto.
    per quello che ti dicevo di passare la tua matrica alla funzione e di riempirla da lì, così il puntatore non si muove, cambiano solo i suoi dati all'interno.
  • Re: [c] Passaggio di array 2D a funzione

    Prova un attimo sto modello. Vedi se ti funziona.
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    #define N_SEDI 9
    
    /* dichiarazione delle funzioni */
    void legge_matrice_costi(int [][N_SEDI]);
    void stampa_matrice_letta(int [][N_SEDI]);
    
    
    /*** definizione delle funzioni ***/
    
    /* legge la matrice di adiacenza dei costi */
    void legge_matrice_costi(int costo[][N_SEDI])
    {
    	int i = 0,
    		j = 0,
    		n = N_SEDI;
    
    	FILE *file_costi;
    
    	file_costi = fopen("costi.txt", "r");
    
    	
    	if(file_costi == NULL)
    		printf("Impossibile aprire il file");
    	else
    	{
    		for (i = 0; i < n; i++)
    			for (j = 0; j < n; j++)
    				fscanf(file_costi, "%d", &costo[i][j]);
    	}
    
    	fclose(file_costi);
    
    }
    
    /* stampa a video i valori letti dai file */
    void stampa_matrice_letta(int costo[][N_SEDI])
    {   
    	int i,
    		j,
    		n = N_SEDI;
    
    	printf("    ");
    
    	for (i = 0; i < n; ++i)
    	{
    		for (j = 0; j < n; ++j)
    			printf("%d", costo[i][j]);
    		printf("\n");
    	}
    	printf("\n");
    }
    
    int main(void)
    {
    	int costo[N_SEDI][N_SEDI];
    
    	legge_matrice_costi(costo);
    
    	stampa_matrice_letta(costo);
    
    	return(0);
    }
  • Re: [c] Passaggio di array 2D a funzione

    Ok, è tutto chiaro.
    Quindi torno all'allocazione dinamica della memoria.

    Magari chiudiamo questo argomento e ne apro un altro
    sulla "segmentation faul"
    così posto le funzioni sviluppate per capire dov'è l'errore
    ok?
  • Re: [c] Passaggio di array 2D a funzione

    Comunque, ....
    per rispondere al tuo ultimo messaggio
    ho provato il codice che mi hai postato
    ma restituisce sempre gli indirizzi della memoria e non i valori letti!

    tnks
Devi accedere o registrarti per scrivere nel forum
10 risposte