Question

J'ai une fonction C recevant un uint8 pointeur avec un autre paramètre qui est sa taille (nombre d'octets).

je veux extraire double données de ce tampon.Voici mon code :

Write(uint8* data, uint8 size) /* data and size are given by a callback to my function)*/
{
    double d;
    for (i = 0; i < size; i++)
    {
        d = ((double*)&data)[i];
        printf(" d = %d\n");
    }
}

Le problème est que je ne reçois pas ce que j'envoie sur un matériel externe.Je suppose que mon casting est faux.J'ai essayé d'autres méthodes mais sans aucun bon résultat.Je n'arrive toujours pas à recevoir ce que j'envoie.

Était-ce utile?

La solution

Si je comprends votre question (il n'est pas tout à fait clair s'il y en a au plus un double extraire ou il peut y en avoir plusieurs), voici ce que j'essaierais de faire :

double Write(uint8* data, uint8 size)
{
    double d;

    if (size < sizeof(d))
        return 0; // failure; you may want something smarter than this

    memcpy(&d, data, sizeof(d));

    return d;
}

Ce que cela évite, c'est un problème d'alignement potentiel dans un casting comme d = *(double*)data.

Cela peut échouer de manière étrange et laides si les données ne représentent pas une valeur valide. double, en particulier s'il est inversé (par ex.votre matériel est petit-boutiste et le processeur exécutant ce code est gros-boutiste ou inversement).

Je ne sais pas encore si des problèmes d'alias s'appliquent.Il faut relire la norme.Cependant, je ne les ai jamais vus en pratique.

Autres conseils

En supposant que vos données sont en fait un tableau de doubles et que la taille est le nombre d'octets, votre code devrait ressembler à ceci :

Write(uint8* data, uint8 size) /* data and size are given by a callback to my function)*/
{
  double d;
  int i;
  for (i=0; i<size/sizeof(double); ++i) {
    d = ((double*)data)[i];
    printf(" d = %g\n",d);
  }
}

Très probablement, la taille est le nombre d'octets et non le nombre de doubles, vous devez donc diviser la taille par la taille d'un double pour obtenir le nombre réel de doubles :

Si tu fais ça:

    d = ((double*)&data)[i];

alors vous dites que le pointeur vers le pointeur vers les données est un double pointeur.

De plus, votre instruction printf ressemblait à ceci :

printf(" d = %d\n");

Vous lui disiez d'imprimer un entier (%d est un entier) et vous ne lui donniez pas de valeur réelle à imprimer.J'ai changé cela en %g, qui imprime un double au format le mieux adapté.

Write(uint8* data, uint8 size) /* data and size are given by a callback to my function)*/
 {

  double d;
  for (i=0; i<size; i++) {
  d = ((double*)data)[i];
  printf(" d = %d\n", d);
  }

 }

c'est ce que je suppose que vous recherchez, le pointeur est en fait un pointeur vers un tableau de doubles, donc vous le lancez exactement vers cela

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top