[C++] Verificare un dato numerico
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:
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
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
hai provato con lo "scanf" ?
in che senso?!
In quella prova che ho postato uso lo scanf
In quella prova che ho postato uso lo scanf
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?
Che tipo di file leggi dall'accelerometro?
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:
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).
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).
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 scrittura "%.1d" hai ragione ma avevo fatto delle prove anche con un double e quindi con "%.1f" e poi mi è rimasta cosi.
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]
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]
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.
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.