Bonsoir pour nous aider à t'aider tu aurais pu nous dire de quoi est composée une trame RMC, comment tu la lis etc. Ça m'aurait évité d'avoir à chercher sur wikipedia. Donc j'y apprends que l'heure est stockée au format hhmmss.sss, et les coordonnées au format dddmm.mmmm pour la longitude et ddmm.mmmm pour la latitude.
Ton code pour l'«heure» ressemble plus à un code de conversion de coordonnées (dddmm.mmmm vers ddd°mm'ss.sss).
Voyons ton code :
char * convert(char* chaine)
Juste un détail, comme chaine ne sera jamais modifiée tu peux en avertir le compilateur en déclarant char* convert(const char *chaine). Un commentaire ne serait pas de trop pour expliquer au lecteur quel est le format attendu de chaîne. On va partir du principe que chaine sera au format dddmm.mmmm ou ddmm.mmmm.
1 2 3
|
{
double f = atof(chaine); |
La fonction atof n'est pas ta meilleure option, car si la chaine ne contient pas quelque chose qui peut être transformé en réel alors elle renvoie 0.0. Du coup tu ne sais pas en recevant 0.0 s'il s'agit d'une erreur ou de 0.0. C'est pourquoi on lui préfère la fonction strtod. Pour savoir comment l'utiliser tu peux consulter la page man strtod. Je suppose qu'en cas d'erreur ta fonction pourra renvoyer NULL.
1 2 3
|
int deg,min; double sec;
deg = (int)(f / 100.0); |
Je ne suis pas un pro de l'utilisation et du cast de double en int. J'aurai sans doute par excès de zèle forcé l'arrondi par un deg=(int) floor(f / 100.0);. Mais cela reste à vérifier, quoi qu'il en soit cela ne fait pas de mal.
Ici on récupères bien les degrés : dddmm.mmmm/100.0 = ddd.mmmmmm qui arrondi vers le bas donne ddd. Bingo.
1 2
| min = (int)(f - (deg * 100.0));
sec = 60.0*(f - (deg*100.0) - min); |
Mêmes remarques ...
1 2
| char *s = calloc(14,sizeof(char));
printf(s,"%3d%c%2d'%5.3f",deg,0xF8,min,sec); |
printf n'est pas la bonne fonction à utiliser ici. La page man de printf t'indiquera quelle fonction utiliser pour «imprimer» dans une variable.
Tu alloues la chaine retournée, il faudra penser à la libérer quand tu n'en aura plus besoin. Détail, return n'est pas une fonction donc pas besoin de parenthèses return s; suffit.
EDIT: Je viens de vérifier mon excès de zèle : c'est n'est pas une bonne idée. En effet la norme précise :
When a finite value of real floating type is converted to an integer type other than _Bool, the fractional part is discarded (i.e., the value is truncated toward zero).
Soit exactement ce que tu désires obtenir.
Partager