Newsgroup: it.comp.lang.c
Titolo: stuct che restituiscono funz

Salve.
Sto cercando di imparare a programmare in c e ho comprato il libri Brian W.
Kernighan e quello dell'apogeo programmare in c.Su questo news avevo trovato
un esercizio da fare e mi serviva capire bene come va definita una funzione
che accetta come parametro un array di struct e come puo' restutuire sempre
un array di struct.
lo so che la cosa e' fattibile anche con i puntatori pero' mi serve farlo
con entrambe i metodi.
Riporto un pezzeo del testo dell'esercizio e il codice che ho scritto.
Siccome non ho avuto tempo di commentare il codice, mi serve sapere solo
dove sbaglio nella definizione della funz che mi restituisce l'array di
struct.
Devo dire che sui libri che ho ho trovato poco al riguardo.
"Un file di testo contiene per ciascuna riga i dati Cognome, Nome,
TasseDovute e TassePagate relativi ad una serie di persone. I dati sulle
righe sono separati da uno o più spazi, il numero delle righe del file non è
noto a priori.
Ad esempio:
Rossi Mario 1200 1200
Sharansky Vladimir 5400 3000
Peterson Kelly 9600 0
El Harad Mouchine 2200 2200
Verdi Gianni 5400 3000
Dopo aver definito tramite typedef una opportuna struct Contribuente (e gli
altri tipi che si riterranno necessari) destinata a contenere i dati di un
individuo:
Si scriva una funzione Leggi che dato come parametro il nome di un file ed
un array di elementi di tipo Contribuente, inizializza l'array con i dati
letti dal file strutturato come nella descrizione iniziale.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include<conio.h>
typedef struct {
   char  *lastnam;
   char  *frstnam;
   int    tpag[1];
   int    tdov[1];
}Contribuenti;
Contribuenti cntb readp(char *filname,Contribuenti cntb *);
int main(void)
{
   char *name="d:/pippo.lin"; file://Nome del file
   int r;
   Contribuenti dst[10]; file://dichiaro array di struct che mi restituira
la funz
   Contribuenti src[10]; file://dichiaro array di struct da passare alla
funz
   dst= readp(name,src[10]);
   if(dst.tpag[0]==0)
    printf("Errore nell'apertura del file\n");
   getch();
   return 0;
}
Contribuenti cntb[] readp(char *filname,Contribuenti cntb[])
{
   File pf;
   char *buffer;
   int r,count1,count2,c;
   if((pf=fopen(filname,"r"))==NULL)
   {
     cntb.tpag[0]=0;
     return cntb.tpag[0];
   }
   else
   {
     count=0;count2=0;c=0;r=0;
     while((cr=getch(pf))!=EOF)
     {
        if(cr!='\n')
          else if(ch!='\b')
          else if(ch=='\b')
          {
             buffer[count+1]='\0';
             c+=1;
             switch(c)
             {
                case 1:
                  strcpy(buffer,cntb[r].lstnam[c]);
                  break;
                case 2:
                  strcpy(buffer,cntb[r].frstnam[c]);
                  break;
                case 3:
                  strcpy(buffer,cntb[r].tpg[c]);
                  break;
                case 4:
                  strcpy(buffer,cntb[r].tdv[c]);
                  break;
                default:
                  break;
             }
          }
          else if(ch=='\n')
            r+=1;
          else
          {
            buffer[count]=ch;
            count++;
          }
     }
   return cntb;
   fclose(pf);
   }
}
grazie 1000
Ciao

 Contribuenti cntb[] readp(char *filname,Contribuenti cntb[])
