[C++] Verificare un dato numerico

valentino861
Gestisco con un'applicazione c++ un accelerometro e lo uso per raccogliere dati. Il problema è che l'accelerometro ha un range di +/- 3 g e se l'accelerazione supera tale valore mi esce un dato del tipo 1.#QO e che ovviamente mi fa impazzire poi tutte le elaborazioni del segnale stesso. Come posso fare a riconoscere se il dato sia ""buono""??

La mia idea era di fare un if che riconosce se il dato è un numero...ma come faccio? Ho fatto delle prove cosi:
int man(){
int c;
printf("inserisci c\n");
scanf("%d",&c);
getchar();
if(c==0){
	printf("\nerrore");}
else{printf("\nc= %.1d",c);}

getchar();
return 0;
}


Ma non funziona perchè non mi da mai errore, anche se inserisco una lettere al posto di un numero mi stampa lo stesso, credo che converta la lettera in numero

Risposte
Umby2
hai provato con lo "scanf" ?

valentino861
in che senso?!
In quella prova che ho postato uso lo scanf

apatriarca
Sinceramente non vedo come quell'applicazione possa avere qualcosa a che fare con il problema che hai incontrato. La scritta 1.#QO non mi dice niente, sembra più che altro un errore di visualizzazione. Perché leggi un valore intero con scanf? Non avevi detto che li leggevi da un accelerometro e che il tuo codice era in C++? La scritta "%.1d" non ha alcun senso in C perché i numeri interi non hanno parte frazionaria... Perché dovrebbe darti errore con c == 0? scanf restituisce il numero di letture effettuate, usa quello per verificare la presenza di errori nella lettura.

Che tipo di file leggi dall'accelerometro?

valentino861
Allora mi spiego meglio. L'accelerometro di tira fuori in un programma fatto in c++ una variabile double con il valore dell'accelerazione, che ha un range da -3g a +3g. Io prendo questi dati li memorizzo in un array double e poi, finita la fase di acquisizione, li elaboro in un'altra funzione del programma.
Ho scoperto che se accelero l'accelerometro sopra i 3g (circa ovviamente) invece di darmi per esempio 3.65432g mi da 1.#QO o una cosa simile, quindi sto cercando di capire come intercettare questi valori strani. Ad esempio pensavo di fare un if in modo che se trova un valore non riconosciuto (tipo 1.#QO), memorizza nell'array 3g, ossia il massimo; oppure -3g insomma questi sono poi dettaglio il punto non è questo.

Il fatto è che non so come fare a fargli intercettare quei valori strani perchè ora li mette tranquillamente in un array double e poi attraverso la funzione fprintf (si lo so è una funzione di C ma funziona anche in c++) li salvo in un file. Questo è un esempio del file contenente gli errori:

tempo:  163.385 x:  -4.710 y:  4.491 z:  1.592
tempo:  163.401 x:  0.065 y:  0.265 z:  9.241
tempo:  163.417 x:  -0.575 y:  -20.159 z:  14.879
tempo:  163.433 x:  1.#QO y:  1.#QO z:  1.#QO
tempo:  163.449 x:  1.#QO y:  1.#QO z:  1.#QO
tempo:  163.465 x:  0.560 y:  -6.683 z:  17.332
tempo:  163.481 x:  1.750 y:  -2.465 z:  17.520
tempo:  163.497 x:  -0.713 y:  1.076 z:  8.254



Questi valori non sono in g ma in m/s^2 (quindi ho moltiplicati i valori per 9.81, insomma il limite massimo sta a circa 30 m/s^2).

valentino861
quindi ho provato a fare il primo programmino che ho postato per cercare un modo di fargli intercettare un valore anomalo.
Allora con lo scanf invece di inserire da tastiera un numero ho provato a inserire delle lettere, ma il risultato è che il programma termina automaticamente.

Insomma la domanda è "come faccio ad intercettare dei dati che non siano double e quindi a non farli inserire nell'array??"

Grazie

La scritta "%.1d" non ha alcun senso in C perché i numeri interi non hanno parte frazionaria...


La scrittura "%.1d" hai ragione ma avevo fatto delle prove anche con un double e quindi con "%.1f" e poi mi è rimasta cosi.


Perché dovrebbe darti errore con c == 0? scanf restituisce il numero di letture effettuate, usa quello per verificare la presenza di errori nella lettura.


Non lo so avevo fatto una prova e l'argomento del topic è proprio cosa inserire nell'if; in che senso il numero di lettere?[/quote]

apatriarca
Siccome quel valore viene restituito dall'acceleromento quando va oltre i limiti immagino sia sempre uguale. Hai provato a verificare che sia in effetti sempre lo stesso? Hai provato a visualizzare il contenuto della variabile in esadecimale (devi usare x o X in printf insieme ad ll per dirgli che è a 64 bit). Se il contenuto è sempre esattamente lo stesso è sufficiente fare un confronto tra i valori come se fossero interi a 64 bit. Per farlo devi fare un cast come *(uint64_t *)&f dove f è la variabile double (nota che devi probabilmente cambiare il tipo uint64_t con il tipo nel tuo compilatore che rappresenta un intero a 64 bit), oppure usare una union.

Se il tuo accelerometro non è in grado di misurare accelerazioni oltre il range che ti interessa, ma l'accelerazione è spesso maggiore allora ritengo dovresti pensare alla sostituzione dell'accelerometro con un altro in grado di misurare le accelerazioni che ti interessano.

Rispondi
Per rispondere a questa discussione devi prima effettuare il login.