Newsgroup: it.comp.lang.c
Titolo: Se fosse per il C non saprei più nemmeno che giorno è oggi.

Possibile che sia tanto complicato mettere su due righe per far funzionare
date ed ore con #include <time.h> int tm_xxx; %a %A %x %X ecc. ecc.?
Gli stessi autori Kernigham & Ritchie non si abbassano, nel loro libro
"Il linguaggio C" a scrivere esempi in proposito. Lo fanno nelle prime
pagine per scrivere "Hello World" e per convertire i gradi Farenheit in
centigradi ma successivamente preferiscono astenersi. Specie per quel
che riguarda date e stringhe. Chi può dare un listato (completo!)
per scrivere almeno che giorno è oggi e magari che ora?
-- 
Qui si usa Linux
http://www.puppylinux.org
http://www.opera.com/browser

date ed ore con #include <time.h> int tm_xxx; %a %A %x %X ecc. ecc.?
  struct tm *local;
  time_t t;
  time(&t);
  local=localtime(&t);
  printf("%02d/%02d/%02d",local->tm_mday,local->tm_mon+1,local->tm_year+1900);
-- 
 ************** (.)_(.) *******************
 Un amico è uno che sa tutto di te e,
 nonostante questo, gli piaci
(E. Hobbard) 

 "Il linguaggio C" a scrivere esempi in proposito. 
Il KernighaN (con la enne) & Ritchie � notoriamente un testo poco adatto
per imparare il linguaggio anche per il fatto che � abbastanza scarno e
parco di esempi.
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
char *fmt_time(time_t t, char *buf, size_t bufsz, const char *fmt)
{
    struct tm *ts;
    ts = localtime(&t);
    strftime(buf, bufsz, fmt, ts);
    return buf;
}
int main()
{
    char now[50]={0};
    puts(fmt_time(time(0), now, sizeof now, "%d/%m/%Y %H:%M:%S"));
    return 0;
}
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

 parco di esempi.
Non sono particolarmente d'accordo. Non sono *sicuramente* d'accordo sul
"notoriamente". Accetto la tua opinione, ma non e' che sia una cosa
universale tanto da giustificare il "notoriamente". 
Anzi, il libro e' di per se considerato un modello di scrittura tecnica.
Gli esempi sono relativamente pochi, e' vero, ma sono sostanzialmente
tutti significativi e piuttosto realistici.
Le critiche al libro che trovo, personalmente, fondate sono due. La
prima riguarda quanto e' aggiornato il libro: resta il fatto che la
seconda edizione (quella normalmente disponibile) e' aggiornata a C89.
Dal momento che attualmente nessun compilatore per le maggiori
piattaforme e' completamente conforme a C99 (con la possibile eccezione
di SunStudio, dicono), la cosa potrebbe non essere drammatica. 
Si fa sempre presto ad imparare C89 e poi "aggiornarsi" piano piano a
C99.
Sempre tenendo conto che, pur 10 anni dopo lo standard, non e'
verosimile aspettarsi implementazioni 100% conformi (anche se alcune
features sono ben supportate). Tutt'ora molto spesso con C si intende
implicitamente C89 (ovvero, buona parte del C che leggo e' di fatto
scritto per essere compatibile sia con C89 che con C99).
La seconda critica riguarda la didattica. K&R non ti culla. Va sempre
dritto al sodo e complessivamente presuppone un lettore che sappia
qualcosa in generale di programmazione[0] e/o sia piuttosto sveglio. Ma
si potrebbero muovere *esattamente* le stesse critiche a Knuth. The Art
of Computer Programming se sei pigro, svogliato e principiante *non* lo
affronti.
Personalmente, vorrei che esistessero piu' libri come K&R. Quando per
studiare un nuovo linguaggio, mi sparano 600 pagine di manuale in cui
cercherebbero pure di insegnarmi a programmare, in generale mi annoio
assai.
-----
[0] dove con "qualcosa" si intende qualcosa di molto astratto.
-- 
-riko


Quoto in pieno. Quanto è vero...

 per scrivere almeno che giorno è oggi e magari che ora?
This is the online version of The C Book, second edition by Mike
Banahan, Declan Brady and Mark Doran, originally published by Addison
Wesley in 1991. This version is made freely available.
http://publications.gbdirect.co.uk/c_book/
Date and time:
http://publications.gbdirect.co.uk/c_book/chapter9/date_and_time.html

 > per imparare il linguaggio anche per il fatto che è abbastanza scarno e

Concordo al 100%, io l'ho trovato ottimo.
Passare dal Java a C col K&R è stato completamente indolore
e molto rapido.

 seconda edizione (quella normalmente disponibile) e' aggiornata a C89.
Non lo � pienamente. La seconda edizione � stata pubblicata prima
dell'uscita dello standard, quindi per essere veramente aggiornata bisogna
corredarla degli errata corrige.


 pi� chiari ed esplicativi.
