Newsgroup: it.comp.lang.c
Titolo: problemi con funzione e struct

Ho un problema su un programma scritto in C: e' lo stesso codice che ho 
poi utilizzato per creare un oggetto in un programma in C++. Se salvo in 
programma con estensione cpp compilo senza problemi, se invece salvo con 
estensione c il compilatore mi restituisce un errore di sintassi nel 
prototipo della funzione (solo se tento il passaggio per riferimento, 
non con quello per valore). Forse non riconosce il tipo che definisco 
con la struct? Ho provato ad usare typedef, ma il risultato non cambia. 
Sto utilizzando l'ambiente DEV C++ Questo e' il codice:
#include<stdio.h>
#include<conio.h>
#include<string.h>
#include<stdlib.h>
#include<windows.h>
  typedef struct /*dichiaro una struttura FUORI dal main, perche' ho una 
funzione*/
  {           /*che deve prendere in ingresso un parametro di tipo 
struttura*/
   int giorno;
   int mese;
   int anno;
  }data; //dichiaro due variabili di tipo struttura//;
  data inizio,fine;
//prototipi funzioni//
  void carica_struttura(char a[],int dimensione,data &b); //passo la 
struttura per riferimento//
  int giorni_residui(int mese_partenza,int giorno_mese); //mi calcola i 
giorni che mancano alla fine del mese di partenza//
  int giorni_totali(int residui);
  int bisestile(int anno);
  //variabili globali//
  /*dichiaro queste variabili fuori dal main, perch� devono essere 
utilizzate da pi� strutture//
  /*utilizzo due array che contengono il numero di giorni di ogni mese*/
   /*uno per l'anno di 365 giorni, e uno per il bisestile*/
  int mesi[12]={31,28,31,30,31,30,31,31,30,31,30,31};
  int mesi_annobis[12]={31,29,31,30,31,30,31,31,30,31,30,31};
  int bis=0;
main()
{
  char partenza[11]; //dichiaro due stringhe//
  char arrivo[11];
  int giorni_res=0;  //variabili per contenere ritorno funzioni//
  int giorni_tot=0;
  //acquisizione dati//
  printf("\n\nquesto programma calcola il numero di giorni trascorsi tra 
due date");
  printf("\n\nil risultato e' corretto solo se l'anno e' lo stesso");
  printf("\n\ninserisci data iniziale (formato GG/MM/AAAA): ");
  gets(partenza);
  printf("\n\ninserisci data finale (formato GG/MM/AAAA): ");
  gets(arrivo);
  //lettura date//
  system("cls");
  printf("\n\nle date che hai inserito sono:");
  printf("\n\n");
  puts(partenza);
  printf("\n\n");
  puts(arrivo);
  //chiamate funzioni//
  //con queste chiamate passo le date dalle stringhe alle strutture//
  carica_struttura(partenza,11,inizio);
  carica_struttura(arrivo,11,fine);
  bis=bisestile(inizio.anno);
  giorni_res=giorni_residui(inizio.mese,inizio.giorno);
  giorni_tot=giorni_totali(giorni_res);
  giorni_tot=giorni_tot+fine.giorno;
  printf("\n\n");
  printf("tra le due date sono trascorsi %d giorni",giorni_tot);
  getchar();
} //chiusura main//
   //definizione funzioni//
void carica_struttura(char a[],int dimensione,data &b)
{
  //stringhe per separare data//
  char day[3];
  char month[3];
  char year[5];
  int i=0; //indice stringa data//
  int j=0; //indice stringhe separate//
  /*con tre cicli for separo la stringa iniziale in tre parti*/
  for(i=0;i<2;i++)
  {
   day[j]=a[i];
   j++;
  }
  day[j]='\0';
  j=0;
  for(i=3;i<5;i++)
  {
   month[j]=a[i];
   j++;
  }
  month[j]='\0';
  j=0;
  for(i=6;i<11;i++)
  {
    year[j]=a[i];
    j++;
  }
  year[j]='\0';
   /*converto le tre stringhe in numeri*/
  /* e assegno valori stringhe convertite a campi struttura*/
  b.giorno=atoi(day);
  b.mese=atoi(month);
  b.anno=atoi(year);
  return;
};  //chiusura funzione carica strutture//
int giorni_residui(int mese_partenza,int giorno_mese)
{
  int residui;
  if(inizio.mese>=2)
  {
   if(bis==0)
   {
    residui=(mesi[mese_partenza-1]-giorno_mese);
   }
   else
   {
    residui=(mesi_annobis[mese_partenza-1]-giorno_mese);
   }
  }
  else
  {
   residui=(mesi[mese_partenza-1]-giorno_mese);
  }
  return residui;
}; //chiusura funzione giorni residui//
int bisestile(int anno)
{
  if((anno%4==0)&&(anno%100!=0)||(anno%400==0))
  {return 1;}
  else
  {return 0;}
}; //chiusura funzione anno bisestile//
int giorni_totali(int residui)
{
  int i=0;
  int giorni=0;
  if(inizio.mese>=2)
  {
   if(bis==0)
   {
    for(i=inizio.mese;i<fine.mese-1;i++)
    {
    giorni=giorni+mesi[i];
    }
   }
   else
   {
    for(i=inizio.mese;i<fine.mese-1;i++)
    {
    giorni=giorni+mesi_annobis[i];
    }
   }
  }
  else
  {
   for(i=inizio.mese;i<fine.mese-1;i++)
    {
    giorni=giorni+mesi[i];
    }
  }
  giorni=giorni+residui;
  return giorni;
}; //chiusura funzione giorni totali//
e questi i messaggi di errore:
25 date e giorni.c syntax error before '&' token
84 date e giorni.c syntax error before '&' token
date e giorni.c In function `carica_struttura':
99 date e giorni.c `a' undeclared (first use in this function)
Each undeclared identifier is reported only once  for each function it 
appears in
125 date e giorni.c `b' undeclared (first use in this function)
Inoltre il programma (quello con estensione cpp) funziona correttamente 
su windows, mentre su Linux mi restituisce dei valori totalmente 
sballati. Da cosa puo' dipendere?!!
Ringrazio in anticipo chiunque possa aiutarmi.

 non con quello per valore). 
In C non esistono i riferimenti. Non ho neanche guardato il codice, ma 
forse dovresti utilizzare un puntatore. Ma perché non puoi compilarlo 
con il C++?
E.

?manu* ha scritto:

Posso compilare in C++, va vorrei capire com'è la sintassi corretta del 
C. Forse a scuola stiamo facendo un po' di confusione tra sintassi di C 
e C++. I puntatori li abbiamo solo accennati: cercherò di capire come 
fare per passare la struttura con un puntatore.

 e C++. 
Certo il C++ non è il linguaggio che sceglierei di insegnare in una 
scuola... bisogna dedicarci molto tempo per imparare ad usare 
correttamente questo linguaggio.
E.


Io prenderei a schiaffi il professore: come si fa ad insegnare C e C++
insieme?
Ciao Jack

 sballati. Da cosa puo' dipendere?!!
non saprei, ma io andrei a vedere le funzioni per manipolare le
stringhe che ci sono in C (strlen,strcat,strcpy,strchr,strtok, ecc.)
Ciao Jack