PDA

View Full Version : [C]Allocazione matrice passata in una funzione


Jack-Carter
26-06-2008, 16:20
Salve a tutti, ho un problema con l'allocazione dinamica di una matrice:
#include <stdio.h>
#include <stdlib.h>

int readf(char **m);
int r, c;

int main()
{
char **s;
int i, j;

readf(s);
for(i=0;i<r;i++)
{
for(j=0;j<c;j++)
{
printf("%c", s[i][j]);
}
printf("\n");
}
return 0;
}
questo è il mio main, ho dichiarato s come puntatore a puntatore a char, e nella funzione readf leggo da un file una griglia. Il problema è che quando esco dalla funzione, il pezzo di codice nel main che prova a leggere s, da un errore della memoria. Ecco la funzione:
int readf(char **m)
{
FILE *input;
char ch;
int i, j, k;

input=fopen("campo.txt", "r");
fscanf(input, "%d %d", &r, &c);

m=malloc(r*sizeof(char*));
for(i=0;i<r;i++)
{
m[i]=malloc(c*sizeof(char));
for(j=0;j<c;j++)
{
fscanf(input, "%c", &m[i][j]);
printf("%c", m[i][j]);
}
fscanf(input, "%c", &ch);
printf("%c", ch);
}

return 0;

}
Ho provato a mettere degli asterischi davanti a m nell'allocazione, ma ha solo peggiorato le cose.
Mi potreste dire dove sbaglio? Grazie.

Abadir_82
26-06-2008, 18:26
Tempo fa ebbi lo stesso problema e l'ho risolto così:

Nel main dichiaravo questa matrice:

long double **big_data_matrix;

Nel main chiamavo la funzione in questo modo:

read_informations(directory, &big_data_matrix, &informations_vector, &complementary_info);

[nell'header la funzione read_informations era dichiarata come:]

void read_informations(char *directory, long double ***big_data_matrix, int **informations_vector, long double **complementary_info);


E dentro la funzione read_informations facevo:

long double **big_data_matrixs;
big_data_matrixs=new long double*[rows];
for(i=0; i<rows; i++)
{
big_data_matrixs[i]=new long double[columns];
}

lavoravo sulla matrice e poi, prima della parentesi che chiude la read_informations:

*big_data_matrix=big_data_matrixs;


A me così funzionava e funziona. Allo stesso modo si effettua la delete per rimuovere la matrice dalla memoria.

Jack-Carter
26-06-2008, 18:52
Grazie, avrei più che altro voluto capire come allocare direttamente la matrice del main invece che allocarne una temporanea e poi far puntare quella del main a quella "temporanea", ma almeno adesso funziona! Grazie ancora.

Abadir_82
26-06-2008, 21:29
Quando scrissi quel programma mi veniva comodo allocare e deallocare le matrici dentro le varie funzioni solo quando necessario, in modo da minimizzare il consumo di memoria. Onestamente non pensai neanche al caso da te indicato, cmq credo che sia fattibile. Non sono così esperto da dirti esattamente come, però con i puntatori ed i passaggi per reference secondo me si può fare.

Felice di esserti stato utile :D