Per non parlare di quelli di Eckel, ovviamente. Comunque aggiungo che non
ho mai affermato che il K&R non � un buon libro (per cui condivido il tuo
desiderio che magari ve ne fossero di pi� di libri del genere), dico solo
che da quel che ho potuto constatare e dall'impressione che ho avuto
leggendo entrambe le edizioni, non mi � sembrato possedere un'impostazione
didattica.



Molto bene. Questa non solo funziona (con inclusioni main e parentesi  
graffe), ma è un
meraviglioso gioco enigmistico da risolvere. Grazie.
-- 
Qui si usa Linux.
http://www.puppylinux.org
http://www.opera.com/browser

 }
Anche questa funziona. C'era quella "struct" che doveva essere proprio
"strutturata" per funzionare. Come costruirsi una nave dopo aver visto
solo un salvagente :-). Grazie.


 meraviglioso gioco enigmistico da risolvere. Grazie.
bastava una ricerchina con google eh.
Ciao Jack

 
http://publications.gbdirect.co.uk/c_book/chapter9/date_and_time.html
Molto bene. Grazie mille.


 ha  
scritto:

Non sono bastate le ricerche su Google; è stato invece utile il news-group.
Saluti.



Per "color che sanno" sono tre variabili ben strutturate.
Per gli altri un rompicapo. A proposito:
Per fare una nuova directory col C bisogna rassegnarsi
a 'system("mkdir /dir"); o c'è un modo meno dipendente
dal sistema operativo sottostante il C.? Ho trovato tra le varie funzioni
una "creat" che forse potrebbe funzionare, se ben strutturata,
da "mkdir". Ma come strutturarla? Saluti.


 ha scritto:
|
|        Broken-down  time  is  stored  in  the structure tm which is 
|defined in
|        <time.h> as follows:
|
|            struct tm {
|                int tm_sec;         /* seconds */
|                int tm_min;         /* minutes */
|                int tm_hour;        /* hours */
|                int tm_mday;        /* day of the month */
|                int tm_mon;         /* month */
|                int tm_year;        /* year */
|                int tm_wday;        /* day of the week */
| };
---------------------------------------------
Perché qui sotto c'è questo "error": redefinition of 'struct tm'?
#include <stdio.h>
#include <time.h>
            struct tm  {
                int tm_sec;         /* seconds */
                int tm_min;         /* minutes */
                int tm_hour;        /* hours */
                int tm_mday;        /* day of the month */
                int tm_mon;         /* month */
                int tm_year;        /* year */
                int tm_wday;        /* day of the week */
                int tm_yday;        /* day in the year */
                int tm_isdst;       /* daylight saving time */
            };
int main()
 {
int tm_hour;
printf("%d",tm_hour);
}

 "mkdir". Ma come strutturarla? Saluti.
Nei sistemi POSIX c'è la funzione mkdir() che IMO fa una system call.
Non credo che, sempre restando nei sistemi POSIX, sia possibile farlo 
usando la creat().
Ciao
Giovanni
-- 
   A computer is like an air conditioner,
   it stops working when you open Windows.
   < 
http://giovanni.homelinux.net/
 >

 }
