Newsgroup: it.comp.lang.c
Titolo: Ritorno di puntatore di array da funzione.

Ciao Ragazzi,
Ho un amnesia. Vorrei farmi ritornare da una funzione un array di puntatori
a struttura.
Come fare ?
P.S.: In particolare non sono sicuro del passaggio alla funzione del tipo
"PROVA ***"  ??!?!
Scusatemi era un po che non mi capitava.......
Es. :
typedef struct __PROVA{
    int x;
    int y;
    int z;
} PROVA;
......
static int getArray(PROVA ***prova);
......
int main (int argv, char *argv[])
{
    PROVA **prova;
    int           status;
    status = getArray(&prova);
}
/*************************************/
/*  getArray                                                       */
/*************************************/
static int getArray (PROVA ***prova)
{
    /*
    Alloca dinamicamente l'array di puntatori a PROVA e
    in un ciclo, pre tutti i puntatori a PROVA, alloca una struttura PROVA
    che riempirņ .....
    */
    return(0);
}

 typedef struct __PROVA{
Piccolo appunto stilistico: le struct possono essere anche anonime. In
questo caso, visto che la dichiarazione è dentro un tipedef, a che ti serve
il nome "__PROVA"? Non lo userai mai.
Una cosa del genere serve solo se uno dei campi della la struttura un
puntatore alla struttura stessa: in tal caso devi scrivere "struct __PROVA
*" perché il nome "PROVA", dentro la struttura, non è ancora definito.
--
Cingar
--------------------------------
Inviato via 
http://arianna.libero.it/usenet/

Ciao Cingar,
Credo che tu non abbia letto il messaggio, ho parlato di farmi ritornare un
array di
puntatori a struttura il quale ogni puntatore puntava a una struttura il
tutto allocato e
valorizzato nella funzione.
*************************************/
/*  getArray                                                       */
/*************************************/
static int getArray (PROVA ***prova)
{
    /*
    Alloca dinamicamente l'array di puntatori a PROVA e
    in un ciclo, per tutti i puntatori a PROVA, alloca una struttura PROVA
    che riempirò .....
    */
    return(0);
}
Secondo, perchè dichiarare una struttura anonima ? e se
(come credo) dovrò ampliarla e metterci un puntatore al prossimo
elemento ? ( PROVA è una lista). Il problema stilistico non c'entra, anzi
direi che stilisticamente è meglio metterlo il nome della struttura _PROVA,
non credi ?

In realtà quello che volevo fare è questo :
Quello che mi chiedevo è se era stilisticamente bello vedere PROVA *** nel
prototipo della funzione, tutto qui ! Lo so che si poteva anche dare al
prototipo
PROVA ** e fare il return dell' indirizzo ( come avevi detto tu ) ma devo
rispettare
le regole di scrittura di codice interne alla mia azienda !
Ti ringrazio comunque.
__________________________________________
typedef struct _PROVA{
 int x1;
 int x2;
}PROVA;
static int func1(PROVA ***prova);
int main(int argc, char *argv[])
{
 PROVA **prova;
 if(func1(&prova) <= 0)
  return(-1);
 printf("prova[0]->x1 = %d, \n prova[0]->x2 = %d \n", prova[0]->x1,
prova[0]->x2);
 printf("prova[1]->x1 = %d, \n prova[1]->x2 = %d \n", prova[1]->x1,
prova[1]->x1);
 printf("prova[2]->x1 = %d, \n prova[2]->x2 = %d \n", prova[2]->x1,
prova[2]->x2);
 return(0);
}
static int func1(PROVA ***prova)
{ 
 char  *func_name = "func1";
 PROVA **pProva;
 
 pProva = (PROVA **) calloc(3, sizeof(PROVA*));
 for(int i = 0; i < 3; i++)
 {
  pProva[i] = (PROVA *)calloc(1, sizeof(PROVA));
  pProva[i]->x1 = i;
  pProva[i]->x2 = i; 
 }
 *prova = &pProva[0];
 return(1);
}

 non credi ?
Personalmente, non credo. Se e quando dovrai ampliarla, la amplierai, senza
nel frattempo riempire il codice di roba inutile.
E, comunque, perché usare nomi diversi per la struct e per il typedef? (E tu
mi dirai, giustamente: e se poi devo portarlo in C++?)
Ma, ovviamente, siamo sempre nel campo dei gusti e, come dicevano gli
antichi, "De gustibus is megl che one".
