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

Ciao a tutti, una domanda. Visto ce sto stuiando le strutture, e sto
cercando
di imparare ad appoggiarmi a quelle contenute negli header.h di /usr/include
per imparare.
I miei "test" si sono appoggiati a time.h che ha dichiarata la seguente
struttura:
/* tratta da /usr/include/time.h  */
struct tm
{
  int tm_sec;                   /* Seconds.     [0-60] (1 leap second) */
  int tm_min;                   /* Minutes.     [0-59] */
  int tm_hour;                  /* Hours.       [0-23] */
  int tm_mday;                  /* Day.         [1-31] */
  int tm_mon;                   /* Month.       [0-11] */
  int tm_year;                  /* Year - 1900.  */
  int tm_wday;                  /* Day of week. [0-6] */
  int tm_yday;                  /* Days in year.[0-365] */
  int tm_isdst;                 /* DST.         [-1/0/1]*/
# ifdef __USE_BSD
  long int tm_gmtoff;           /* Seconds east of UTC.  */
  __const char *tm_zone;        /* Timezone abbreviation.  */
# else
  long int __tm_gmtoff;         /* Seconds east of UTC.  */
  __const char *__tm_zone;      /* Timezone abbreviation.  */
# endif
};
/*  .----.----.----.----.-----..-----..---.. */
In questa struttura quindi vengono contenuti i valori temporali..quindi
vorrei capire perchč non č esatto questo mini progr.
#include <stdio.h>
#include <time.h>
int main()
{
   struct tm *tempo;
   fprintf(stdout," ORE : %i - MIN : %i - SEC %i - DAY %i ", tempo->tm_hour,
            tempo->tm_min,
            tempo->tm_sec,
            tempo->tm_wday );
 return 0;
}
 Perchč solo un sfilza di numeri senza senso?Mi sono semplicemente
appoggiato
alla struct..
Ma allora come si fa ad appoggiarsi ad una struct di un header?
E come capisco se ci si puň appoggiare, come appoggiarsi, e a che serve?
in piů, un'ultima cosa (amo leggermi i sorgenti per imparare cose nuove
ma..):
leggendo ad esempio la classica funzione:
/* Write formatted output to stdout.  */
extern int printf (__const char *__restrict __format, ...) __THROW;
nel relativo header..se non la conoscessi e cercassi di capirla... come cz
faccio??
nel senso..io so che nella printf() devo mettere una stringa e/o indici di
conversione, poi
la virgola(se con indici di convers.) e le variabili..
Ma se non l'avessi letto, e avessi tentato di capire
dall'header...a'voglia..
La domanda: come faccio a capire come devo usare queste funzioni dai
sorgenti?
__const char *__restrict ??
__format ??
__THROW ????
Grazie di tutto se vorrete rispondermi e chiarirmi un po' le idee.
Franco

 __THROW ????
Non sono funzioni, __restrict e' (molto probabilemnte) un puntatore a
char o a const char dipende dal define di __const che a sua volta
dipende dalla piattaforma o dal tipo di compilatore o da qualcosaltro.
Lo stesso per __THROW.
da qualche parte dovrebbe esserci qualcosa del tipo
#ifdef qualcosa
#define __const const
#elif
#define __const
#endif
la stessa cosa per __THROW
Sempre che non abbia detto baggianate, la compilazione
condizionale mi crea sempre dei problemi :-)
C:\>iao Angelo
-- 
Posted via Mailgate.ORG Server - 
http://www.Mailgate.ORG

 ma..):
E` buona norma, qualora si abbia intenzione di utilizzare una libreria, 
"appoggiarsi" alla sua documentazione e non fondare le proprie speranze 
dal reverse engineering del loro codice. Gli header sono scritti per 
essere compresi dal compilatore prima che dal programmatore, e quindi 
possono contenere informazioni che sono destinate a fuorviare 
quest'ultimo se privo di una solida conoscenza sia del linguaggio che 
dei costrutti tipici del compilatore che utilizza.
La potenza della libreria standard e` quella di esporre un insieme di 
funzioni e strutture dati ben documentate e disponibili su una 
vastissima schiera di piattaforme diverse, senza che sia la necessita` 
di spulciare il suo codice, diverso tra i vari porting, per comprenderne 
il funzionamento.
L'alternativa, vincente solo se strettamente necessaria, e` studiare 
prila il manuale del compilatore, in modo da venire a capo di tutte le 
parole chiave non standard che richiede nel codice del suo porting della 
libreria standard.
-- 
Baci,
Mony

 Prova il seguente programma:
scusate se mi intrometto, ma questa cosa mi incuriosice parecchio:
secondo quale procedimento si puo' calcolare il tempo dal 1 gennaio 1970???
se io spengo la mia macchina per 100 anni, sempre supponendo che tale
macchina sia in funzione dal '70, e poi la riaccendessi e volessi calcolare
il tempo in secondi dal '70, come fa a calcolarselo??? (sono un ottimista,
spero di vivere piu' di 100 anni ;) )
PS: presuppongo che la mia macchina sia in funzione dal 70 , perche' non
vedo altra soluzione se non calcolare secondo per secondo il tempo che
trascorre.
ciao diego

 dipende dalla piattaforma o dal tipo di compilatore o da qualcosaltro.
restrict e` un nuovo qualificatore  introdotto con il C99 che garantisce
al  compilatore  che  i  puntatori  di tipo  restrict  non  faranno  mai
riferimento alla stessa  area di memoria. Ad esempio  il prototipo della
memcpy e`:
void *memcpy(void * restrict dest, void * restrict src);
mentre quello della  memmove (dove i due  puntatori possono sovrapporsi)
e`:
void *memmove(void *dest, void *src);
Se nonstante la restrict due puntatori  diventano un alias per la stessa
zona  di  memoria si  incappa  in  un undefined  behaviour. Nelle  glibc
__restrict  viene  espanso a  restrict  se  il compilatore  supporta  la
feature. Similmente  __THROW si  espande  in una  throw() compilando  un
programma  C++,  mentre non  fa  nulla  durante  la compilazione  di  un
programma C.
ciao
Kronos
-- 
Home: 
http://kronoz.cjb.net
Se non sei parte della soluzione, allora sei parte del problema.

 spero di vivere piu' di 100 anni ;) )
Non e` il sistema a conservare la data in secondi dalla "Epoch" ma la 
libreria standard del C a convertire in tale formato la data fornita dal 
sistema, qualsiasi sia sua la sua politica di conteggio del tempo. Su 
come l'hardware o i sistemi operativi valutino quest'ultima opzione ti 
consiglio di chiedere nei newsgroup appropriati.
-- 
Baci,
Mony