Mmh... come gia` detto, non lo puoi fare; tra l'altro, la dichiarazione sarebbe sbagliata comunque.
Riguardati il cap.5 del K&R.
Non ho guardato il resto, perche` penso che gli errori che ti ho indicato compromettano piu` o meno
anche il resto.
Ciao,
Cecco

Ciao
Scusatemi, ma mi serve una mano sto cercando di risolvere questo esercizio
trovato su questo news adesso non so piu' andare avanti.Il tipo di struct
dichiarato contiene all'interno degli array,potevo usare i puntatori, ma ho
deciso cosi altrimenti dovevo allocare la memoria dinamicamenti con
malloc.Quando funzionerą cosģ, lo faro'.Se compilo il sorgente mi da in
tutto il sorgente questo error:
E2288 Pointer to structure required on left side of -> or ->*
Ho provato ad accedere agli elementi della struct anche con gli indici
dell'array cioč in questo modo:
dst[0]->r
l'errore scompare ma quando eseguo mi da un acces violation.
Sul W.kernighan ho letto che per accedere agli elementi una struct tramite
un puntatore si puo' usare ->. Sotto riporto il codice.
grazie per l'aiuto.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include<conio.h>
typedef struct {
   char  lastnam[25];
   char  frstnam[25];
   char  tpag[25];
   char  tdov[25];
   int    r;
}Contribuenti[10];
Contribuenti  *readp(char *filname,Contribuenti cnbt[]);
int main(void)
{
   char *name="d:/contribuenti.lin";
   int r;
   Contribuenti *dst;
   Contribuenti cnbt[10];
   if((dst=readp(name,cnbt))==NULL)
     printf("Uguale a null\n");
   else if((dst[0]->lastnam)!=NULL)
     printf("Diverso da null%d\n",dst->r);
   else
     printf("ttttt\n");
   getch();
   return 0;
}
Contribuenti  *readp(char *filname,Contribuenti cnbt[])
{
   FILE *pf;
   char buffer[255];
   int r,count,count2,c,ch;
   Contribuenti *p;
   p=cnbt;
   if((pf=fopen(filname,"r"))==NULL)
   {
     p->r=0;
     return p;
   }
   else
   {
     c=0;     /*Contatore campi*/
     count=0;/*la prossima posizione nel buffer*/
     r=0;   /*Contatore di record*/
     while((ch=getc(pf))!=EOF) /*legge un char finche' non trova il char di
fine file*/
     {
        if((ch!='\n')&&(ch!='\b'))/*se IL char letto e diverso da spazio e
fine riga*/
        {
          buffer[count]=ch;/*lo memorizza nel buffer*/
          count++;         /*incrementa di uno il baffer*/
        }
        else if(ch=='\b')  /*se incontra il char di spazio*/
        {
          buffer[count++]='\0';/*aggiunge in il char terminatore di fine
stringa*/
          c++;                /*Incrementa  il contatore di campi*/
             switch(c)
             {
                case 1:
                  strcpy(p->lastnam,buffer);/*Copia il buffer nel primo
record della struct*/
                  break;
                case 2:
                  strcpy(p->frstnam,buffer);/*Copia il buffer nel secondo
record struct*/
                  break;
                case 3:
                  strcpy(p->tpag,buffer);  /*e cosi via imcampi sono
quattro*/
                  break;
                case 4:
                  strcpy(p->tdov,buffer);
                  break;
                default:
                  break;
             }
        }
          else if(ch=='\n')/*se trova il char di fine riga */
            r++;           /*incrementa il puntatore in modo che punti al
secondo elemento della struct*/
     }
   }
   fclose(pf);
   return p;
}
Ciao

 }Contribuenti[10];
Qui` devi stare attento. In questo modo, se dichiari un oggetto 
Contribuenti, questo diventa automaticamente un array di oggetti di quella 
struttura (che sostanzialmente resta senza nome). Meglio dichiarare cosi`: 
typedef struct {...} Contribuenti;
Gli errori che hai dopo sono derivati da questo. In pratica, con il tuo 
typedef, se dichiari:
Contribuenti cnbt;
a questo punto queste operazioni sono consentite:
strcpy(cnbt[0].lastnam, "qualunque cosa"); /* cnbt[0] e` il primo elemento 
di un array */
strcpy(cnbt->lastnam, "qualunque cosa"); /* cnbt decade al puntatore al 
primo elemento di un array */
Spero di essere stato chiaro. Ciao,
Cecco

Sei stato chiarissimo ti ringrazio molto.
Non sapevo come andare avanti.
Ciao Roberto