Newsgroup: it.comp.lang.c
Titolo: puntatori a strutture

Salve a tutti per favore aiutatemi.
Sto cercando di capire le strutture e il modo migliore č quello di fare
qualche sercizio,solo che non riesco a capire dove sbaglio.
Vi spiego brevemente cosa voglio fare:
Ho un file cosě strutturato:
Alfredo Gimberti 500 200
Dino Iokoama 500 500
........................................
devo scrivere una funzione readp, che dati come parametri il nome di file e
un puntatore ad una struct tipo Contribuenti, mi retituisca un puntatore
alla struct Contribuenti,dove i dati del file sono stati salvati.
GRAZIE dell'aiuto
                     Ciao Pino
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct Contribuenti {
   char  lastnam[25];
   char  frstnam[25];
   char   tpag[30];
   char   tdov[25];
   int    r;
}Contribuenti;
int cont(char *filename,int max);
Contribuenti*  readp(char *filname,Contribuenti *nuova);
/*Secondo voi ha senso dare alla funz come parametro un puntatore struct
Contribuenti o questa puo' benissimo essere dichiarata all'interno della
funzione readp? */
int main(void)
{
   char *name="d:/contribuenti.lin"; file://Nome del file
   Contribuenti *dst;
   Contribuenti *cnbt;
   if((dst=readp(name,cnbt))==NULL)
     printf("Uguale a null\n");
   else if((dst->lastnam)!=NULL)
      printf("%s\n",dst->lastnam);
   else
     printf("ttttt\n");
   return 0;
}
Contribuenti*  readp(char *filname,Contribuenti *p)
{
   FILE *pf;
   char buffer[255];
   unsigned int num;
   int o,count,count2,c,ch;
   num=4;
   if((p=(Contribuenti*)calloc(num,sizeof(Contribuenti)))!=NULL);
   if((pf=fopen(filname,"r"))==NULL)
   {
     p->r=-1; file://Se non riesce ad aprire il file mi ritorna -1
     return p;
   }
   else
   {
     c=0;     /*Contatore campi*/
     count=0;/*la prossima posizione nel buffer*/
     o=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 */
            p++;           /*incrementa il puntatore in modo che punti al
secondo elemento della struct*/
     }
   }
   fclose(pf);
   return p;
}


Fammi capire, tu ti fai passare un puntatore a una struttura per che
cosa? Per fregartene altamente del valore che ha, allocare qualche
struttura nuova e poi ritornare un puntatore a una struttura che hai
allocato?
by LjL
ljl...@tiscalinet.it

 "Secondo elemento della struct"?
Qui devo essermi inpicciato, infatti quello che volevo fare era di
dichiarare un array di strutture tipo Contribuenti, in ognuna di queste
metterci lastanam,firstnam,tassepagate e tassedovute, incrementando il
puntatore passavo da un elemento all'altro ogni elemento era una struttura.
dico bene?


 restituire un void,altrimenti non posso farlo.
Cosa?? restituire printf()? Secondo me hai bisogno di rivedere un pň le basi
del linguaggio...
Dire "restituisca printf("errore\n")" equivale a non dire nulla.
Inoltre la frase č inserita in un contesto che definirei 'criptico'. Cerca
di spiegarti megio!
Concordo comunque che far tornare alla readp() un puntatore alla struttura č
ridondante e schifoso (soprattuto quel campo che riempi con l'errore
poi....).
A cosa ti serve (visto che un puntatore alla struttura lo hai nei parametri
passati)?
Ciao
 -----= Posted via Newsfeed.Com, Uncensored Usenet News =-----
http://www.newsfeed.com
 - The #1 Newsgroup Service in the World!
-----== 100,000 Groups! - 19 Servers! - Unlimited Download! =-----
 

 Ciao
Scusa mi sono spiegato male:
Inanzitutto questo e' un esercizio per capire le funzioni che restituiscono
strutture ci avevo pensato anch'io che se la struttura la passo come
parametro ottengo quello che voglio.
Ti spiego meglio: se io ho una funzione che mi restituisce un puntatore
diciamo anche che non restituisce un void,
e inutile scrivere una printf("errore\n") il programma non te la
visualizzera mai.
Ciao