Funzioni time.h (c++)
Ho già aperto in passato un argomento simile ma non sono riuscito a risolvere i miei problemi. Ho installato su windows XP (o eventualmente anche su w8) dev c++, ma posso usare solo la libreria stdio.h. Non sto dicendo che mi servono tutte ma me ne servirebbero altre 2 o 3... C'è un modo di installarle? La più "urgente" sarebbe time.h...
In passato mi è stato consigliato di provare altri programmi, diversi dal dev ma che funzionano sempre con il codice c. Ho provato a scaricare pelles c, ma anch'esso mi prende solo i comandi della libreria stdio.h (o forse neanche quelli).
Ringrazio in anticipo chi saprà aiutarmi su quanto ho scritto.
In passato mi è stato consigliato di provare altri programmi, diversi dal dev ma che funzionano sempre con il codice c. Ho provato a scaricare pelles c, ma anch'esso mi prende solo i comandi della libreria stdio.h (o forse neanche quelli).
Ringrazio in anticipo chi saprà aiutarmi su quanto ho scritto.
Risposte
Quella libreria dovrebbe essere presente in qualsiasi compilatore C. Ho usato time.h senza problemi in entrambi gli IDE da te nominati e credo tu stia quindi facendo qualcosa di sbagliato. Posta il codice dei tuoi tentativi.
adesso sembra andare la libreria time.h
però io vorrei creare numeri casuali sempre diversi tra loro e facendo
mi esce
57
57
57
57
57
57
57
57
57
57
perchè mi viene sempre uguale (non sempre il 57)?
grazie...
però io vorrei creare numeri casuali sempre diversi tra loro e facendo
#include
#include
int i,a;
main()
{
for (i=0;i<10;i++)
{
//inizializzazione funzione random
srand(time(NULL));
//variabili random
a= 1+ rand() % 100;
printf ("\n%d",a);
}
getch();
}
mi esce
57
57
57
57
57
57
57
57
57
57
perchè mi viene sempre uguale (non sempre il 57)?
grazie...
srand(time(null)); va chiamato una sola volta, all'inizio del programma. Spostalo fuori dal ciclo.
Come stai facendo tu il generatore di numeri casuali viene inizializzato ad ogni iterazione con il tempo attuale preciso al secondo. In 10 iterazioni resti nello stesso secondo, quindi viene sempre inizializzato con lo stesso numero.
Come stai facendo tu il generatore di numeri casuali viene inizializzato ad ogni iterazione con il tempo attuale preciso al secondo. In 10 iterazioni resti nello stesso secondo, quindi viene sempre inizializzato con lo stesso numero.
Vorrei aggiungere a quanto detto da claudio86 che hai detto nel titolo che hai a che fare con il C++, poi hai parlato del C e il codice è direi standard C90. Vorrei informarti che il C++ e il C sono linguaggi differenti, specialmente alla luce degli ultimi due standard (intendo il C++11 anche sta per uscire il C++14).
P.S.: comunque avresti dovuto mettere anche #include
P.S.: comunque avresti dovuto mettere anche #include
@claudio86
Ok grazie. Ho capitobl'errore.
@vict85
-io sto usando devc++, se ho parlato di codice c è un errore di ignoranza mia (semplicemente credevo fossero uguali).
-perchè avrei dovuto includere anche la stlib.h?
PS: ho cambiato il titolo perchè cosí lo ritengo più coerenre con la discussione.
Ok grazie. Ho capitobl'errore.
@vict85
-io sto usando devc++, se ho parlato di codice c è un errore di ignoranza mia (semplicemente credevo fossero uguali).
-perchè avrei dovuto includere anche la stlib.h?
PS: ho cambiato il titolo perchè cosí lo ritengo più coerenre con la discussione.
"kobeilprofeta":
-io sto usando devc++, se ho parlato di codice c è un errore di ignoranza mia (semplicemente credevo fossero uguali).
Assolutamente no. Anche se il C++ è quasi interamente un superset del C (almeno dello standard dell'89), quindi un compilatore C++ può compilare gran parte dei programmi C.
"kobeilprofeta":
-perchè avrei dovuto includere anche la stlib.h?
Perché srand() e rand() sono dichiarate lì. Probabilmente dentro stdio.h si include stdlib.h, quindi nel tuo caso funziona tutto, però su un altro compilatore potrebbe non essere così.
Hai bisogno di stdlib.h per poter usare rand e srand. Inoltre getch non è standard e in effetti non è supportata da diversi compilatori. Quando è supportata va inclusa usando conio.h in Windows. In alcuni casi è necessario usare _getch.
Per intenderci, questo è l'equivalente in C++11 (non è compatibile con gli standard precedenti) del tuo codice:
Nota che questo codice produce numeri casuali "migliori" di quelli usando rand(). A posto di time conviene invece usare chrono.
Detto questo, al di là dei cambiamenti del C++11, puoi notare come le funzioni sono chiamate in maniera leggermente differente. La libreria stdio, per esempio, nel C++ viene spesso chiamata come
#include <iostream> #include <random> int main() { std::random_device rd{}; std::default_random_engine dre{rd()}; std::uniform_int_distribution<> dis{1,100}; for (auto i = 0; i!= 10; ++i) { auto const a = dis(dre); std::cout<< a << std::endl; } }
Nota che questo codice produce numeri casuali "migliori" di quelli usando rand(). A posto di time conviene invece usare chrono.
Detto questo, al di là dei cambiamenti del C++11, puoi notare come le funzioni sono chiamate in maniera leggermente differente. La libreria stdio, per esempio, nel C++ viene spesso chiamata come
#include <cstdio>inoltre il C++ possiede i namespace che vanno gestiti.
Grazie per tutte le risposte.
Ho un programma in cui devo far scorrere il tempo a partire da quando si preme un tasto (per intenderci non da quando si esegue il file) e poi il tempo continua a scorrere fino a che non si preme un altro tasto. A questo punto il timer si mette in pausa e l'utente esegue un operazione (tipo scrivere il suo nome), quando a finito di scrivere il proprio nome preme invio e il timer riprende da dove aveva smesso. Il timer mi serve perchè ogni 10 secondi il programma deve scrivere "ciao".
Ho cercato di capire, leggendo su qualche manuale, come funziona questa funzione "cronometro" ma senza esempi jon ho chiara la sintassi. Sapete aiutarmi anche qua?
Ho un programma in cui devo far scorrere il tempo a partire da quando si preme un tasto (per intenderci non da quando si esegue il file) e poi il tempo continua a scorrere fino a che non si preme un altro tasto. A questo punto il timer si mette in pausa e l'utente esegue un operazione (tipo scrivere il suo nome), quando a finito di scrivere il proprio nome preme invio e il timer riprende da dove aveva smesso. Il timer mi serve perchè ogni 10 secondi il programma deve scrivere "ciao".
Ho cercato di capire, leggendo su qualche manuale, come funziona questa funzione "cronometro" ma senza esempi jon ho chiara la sintassi. Sapete aiutarmi anche qua?
@kobeilprofeta,
cambia compilatore
, io usavo su XP "Microsoft Visual C++" (il buon vecchio Visual C++ 6.0[nota]difficile reperirlo gratuitamente, tempo fa il docente di programmazione fu davvero gentile nei miei confronti
[/nota]), poi su Windows 7 usavo Code::Blocks, alla fine ho optato per questa soluzione avendo sia "GCC" sia "Clang"...
Saluti
P.S.=Mi è capitato di usare Dev c++ e credimi non è cosa per programmare soprattutto se lo usi dopo aver usato uno di quelli sopra citati!
"kobeilprofeta":
Ho già aperto in passato un argomento simile ma non sono riuscito a risolvere i miei problemi. Ho installato su windows XP (o eventualmente anche su w8) dev c++, ma posso usare solo la libreria stdio.h. Non sto dicendo che mi servono tutte ma me ne servirebbero altre 2 o 3... C'è un modo di installarle? La più "urgente" sarebbe time.h...
In passato mi è stato consigliato di provare altri programmi, diversi dal dev ma che funzionano sempre con il codice c. Ho provato a scaricare pelles c, ma anch'esso mi prende solo i comandi della libreria stdio.h (o forse neanche quelli).
Ringrazio in anticipo chi saprà aiutarmi su quanto ho scritto.
cambia compilatore



Saluti
P.S.=Mi è capitato di usare Dev c++ e credimi non è cosa per programmare soprattutto se lo usi dopo aver usato uno di quelli sopra citati!
@garnak.olegovitc: Visual Studio 6 è piuttosto datato. Microsoft ha fatto uscire altrettante versioni (siamo alla 12). Attualmente tra l'altro né esiste una versione gratuita: Visual Studio 2013 Express Edition. Versione che tra l'altro è molto più rispettosa degli standard.
@vict85,
hai ragione
, ora come ora uso clang e alle volte gcc anche su windows e non sapevo che si era arrivati ad altre edizioni di Visual... Però ai tempi mi trovavo bene con Visual C++ 6.0, o almeno per i miei scopi di programmazione, l'ho abbandonato quando cominciò a dare un problema, ovvero "si bloccava la compilazione" e dovevo salvare e chiudere il compilatore da Gestione Attività (da allora non l'ho più usato perchè il problema sembrava persistere anche su altri pc aventi XP.. e sono passato ad altro sino a scoprire la soluzione postata sul link di prima
)
Saluti
"vict85":
@garnak.olegovitc: Visual Studio 6 è piuttosto datato. Microsoft ha fatto uscire altrettante versioni (siamo alla 12). Attualmente tra l'altro né esiste una versione gratuita: Visual Studio 2013 Express Edition. Versione che tra l'altro è molto più rispettosa degli standard.
hai ragione


