Oppure

Loading
20/01/13 17:14
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <math.h>
#include <windows.h>

bool timeout = false;
int t_max = 0;

bool timeout = false;
int t_max = 0;

void *thread_check_time(void *arg)
{
    timeout = false;
    printf("Inserisci il tempo massimo di attesa(espresso in secondi): ");
    scanf("%d", &t_max);
    Sleep(t_max);
    timeout = true;
}
 
int main(void)
{
    float pi_greco = 0, pi_grecotot = 0, num_disp = 1.0f, error = 5, accuracy = 0;
    int i = 0, denominatore = 1;
    printf("Inserisci il grado di accuratezza : ");
    scanf("%f", &accuracy);
    pthread_t thread_time;
    pthread_create(&thread_time, NULL, thread_check_time, NULL);
    while ((error > accuracy) || (!timeout))
	{
		pi_greco = 1.0f / num_disp;
		if (((i % 2) == 0) || (i == 0))
			pi_grecotot = pi_grecotot + pi_greco;
		else
			pi_grecotot = pi_grecotot - pi_greco;
		num_disp = num_disp + 2.0f;
        i++;
        error = 4 * pi_grecotot - M_PI;
	}
    pthread_join(thread_time, NULL);
    printf("Il valore di pigreco approssimato a %f è %f\n", accuracy, 4 * pi_grecotot);
    return 0;
}


Secondo me dovrebbe essere così, logicamente mi sembra corretto, eppure c' è qualcosa che non mi torna.
20/01/13 17:46
Inoltre dopo diverse prove mi sono accorto che Sleep() fa attendere un tempo praticamente casuale.
20/01/13 17:46
88Leo88
Postato originariamente da TheDarkJuster:

#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <math.h>
#include <windows.h>

bool timeout = false;
int t_max = 0;

bool timeout = false;
int t_max = 0;

void *thread_check_time(void *arg)
{
    timeout = false;
    printf("Inserisci il tempo massimo di attesa(espresso in secondi): ");
    scanf("%d", &t_max);
    Sleep(t_max);
    timeout = true;
}
 
int main(void)
{
    float pi_greco = 0, pi_grecotot = 0, num_disp = 1.0f, error = 5, accuracy = 0;
    int i = 0, denominatore = 1;
    printf("Inserisci il grado di accuratezza : ");
    scanf("%f", &accuracy);
    pthread_t thread_time;
    pthread_create(&thread_time, NULL, thread_check_time, NULL);
    while ((error > accuracy) || (!timeout))
	{
		pi_greco = 1.0f / num_disp;
		if (((i % 2) == 0) || (i == 0))
			pi_grecotot = pi_grecotot + pi_greco;
		else
			pi_grecotot = pi_grecotot - pi_greco;
		num_disp = num_disp + 2.0f;
        i++;
        error = 4 * pi_grecotot - M_PI;
	}
    pthread_join(thread_time, NULL);
    printf("Il valore di pigreco approssimato a %f è %f\n", accuracy, 4 * pi_grecotot);
    return 0;
}


Secondo me dovrebbe essere così, logicamente mi sembra corretto, eppure c' è qualcosa che non mi torna.


Non dirlo a me!!! Io sto sclerando su sto codice.....non capisco dove sbaglio!!!
aaa
20/01/13 18:03
Ultimo

Ma questo codice l'hai fatto te ?

è probabile che sia un errore di logica
If ok Then GOTO Avanza else GOTO Inizia

20/01/13 18:16
no Ultimo, ne sono convintissimo perchè se guardi bene io ho riscritto l' algoritmo matematico, 4 volte tra l' altro e l' errore non è lì. Ho provato a fermare il ciclo solo quando il tempo è scaduto e mi sono accorto che il metodo Sleep() va per i fattacci suoi. Inoltre la seconda condizione da sola non basta per terminare l' algoritmo in un tempo di 5 minuti (passati 5 minuti ho fermato il debug). Nemmeno io so più come aiutarlo. ho persino chiesto il tempo nel main e passato alla funzione nel thread il tempo chiesto nel main ma niente da fare.
20/01/13 18:27
Ultimo

Prova a creare una funzione esterna al Main, quindi un altro thread
If ok Then GOTO Avanza else GOTO Inizia

20/01/13 18:35
88Leo88
Postato originariamente da Ultimo:


Prova a creare una funzione esterna al Main, quindi un altro thread


Premessa:
Ringrazio immediatamente TheDarkJuster, Ultimo ed ovviamente Pierotofy per il supporto che mi state dando
che non è indifferente e non è da tutti!
Sono contento di essere entrato a far parte di questa comunità anche se ovviamente sono un principiante al momento e spero grazie anche ai vostri consigli di crescere e di poter un giorno aiutare altri utenti che si troveranno nelle mie medesime situazioni.

Ultimo comunque se tu vedi sempre sotto la sezione C c'è un'altro post mio con nome Timer e penso che quello è il codice con un altro thread che intendi tu......puoi provare a dargli un occhio?
aaa
21/01/13 21:08
In queste ore ho provato diverse varianti, ho riscritto tutto da capo più di 6 volte ma niente.L' algoritmo matematico di per sè funziona! Il problema sta nel fatto che basta aggiungere uno Sleep() OPPURE usare i thread e tutto perde ogni logica. INOLTRE la funzione dopo il while...... non mi convince per niente. So che non usarla porta a cose strana..... ma è strana, appena avrò altro tempo mi documenterò meglio ma l' errore potrebbe essere proprio lì.