Frage

Ich habe eine C-Funktion, die a empfängt uint8 zeiger mit einem anderen Parameter, der seine Größe (Anzahl der Bytes) ist.

Ich möchte extrahieren double daten aus diesem Puffer.Hier ist mein 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");
    }
}

Das Problem ist, dass ich das, was ich sende, nicht innerhalb einer externen Hardware empfange.Ich denke, dass meine Besetzung falsch ist.Ich habe andere Methoden ausprobiert, aber ohne gutes Ergebnis.Ich kann immer noch nicht bekommen, was ich sende.

War es hilfreich?

Lösung

Wenn ich deine Frage verstehe (es ist nicht ganz klar, ob es höchstens eine gibt double extrahieren oder es kann viele geben), hier ist, was ich versuchen würde:

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;
}

Was dies vermeidet, ist ein potenzielles Ausrichtungsproblem in einer Besetzung wie d = *(double*)data.

Dies kann auf seltsame und hässliche Weise fehlschlagen, wenn die Daten keine gültige double, insbesondere wenn es umgekehrt ist (z.ihre Hardware ist Little-Endian und die CPU, auf der dieser Code ausgeführt wird, ist Big-Endian oder umgekehrt).

Ich weiß noch nicht, ob Aliasing-Probleme zutreffen.Ich muss den Standard noch einmal lesen.In der Praxis habe ich sie jedoch nie gesehen.

Andere Tipps

Angenommen, Ihre Daten sind tatsächlich ein Array von Doppelwerten und die Größe ist die Anzahl der Bytes, sollte Ihr Code ungefähr so aussehen:

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);
  }
}

Höchstwahrscheinlich ist die Größe die Anzahl der Bytes und nicht die Anzahl der Doppel, daher müssen Sie die Größe durch die Größe eines Doppel teilen, um die tatsächliche Anzahl der Doppel zu erhalten:

Wenn du das tust:

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

dann sagen Sie, dass der Zeiger auf den Zeiger auf die Daten ein Doppelzeiger ist.

Auch Ihre printf-Anweisung war so:

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

Sie haben ihm gesagt, dass er ein int drucken soll (% d ist ein int) und ihm keinen tatsächlichen Wert zum Drucken geben soll.Ich habe das in% g geändert, wodurch ein Double im Best-Fit-Format gedruckt wird.

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);
  }

 }

ist es das, wonach ich vermute, dass Sie suchen, der Zeiger ist eigentlich ein Zeiger auf ein Array von Doubles, also werfen Sie ihn einfach genau darauf um

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top