Saluti
Scusate, riprendo la discussione perchè non mi è ancora stata data risposta all'ultima domanda:
Ho un programma in cui ogni $t$ secondi il programma fa un operazione (aumenta una variabile, scrive "ciao",...) e inoltre quando da tastiera si preme un tasto il tempo si mette in pausa e, dopo aver fatto qualcosa (inserire il proprio nome) e dopo aver premuto invio il tempo riparte da dove era arrivato. Come posso procedere? Grazie
Ho un programma in cui ogni $t$ secondi il programma fa un operazione (aumenta una variabile, scrive "ciao",...) e inoltre quando da tastiera si preme un tasto il tempo si mette in pausa e, dopo aver fatto qualcosa (inserire il proprio nome) e dopo aver premuto invio il tempo riparte da dove era arrivato. Come posso procedere? Grazie
Non mi è chiaro cosa non ti è chiaro
, comunque non devi fare un loop a caso, ma far dormire il processo per qualche millisecondo. Ti consiglio di usare la funzione Sleep(). Verrebbe fuori qualcosa del genere :
Il mio codice fa il controllo della pressione del tasto ogni secondo, ovviamente puoi cambiare a tuo piacere. kbhit() serve a rilevare la pressione di un tasto.

#include <windows.h> // serve per sleep void foo() { bool stop = true; int ronf = 0; while (stop) { if (kbhit()) { tasto=getch(); _FaiQuelloCheVuoi(); } else { if (ronf == 10000) { // ossia quando abbiamo sleppato 10 000 msec printf("ciao\n"); ronf = 0; } Sleep(1000); ronf += 1000; } }
Il mio codice fa il controllo della pressione del tasto ogni secondo, ovviamente puoi cambiare a tuo piacere. kbhit() serve a rilevare la pressione di un tasto.