Newsgroup: it.comp.lang.c
Titolo: casting.

Scusate.
Ho questo codice:
enum mesi {
gennaio = 1,
febbraio = 2,
ecc.
}
char NomeFile[14];
char NomeMese[14];
int NumMese = 0;
memset(NomeMese, ' ', 14);
memcpy(NomeMese, NomeFile, strlen(NomeFile) - 5);
NumMese = NomeMese;
NomeMese dovrebbe contenere di volta in volta "gennaio",
"febbraio", e cosi' via, di conseguenza dovrei trovarmi in 
NumMese i valori 1, 2, ecc.
Il problema e' che in compilazione mi da "assignment makes 
integer without a cast".
Se provo NumMese = atoi(NomeMese) non mi ritorna il valore
corretto.
Cosa manca?
Grazie.


ICQ #34602650

corretto.
Ovvio! atoi() si aspetta che in NomeMese ci sia un literal formato da
caratteri numerici cioe' [0-9] per restituire un valore significativo.
Secondo me dovresti leggere un buon manuale sul C per capire bene come
si usano gli array di caratteri, gli interi e le enumerazioni.
Andrea Laforgia

risolvere a monte.
Acc.!
Beh, molto semplicemente io ho un file che si chiama ad es.
Marzo.1999. Da questo estraggo il nome del mese nel seguente
modo:"memcpy(NomeMese, NomeFile, strlen(NomeFile) - 5)",
mi rimane quindi Marzo nella variabile NomeMese.
A questo punto, sulla base del contenuto di NomeMese devo 
poter ottenere dei valori numerici in corrispondenza
del diverso contenuto di NomeMese che puo' essere
Gennaio, quindi dovrei avere 1, Febbraio, quindi dovrei avere 2,
e cosi' via.
Grazie.

 e cosi' via.
Se hai il nome del mese, puoi utilizzare stricmp per confrontare
ogni mese che hai nell'array di stringhe (szMesi) con il mese
in questione. Una volta trovato, è solo questione di ritornare
il valore del contatore (cMese) più uno:
enum  mesi { gennaio = 1, febbraio, marzo, ..., numMesi = 12};
char* szMesi[] = { "Gennaio", "Febbraio", "Marzo" ... };
int NumeroMese (char* mese)
{ 
 int cMese = 0; 
 while (cMese < numMesi)
 {
  if (!stricmp(szMesi[cMese], mese)) break;
  ++cMese;
 }
 if (cMese != numMesi) 
  ++cMese; /* Gli array in C sono zero-based, quindi gennaio = 0 */
 else
  cMese = 0; /* ritorn
a 0 in caso di errore */
 return cMese;
}
Segue codice di esempio.
HTH,
- Aldo.
------------------------------------------------------------
#include <stdio.h>
#include <stdlib.h>
enum { gennaio = 1, febbraio, marzo, aprile, maggio, giugno,
       luglio, agosto, settembre, ottobre, novembre, dicembre,
       numMesi = 12 };
char* szMesi[12] = { "Gennaio", "Febbraio", "Marzo",
                     "Aprile", "Maggio", "Giugno",
                     "Luglio", "Agosto", "Settembre",
                     "Ottobre", "Novembre", "Dicembre" };
void MeseEAnno (char *nomefile, char *mese, int *anno)
{
 while (*nomefile != '.')
 {
  *mese = *nomefile;
  ++mese; ++nomefile;
 }
 *mese = '\0';
 *anno = atoi(nomefile+1);
}
int NumeroMese (char* mese)
{ 
 int cMese = 0; 
 while (cMese < numMesi)
 {
  if (!stricmp(szMesi[cMese], mese)) break;
  ++cMese;
 }
 if (cMese != numMesi) 
  ++cMese; /* Gli array in C sono zero-based. */
 else
  cMese = 0; /* ritorna 0 in caso di errore */
 return cMese; 
}
main()
{
 char szMese[32];
 int mese, anno;
 char* nomefile = "marzo.1996.ext";
 MeseEAnno (nomefile, szMese, &anno);
 mese = NumeroMese(szMese);
 printf ("Il mese: %d -%s- dell'anno: %d", mese, szMesi[mese-1], anno);
 return 0;
}
----------------------------------

 e cosi' via.
E una serie di if? Es.:
if ( strcmp( NomeMese, "Gennaio" ) == 0 ) return 1;
etc.
EMG