Perché la struttura tm è già definita in <time.h>.
Quello che devi fare è allocare un puntatore ed inizializzarlo con una 
chiamata a localtime() o gmtime().  L'area di memoria ritornata dalla 
chiamata è strutturata come definito da 'struct tm' e correttamente 
inizializzata.
#include <stdio.h>
#include <time.h>
int main()
{
    struct tm *dateInfo;
    time_t now;
    now = time(NULL);
    dateInfo = localtime(&now);
    printf("Date is %02d/%02d/%2d, time is %02d:%02d:%02d \n",
	dateInfo->tm_day,
	dateInfo->tm_mon,
	dateInfo->tm_year,
	dateInfo->tm_hour,
	dateInfo->tm_min,
	dateInfo->tm_sec);
    return 0;


 ha scritto:
|..omissis...
#include <stdio.h>
#include <time.h>
int main()
{
    struct tm *dateInfo;
   time_t now;
    now = time(NULL);
    dateInfo = localtime(&now);
     const int oggi='dateinfo->tm_yday';
    printf("E' il %02d/%02d/%2d e sono le ore %02d:%02d:%02d.\n",
	dateInfo->tm_mday,
	dateInfo->tm_mon,
	dateInfo->tm_year,
	dateInfo->tm_hour,
	dateInfo->tm_min,
	dateInfo->tm_sec);
     printf("E' il %d%s\n",oggi,"° giorno dell'anno" );
    return 0;
}
Questa cosa funziona parzialmente. Ho visto con piacere che sono
riuscito a mettere gli elementi della data sotto variabile ("oggi") così
da poterli usare non solo per rivedere il calendario corrente, ma anche
per farci, domani, qualche calcolo. Purtroppo esce in formato
timestamp... Cosa che non succede nel sostituire una qualsiasi 'tm_xxx'
nella prima printf la quale, tuttavia si ostina a dare errore
fatale quando tento di aggiungerne qualcuna alle sei che già sopporta.
Manovrando in tutti i modi le specifiche '%d'.
Saluti.
-- 
Qui si usa Linux.
http://www.puppylinux.org
http://digilander.libero.it/puppylinuxitalia/
22/11/2009 ore 18:35:06

 da "mkdir". Ma come strutturarla? Saluti.
funzioni POSIX.
Ciao Jack

 Manovrando in tutti i modi le specifiche '%d'.
Studia dall'inizio non partire dalla fine.


 ha scritto:
..omissis...
|Non puoi dichiarare una variabile in questo punto e non può essere di 
|tipo const.  A che servono gli apici che racchiudono dateinfo->tm_yday?
|
|Il nome del puntatore è dateInfo non dateinfo. La differenza 
|maiuscole/minuscole è una delle prime cose che ti insegnano in un 
|corso di C.
..omissis...
|
|Studia dall'inizio non partire dalla fine.
int main()
{
    struct tm *dateInfo;
   time_t now;
    now = time(NULL);
    dateInfo = localtime(&now);
     int oggi=dateInfo->tm_yday;
     printf("E' il %02d/%02d/%2d e sono le ore
     %02d:%02d:%02d.\n", dateInfo->tm_mday,
	dateInfo->tm_mon,
	dateInfo->tm_year,
	dateInfo->tm_hour,
	dateInfo->tm_min,
	dateInfo->tm_sec);
     printf("E' il %d%s\n",oggi,"° giorno dell'anno" );
    return 0;
}
Funziona. Anche se continuo a dichiararla in quel punto, dopo
l'entrata in gioco di "dateInfo" (o no?).
Dal momento che così riesco finalmente a catturare l'output dello
scritto in una variabile considero il fatto come un buon inizio. 
Adesso voglio vedere come è possibile usarla per realizzare, 
magari, una specie di rozzo calendario, attraverso gli operatori
aritmetici. 
Lo studio deduttivo presuppone un libro di testo. Ho il
Kernighan&Ritchie più diversi tutorial on-line in inglese.
Ma in questo campo come in molti altri credo che qualche 
esempio (cioè il contributo del paziente maestro) sia essenziale
per entrare in sintonia col discorso teorico del libro.
Altrimenti si incontrerebbero le stesse difficoltà di
chi fosse determinato a farsi esperto di botanica senza 
aver mai visto un albero. 
Grazie e saluti. 
-- 
Qui si usa Linux.
http://www.puppylinux.org
http://digilander.libero.it/puppylinuxitalia/
23/11/2009 ore 15:09:39

 
te ti devi leggere un buon libro di C e poi uno sulle chiamate di
sistema della piattaforma utilizzata.
Ad esempio unistd definisce mkdir come:
int mkdir (const char *filename, mode_t mode)
dove filename è il nome della directory che vuoi creare e mode sono dei
flag ossia degli attributi che concateni con una or che definiscono i
permessi ad esempio per creare un dir con permessi di lettura,
scrittura, esecuzione (che per una dir significa listing) su linux fai:
#include <stdlib.h>
#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/types.h>
....
....
....
if ( -1 == mkdir('nuova_dir', S_IRWXU) )
{
// gestisci errore
}
else
{
// tutto ok
}
la directory viene creata nella working directory.
micheg

 aver mai visto un albero. 
Ciao


I
|
|No.  Il fatto è che le variabili devono essere dichiarate prima di 
|qualsiasi statement del blocco.  Non è che stai compilando in modalità 
|c++?
|
Posso scegliere tra cc,gcc e c++.  Fatte le prove le variabili
funzionano sempre, anche con cc, pure se dichiarate e contemporaneamente
inizializzate immediatamente prima dell'uso.
Lo stato attuale dell'arte è ora il seguente:
#include <stdio.h>
#include <time.h>
int main()
{
    int oggi,anni,nascita;
    struct tm *data;
   time_t now;
    now = time(NULL);
    data = localtime(&now);
    oggi=data->tm_yday;
    nascita=1945;
    anni=data->tm_year+1900-nascita;
   printf("E' il %02d/%02d/%2d,\n",
	data->tm_mday,
	data->tm_mon,
	data->tm_year+1900);
     printf("%d° giorno dell'anno.\n",oggi);
    printf("Sono le ore %02d:%02d:%02d,\n",
	data->tm_hour,
	data->tm_min,
	data->tm_sec);
 
    printf("mancano %02d giorni a Natale\n",359-1-oggi);
        printf("ed ho già %d anni.\n",anni);
    return 0;
}
Saluti.
.
-- 
Qui si usa Linux.
http://www.puppylinux.org
http://digilander.libero.it/puppylinuxitalia/
24/11/2009 ore 06:31:03

 

Funziona. All'osso così:
#include <stdlib.h>
#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/types.h>
int main()
{
mkdir("/dir/nuovadir", S_IRWXU);
}
Grazie mille e buone feste.
-- 
Qui si usa Linux
http://www.puppylinux.org