Intendi dire che la funzione Elabora_file1() dovrebbe restituire in qualche modo al main la matrice allocata dalla funzione Alloca_diz() ?
Se è così, non c'è nulla di difficile. Il tuo puntatore rimane un doppio puntatore all'interno del main e un triplo puntatore nella funzione Elabora_file1() (in rosso le modifiche):
codice:
int main ()
{
char** diz = NULL; int num;
num = Elabora_file1(&diz);
if (num == -1){
return 1;
}
...........
}
codice:
int Elabora_file1 (char*** diz)
{
FILE* pf1; int num, i=0;
pf1 = fopen(f1, "r");
if (pf1 == NULL){
printf ("Errore apertura del file!\n");
return -1;
} //Lettura del file
fscanf (pf1, "%d", &num);
*diz = Alloca_diz(num);
while (fscanf(pf1, "%s", (*diz)[i]) != EOF){
i++;
}
fclose(pf1);
return num;
}
Fai attenzione a un fatto nella funzione Alloca_diz(): allochi per il puntatore m un certo numero "num" di puntatori char, poi però dopo assumi che tale numero di puntatori sia pari (almeno) a 20, dato che il ciclo esegue staticamente 20 iterazioni. Tutto ciò funzionerà correttamente solo se num sarà effettivamente almeno 20. E anche se dai per scontato che quel "num" non sia mai meno di 20, irrobustisci il codice con un controllo o scrivendo "i < num" come predicato di uscita del for. Considerazioni analoghe valgono anche per il while nella funzione Elabora_file1().
Ricorda inoltre di deallocare la memoria con la free() una volta che la matrice non ti serve più.