문제

크기 (바이트 수) 인 다른 매개 변수가있는 uint8 포인터를 수신하는 C 함수가 있습니다.

이 버퍼에서 double 데이터를 추출하고 싶습니다.다음은 내 코드가 있습니다 :

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

문제는 내가 외부 하드웨어 내에서 보내는 것을받지 못한다는 것입니다.나는 내 캐스트가 틀렸다고 생각한다.나는 다른 방법을 시도했지만 좋은 결과가 없어야합니다.나는 아직 내가 보내는 것을 얻을 수 없어.

도움이 되었습니까?

해결책

내가 당신의 질문을 이해하면 (추출물을 추출 할 수있는 하나의 double가있을 때 완전히 분명하지는 않습니다), 여기서 내가하는 일은 다음과 같습니다.

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

이 피해지는 것은 d = *(double*)data와 같은 주조의 잠재적 인 정렬 문제입니다.

데이터가 유효한 double를 나타내지 않는 경우 홀수 및 추악한 방법으로 실패 할 수 있습니다 (예 : 하드웨어가 리틀 엔디안 이고이 코드를 실행하는 CPU는 큰 엔디안 또는 다른 방향으로 실행됩니다).

앨리어싱 문제가 적용되면 아직 모릅니다.다시 표준을 읽어야합니다.그래도 실제로는 결코 보지 못했습니다.

다른 팁

데이터가 실제로 배열이고 크기가 아일랜드 수이며 코드는 바이트 수입니다.

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

크기는 두 배 수가 아닌 바이트 수가 아니므로 크기가 두 배의 크기로 나누어야합니다.

이렇게하면 다음을 수행하십시오.

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

다음 데이터에 대한 포인터에 대한 포인터가 이중 포인터임을 말합니다.

또한 PRINTF 문이 다음과 같습니다.

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

int를 인쇄하라는 것을 알려 줬습니다 (% d는 int이지만 인쇄 할 실제 값이 없습니다.나는 그것을 % g으로 바꿨습니다. 이는 두 배를 가장 잘 맞는 형식으로 인쇄합니다.

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

 }
.

당신이 찾고있는 것처럼 추측하는 것입니다, 포인터는 실제로 복식 배열에 대한 포인터이므로 정확히

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top