Allora, si dovrebbero passare oggetti per indirizzo (puntatore) quando o il parametro e un puntatore stesso oppure se hai intenzione di modificare l'oggetto passato nella funzione. Passare &r e &c nel tuo main è corretto perchè dopo che avrai eseguito la leggi_file le variabile r e c (del main) avranno il valore voluto. Visto che **mat è definito nel mail ha senso che in quella funzione tu abbia oltre alla matrice anche la dimensione.
Non ha senso passarli alla mat_dim, perchè r e c non li vai a modificare e quindi puoi passarli tranquillamente per valore (anche se nessuno ti vieta di passarli per indirizzo)
Inoltre è inutile passare mat come parametro, visto che sarà il valore di ritorno delle funzioni. Quindi puoi fare una cosa del genere:
codice:
#include <stdio.h>
#include <stdlib.h>
// Ti crea la matrice e ti restituisce il puntatore
// Gli basta sapere la dimensione
int** mat_dim(int r, int c)
{
int i=0;
int** mat = (int**)malloc(sizeof(int*) * r);
while(i<r){
mat[i]=(int*)malloc(sizeof(int) * c);
i++;
}
return mat;
}
// Visto righe e colonne vengono assegnati qui, li vogliamo "far tornare indietro" (r e c) e quindi li prendiamo per indirizzo
int **leggi_file(int *r, int *c)
{
int i, j;
//legge righe e colonne
printf("Numero di righe:");
scanf("%d", &(*r));
printf("\nNumero di colonne:");
scanf("%d", &(*c));
// *r e *c puntano alle variabili del main!!!
// Quindi avranno il valore letto
// Chiamo la funzione che crea la matrice, passandogli la dimensione (valore di r e c)
// e assegnamo il valore di ritorno alla variabile mat
int** mat=mat_dim(*r,*c);
//leggi dati di mat da file ... io li metto a 2
for(i=0; i<*r;i++)
for(j=0; j<*c;j++)
mat[i][j] = 2;
// Restituiamo il puntatore
return mat;
}
// Funzione che ti stampa ma matrice
// Come vedi prende come parametro il puntatore e la dimensione
void print_m(int** mat, int r, int c){
for(int i=0; i<r;i++){
for(int j=0; j<c;j++)
printf("%d ", mat[i][j]);
printf("\n");
}
}
int main(void) {
int **mat;
int r=1;
int c=1;
mat=leggi_file(&r, &c);
// Alla fine della storia mat punterà alla zona allocata per la matrice ed r e c conterranno la dimensione
printf("dimensione matrice %d %d\n", r, c);
printf("Matrice\n");
print_m(mat, r, c);
return 0;
}