سؤال

لدي وظيفة C تتلقى أ uint8 المؤشر بمعلمة أخرى وهي حجمه (عدد البايتات).

أريد أن أستخرج 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, ، على وجه التحديد إذا كان معكوسًا (على سبيل المثال.أجهزتك ذات نهاية صغيرة ووحدة المعالجة المركزية التي تقوم بتشغيل هذا الرمز هي نهاية كبيرة أو العكس).

لا أعرف حتى الآن ما إذا كانت مشكلات التعرج تنطبق.بحاجة لقراءة المعيار مرة أخرى.ومع ذلك، لم أرهم في الممارسة العملية.

نصائح أخرى

بافتراض أن بياناتك هي في الواقع مصفوفة من الأرقام المزدوجة والحجم هو عدد البايتات، يجب أن تبدو شفرتك كما يلي:

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