Newsgroup: it.comp.programmare.win32
Titolo: Programma in C

Ciao a tutti,sono Sabrina.Ho dei problemi con questo programma in fase di
compilazione, perché compaiono diversi messaggi di errore. Qualcuno che se
ne intende un pň piů di me (basta proprio poco!), mi puň aiutare a capire
come deve essere modificato per funzionare?
Il programma é il seguente:
 #include <stdio.h>
 #include <string.h>
 #define ARCHIVIO 30
 #define MENU 0
 #define INS 1
 #define CAN 2
 #define RIC 3
 #define OUT 100
 #define DIM 31
 /* struttura che caratterizza una persona */
 struct per {
  char cognome[DIM];
  char nome[DIM];
  char ind[DIM];
  char tel[DIM];
 };
 /*numero elementi allocati
  nel vettore archiv */
 int index = 0 ;
 /*vettore persone*/
 struct archiv[ARCHIVIO];
  int men_per(void);
  int ins_per(void);
  void can_per(void);
  void ric_per(void);
  void main()
 {
 int scelta = MENU;
 /*presentazione del menu e avvio
  della corrispondente funzione*/
  while(scelta!=OUT) {
   switch(scelta) {
    case MENU:
     scelta = men_per();
     if(scelta ==MENU)
        scelta = OUT;
     break;
    case INS:
     index = ins_per(index);
     scelta = MENU;
     break;
    case CAN:
      can_per();
      scelta = MENU;
      break;
    case RIC:
      ric_per();
      scelta = MENU;
      break;
   }
  }
  }
  /*visualizza il menu di scelta
   e controlla la scelta effettuata*/
  int men_per(void)
  {
  int scelta;
  char invio;
  int true = 1;
  while(true) {
  printf("\t\t\t ARCHIVIO");
  printf("\n\n\n\t\t\t 1. Immissione Persona");
  printf("\n\n\t\t\t 2. Cancellazione Persona");
  printf("\n\n\t\t\t 3. Ricerca Persona");
  printf("\n\n\t\t\t 0. Fine");
   printf("\n\n\n\t\t\t\t Scegliere una
   opzione:");
   scanf("%d", &scelta);
   scanf("%c", &invio);
  printf("\n\n\n\n\n");
   switch(scelta) {
     case 0:
     case 1:
     case 2:
     case 3:
   return(scelta);
     default:
       break;
   }
  }
  return(0);
  }
  /* inserisce una persona nell'archivio */
  int ins_per(int pos)
  {
  char invio;
  if(pos>=ARCHIVIO) {
    printf("Non si possono inserire altri
    nomi");
    scanf("%c", &invio);
    return(pos);
  }
  printf("\n\t\tINSERIMENTO PERSONA");
  printf("\n\t\t__________\n\n");
  printf("\nCognome : ");
  gets(archiv[pos].cognome);
  printf("\nNome : ");
  gets(archiv[pos].nome);
  printf("\nIndirizzo : ");
  gets(archiv[pos].ind);
  printf("\nTelefono : ");
  gets(archiv[pos].tel);
  scanf("%c",&invio);
  pos++ ;
  return(pos);
  }
  /*ricerca una persona che abbia un
  determinato cognome e nome*/
  struct per *cer_per(char *cg, char *nm)
  {
  int i;
  for(i=0; i<=index; i++) {
    if(strcmp(cg.archiv[i].cognome) == 0)
    if(strcmp(nm.archiv[i].nome) ==0)
      return(&archiv[i]);
  }
  return(NULL);
  /*visualizza i dati di una persona*/
  void vis_per(struct per *p)
  {
  char pausa;
  printf("\n\n____________\n");
  printf("\n\t\tCognome : %s", p->cognome);
  printf("\n\t\tNome : %s", p->nome);
  printf("\n\t\tIndirizzo : $s", p->ind);
  printf("\n\t\tTelefono : $s", p->tel);
  printf("\n\n_________________\n");
  scanf("%c", &pausa);
  }
  /*effettua la ricerca di una persona
  nell'archivio*/
  void ric_per(void)
  {
  char pausa;
  char cognome[DIM], nome[DIM];
  struct per *ps;
  /*inserimento dati persona da ricercare*/
  printf("\n\t\tRICERCA PERSONA");
  printf("\n\t\t_______\n\n");
  printf("\nCognome : ");
  gets(cognome);
  printf("\nNome : ");
  gets(nome);
  scanf("%c", &pausa);
  ps = cer_per(cognome, nome);
  if(ps ==NULL) {
    printf("\nPersona non presente in archivio");
    scanf("%c", &pausa);
    return;
  }
  vis_per(ps);
  }
  /*elimina i dati di una persona dall'archivio*/
  void eli_per(struct per *p)
  {
  strcpy(p->cognome, " ");
  strcpy(p->nome, " ");
  strcpy(p->ind, " ");
  strcpy(p->tel, " ");
  }
  /*cancella una persona dall' archivio*/
  void can_per(void)
  {
  char pausa;
  char cognome[DIM], nome[DIM];
  struct per *ps;
  printf("\n\t\tCANCELLA SPAZIO PERSONA");
  printf("\n\t\t________\n\n");
  printf("\nCognome : ");
  gets(cognome);
  printf("\nNome : ");
  gets(nome);
  scanf("%c", &pausa);
  ps = cer_per(cognome, nome);
  if(ps == NULL) {
    printf("\nPersona non presente in archivio");
    scanf("%c", &pausa);
    return;
  }
  vis_per(ps);
  printf("\nConfermi cancellazione ? (S\N)");
  scanf("%c", &pausa);
  if(pausa=='S' ł ł pausa=='s') {
    eli_per(ps);
  return;
  }
  }
...mentre  i messaggi di errore sono:--------------------Configuration:
Archivio - Win32 Debug--------------------
Compiling...
Archivio.c
C:\Programmi\DevStudio\MyProjects\Debug\Archivio.c(25) : error C2059: syntax
error : '['
C:\Programmi\DevStudio\MyProjects\Debug\Archivio.c(47) : warning C4087:
'ins_per' : declared with 'void' parameter list
C:\Programmi\DevStudio\MyProjects\Debug\Archivio.c(78) : error C2001:
newline in constant
C:\Programmi\DevStudio\MyProjects\Debug\Archivio.c(79) : error C2146: syntax
error : missing ')' before identifier 'opzione'
C:\Programmi\DevStudio\MyProjects\Debug\Archivio.c(79) : error C2001:
newline in constant
C:\Programmi\DevStudio\MyProjects\Debug\Archivio.c(100) : warning C4027:
function declared without formal parameter list
C:\Programmi\DevStudio\MyProjects\Debug\Archivio.c(104) : error C2001:
newline in constant
C:\Programmi\DevStudio\MyProjects\Debug\Archivio.c(105) : error C2146:
syntax error : missing ')' before identifier 'nomi'
C:\Programmi\DevStudio\MyProjects\Debug\Archivio.c(105) : error C2001:
newline in constant
C:\Programmi\DevStudio\MyProjects\Debug\Archivio.c(113) : error C2065:
'archiv' : undeclared identifier
C:\Programmi\DevStudio\MyProjects\Debug\Archivio.c(113) : error C2109:
subscript requires array or pointer type
C:\Programmi\DevStudio\MyProjects\Debug\Archivio.c(113) : error C2224: left
of '.cognome' must have struct/union type
C:\Programmi\DevStudio\MyProjects\Debug\Archivio.c(113) : error C2198:
'gets' : too few actual parameters
C:\Programmi\DevStudio\MyProjects\Debug\Archivio.c(115) : error C2109:
subscript requires array or pointer type
C:\Programmi\DevStudio\MyProjects\Debug\Archivio.c(115) : error C2224: left
of '.nome' must have struct/union type
C:\Programmi\DevStudio\MyProjects\Debug\Archivio.c(115) : error C2198:
'gets' : too few actual parameters
C:\Programmi\DevStudio\MyProjects\Debug\Archivio.c(117) : error C2109:
subscript requires array or pointer type
C:\Programmi\DevStudio\MyProjects\Debug\Archivio.c(117) : error C2224: left
of '.ind' must have struct/union type
C:\Programmi\DevStudio\MyProjects\Debug\Archivio.c(117) : error C2198:
'gets' : too few actual parameters
C:\Programmi\DevStudio\MyProjects\Debug\Archivio.c(119) : error C2109:
subscript requires array or pointer type
C:\Programmi\DevStudio\MyProjects\Debug\Archivio.c(119) : error C2224: left
of '.tel' must have struct/union type
C:\Programmi\DevStudio\MyProjects\Debug\Archivio.c(119) : error C2198:
'gets' : too few actual parameters
C:\Programmi\DevStudio\MyProjects\Debug\Archivio.c(133) : error C2224: left
of '.archiv' must have struct/union type
C:\Programmi\DevStudio\MyProjects\Debug\Archivio.c(133) : error C2198:
'strcmp' : too few actual parameters
C:\Programmi\DevStudio\MyProjects\Debug\Archivio.c(134) : error C2224: left
of '.archiv' must have struct/union type
C:\Programmi\DevStudio\MyProjects\Debug\Archivio.c(134) : error C2198:
'strcmp' : too few actual parameters
C:\Programmi\DevStudio\MyProjects\Debug\Archivio.c(135) : error C2109:
subscript requires array or pointer type
C:\Programmi\DevStudio\MyProjects\Debug\Archivio.c(135) : error C2102: '&'
requires l-value
C:\Programmi\DevStudio\MyProjects\Debug\Archivio.c(135) : warning C4033:
'cer_per' must return a value
C:\Programmi\DevStudio\MyProjects\Debug\Archivio.c(141) : error C2143:
syntax error : missing ';' before 'type'
C:\Programmi\DevStudio\MyProjects\Debug\Archivio.c(146) : error C2065: 'p' :
undeclared identifier
C:\Programmi\DevStudio\MyProjects\Debug\Archivio.c(146) : error C2223: left
of '->cognome' must point to struct/union
C:\Programmi\DevStudio\MyProjects\Debug\Archivio.c(147) : error C2223: left
of '->nome' must point to struct/union
C:\Programmi\DevStudio\MyProjects\Debug\Archivio.c(148) : error C2223: left
of '->ind' must point to struct/union
C:\Programmi\DevStudio\MyProjects\Debug\Archivio.c(149) : error C2223: left
of '->tel' must point to struct/union
C:\Programmi\DevStudio\MyProjects\Debug\Archivio.c(152) : error C2065:
'pausa' : undeclared identifier
C:\Programmi\DevStudio\MyProjects\Debug\Archivio.c(181) : warning C4013:
'vis_per' undefined; assuming extern returning int
C:\Programmi\DevStudio\MyProjects\Debug\Archivio.c(220) : warning C4129: 'N'
: unrecognized character escape sequence
C:\Programmi\DevStudio\MyProjects\Debug\Archivio.c(222) : error C2018:
unknown character '0xb3'
C:\Programmi\DevStudio\MyProjects\Debug\Archivio.c(222) : error C2018:
unknown character '0xb3'
C:\Programmi\DevStudio\MyProjects\Debug\Archivio.c(222) : error C2146:
syntax error : missing ')' before identifier 'pausa'
C:\Programmi\DevStudio\MyProjects\Debug\Archivio.c(222) : error C2059:
syntax error : ')'
C:\Programmi\DevStudio\MyProjects\Debug\Archivio.c(222) : error C2143:
syntax error : missing ';' before '{'
Error executing cl.exe.
Archivio.obj - 38 error(s), 5 warning(s)
Spero vivamente che qualcuno abbia avuto la pazienza di arrivare fino a
qui!!!Grazie a tutti quelli che mi vorranno aiutare. Ciao.

Ciao
Posso aiutarti a correggere gli errori solo se non e' urgentissima la
soluzione.
Domani stampero' l'intero listato e comincero' a vederlo.
Considera che sono uno studente di ing.elettronica e purtroppo non ho molto
tempo libero,ma non ci sono problemi.
Forse mi occorreranno ulteriori informazioni circa le specifiche del tuo
programmino che non e' poi cosi "ino" come lo definisci.
Prima informazione : su quale compilatore lo hai scritto ?  Mi sembra
Microsoft Visual C++.
Io uso questo,sarebbe bene,penso,lavorare sullo stesso.
Potresti indicarmelo?
Paolo

Nella tua casella di email troverai il programma funzionante ;-)
Ciao e buon lavoro,
Emanuele.

Ciao a tutti sono all'inizio come faccio ad in parare a programmare.
Grazie in antici po



 Il programma é il seguente:
..cut...
Ho commentato le modifiche che ho apportato al tuo codice con:
	//§§ commento .....
quindi non dovresti avere problemi a riconoscerle.
Ecco il risultato:
#include <stdio.h>
#include <string.h>
#define ARCHIVIO 30
#define MENU 0
#define INS 1
#define CAN 2
#define RIC 3
#define OUT 100
#define DIM 31
/* struttura che caratterizza una persona */
struct per {
  char cognome[DIM];
  char nome[DIM];
  char ind[DIM];
  char tel[DIM];
} per;
// §§ Avevi dimenticato di dare un nome alla struct .... dovevi
// mettere 'per' anche nella riga qui sopra.
/*
  numero elementi allocati nel vettore archiv
*/
// §§ La Variabile index e' gia dichiarata in string.h .... mi sono
// limitato a cambiarle nome.
int iIndex = 0 ;
/*vettore persone*/
// §§ Qui ti sei dimenticata di mettere di che Tipo e' il Vettore
// 'archiv' e, precisamente, 'per' (hai definito la struct poco
// sopra).
struct per archiv[ARCHIVIO];
int men_per(void);
// §§ Qui avevi dichiarato la Funzione 'int ins_per(int)' come 'int
// ins_per(void)' .... e' normale che il compilatore faccia storie ;-)
int ins_per(int);
void can_per(void);
void ric_per(void);
void main() {
  int scelta = MENU;
 
  /*
    presentazione del menu e avvio della corrispondente funzione
  */
 
  while(scelta!=OUT) {
    switch(scelta) {
    case MENU:
      scelta = men_per();
      if(scelta ==MENU)
        scelta = OUT;
      break;
    case INS:
      iIndex = ins_per(iIndex);
      scelta = MENU;
      break;
    case CAN:
      can_per();
      scelta = MENU;
      break;
    case RIC:
      ric_per();
      scelta = MENU;
      break;
    }
  }
}
/*
  visualizza il menu di scelta e controlla la scelta effettuata
 
*/
int men_per(void) {
  // §§ Ho dovuto cambiare il Nome della variabile 'true' in 'fTrue'
  // perche' mi dava errore ..... evidentemente dava fastidio a
  // qualcuno :-(
  int fTrue = 1;
  int scelta;
  char invio;
 
  while(fTrue) {    


/*

*/

  for(i=0; i<=iIndex; i++) {
    // §§ Qui avevi messo 'cg.archiv[...' anziche' 'cg, archiv[....' .
    if(strcmp(cg, archiv[i].cognome) == 0)
      // §§ Qui, IDEM come la riga sopra.
      if(strcmp(nm, archiv[i].nome) ==0)
	return(&archiv[i]);
  }
  return(NULL);
  // §§ Qui non avevi Chiuso con la Parentesi Graffa; ti consiglio di
  // Formattare meglio il codice, anzi, con un Editor come xEmacs e'
  // una farsa farlo .... provare per credere ;-)
}
 
/* visualizza i dati di una persona */



/* elimina i dati di una persona dall'archivio */
void eli_per(struct per *p) {
  strcpy(p->cognome, " ");
  strcpy(p->nome, " ");
  strcpy(p->ind, " ");
  strcpy(p->tel, " ");
}
/* cancella una persona dall' archivio */
void can_per(void) {
  char pausa;
  char cognome[DIM], nome[DIM];
  struct per *ps;
 
  printf("\n\t\tCANCELLA SPAZIO PERSONA");
  printf("\n\t\t________\n\n");
  printf("\nCognome : ");
  gets(cognome);
  printf("\nNome : ");
  gets(nome);
  scanf("%c", &pausa);
 
  ps = cer_per(cognome, nome);
 
  if(ps == NULL) {
    printf("\nPersona non presente in archivio");
    scanf("%c", &pausa);
    return;
  }
 
  vis_per(ps);
 
  // §§ Ho modificato la riga qui' sotto perche' altrimenti il
  // compilatore credeva che \N fosse una qualche sorta di
  // Terminatore .... giustamente.
  printf("\nConfermi cancellazione ? (S\\N)");
  scanf("%c", &pausa);
  // §§ Qui sotto, per qualche strano motivo, c'erano al posto di '||'
  // dei strani caratteri.
  if(pausa=='S' || pausa=='s') {
    eli_per(ps);
    return;
  }
}
Ho compilato il tutto sotto Linux con il compilatore egcs, il quale, mi
ha sparato uno pseudo-warning:
[uda@udasoftware temp]$ g++ -s -o database database.cxx 
/tmp/cca159861.o: In function `ins_per(int)':
/tmp/cca159861.o(.text+0x1e4): the `gets' function is dangerous and
should not be used.
ed infatti, testandolo, qualche problema nel funzionamento, l'ho trovato
....
****
Infine, ti informo che it.comp.programmare.win32 non credo sia il
newsgroup piu' indicato per queste problematiche; meglio it.comp.lang.c

come deve essere modificato per funzionare?
Monotoni i temi d'esame di Fondamenti di Informatica, vero ?

Domani stampero' l'intero listato e comincero' a vederlo.
[snip]
Diamine, quasi quasi comincio a firmare i miei messaggi con un nome
femminile!