تقسيم عدد صحيح كسلسلة (لم يتم شرحه جيدًا ولكن…)


أهلاً بكم،
يتم استخدام هذا ككيفية القيام بتمرين التفكير هذا.
لدي اتحاد يقوم بإرجاع قيمة من مستشعر التوازن. يعمل بشكل جيد على الشاشة التسلسلية ولكني أحاول عرضه على شاشة LCD، وقد أظهر البعض من خلال البحث أن الوظيفة المراد عرضها

سي ++
lcd.print()

سيتم طباعة حرف واحد فقط على الشاشة.

ما حاولت:

تحويل مخرجات الاتحاد إلى سلسلة، المشكلة هي أن السلسلة غير موجودة في هذا النظام،

سي ++
char[]

موجود، لذلك يمكنني أن أفعل

سي ++
char readOut[8];  
for(int a =0; a<=7; a++) 
  gyro.output.z = readOut[a];

تكمن المشكلة في كيفية تقسيم المصفوفة إلى قيم فردية يمكن بعد ذلك تحميلها إلى الحرف[]؟؟

لقد حصلت على فكرة عن المكان الذي أحاول الذهاب إليه هنا …
أحاول استخدام مستشعر التوازن للإبلاغ بدقة عما إذا كان “الضغط” مستويًا (ليس المنحدرات الأرضية) لذا تم تكليف Muggins بمهمة إثبات ذلك… يقوم مستشعر التوازن بإرجاع (accel_t_gyro.value.z_gyro) وهو اتحاد يتكون مما يلي:

ج
typedef union accel_t_gyro_union
{
struct {
uint8_t x_accel_h;
uint8_t x_accel_l;
uint8_t y_accel_h;
uint8_t y_accel_l;
uint8_t z_accel_h;
uint8_t z_accel_l;
uint8_t t_h;
uint8_t t_l;
uint8_t x_gyro_h;
uint8_t x_gyro_l;
uint8_t y_gyro_h;
uint8_t y_gyro_l;
uint8_t z_gyro_h;
uint8_t z_gyro_l;
} reg;

struct {
int16_t x_accel;
int16_t y_accel;
int16_t z_accel;
int16_t temperature;
int16_t x_gyro;
int16_t y_gyro;
int16_t z_gyro;
} value;
};

لذا فهو يعطي رقمًا مكونًا من أربعة أرقام 4988 على سبيل المثال. بخير. ستعرض شاشة LCD التي أستخدمها حرفًا واحدًا فقط في كل مرة، على سبيل المثال، إذا أرسلت “4988” فستحصل على “4” لذلك كنت أفكر إذا قمت بتحويل int إلى حرف[] صفيف يمكنني استخدام for() لحساب المواضع والإخراج من هناك

ج
for(int a = 0; a <= 7; a++) {
  // char[a] to int[a] type thing
}
lcd.print(a);

الحل 1

في C، شار[] هي سلسلة فعليًا: أضف قيمة فارغة ‘\0’ في النهاية وهي سلسلة لجميع الأغراض العملية – تسمى “سلاسل منتهية خالية”

للإخراج إلى السلسلة، يجب عليك التعيين إلى readOut[a] بدلاً من القراءة منه، وتقسيم القيمة الخاصة بك إلى أحرف – وهو أمر ليس صعبًا ولكنه سيعتمد على ما تم تخزين المدخلات فيه فعليًا.

جوجل عن “C تحويل عدد صحيح إلى سلسلة” و”C تحويل عدد صحيح إلى سلسلة سداسية” لبعض الأفكار.

الحل 2

وفقا لأنواع البيانات المقدمة، يقوم المستشعر بتخزين النتيجة كرقم ثنائي في عدد صحيح 16 بت. ستكون الخطوة الأولى هي معرفة القيمة القصوى والدنيا لـ z_gyro. إذا تبين أنها قيم مكونة من 4 أرقام مع علامة، فستكون هناك حاجة إلى 6 أحرف على الأقل للتحويل إلى سلسلة أحرف. إذا تم الإعلان عن قراءة المخزن المؤقت بـ 8 بايت، فلا ضرر من استخدام طول السلسلة للإخراج.
أقترح تحويل القيمة الصحيحة إلى سلسلة أولاً. إذا كان بإمكانك استخدام الأمر C sprintf()، فهذا أمر سهل:

ج
sprintf(readOut, "%d", sensor.value.z_gyro);

ثم استخدم حلقة for لتمرير كافة الأحرف بشكل فردي إلى نهاية السلسلة إلى وظيفة print().

ج
for (int i = 0; i < strlen(readOut); i++)
    lcd.print(readOut[i]);

إذا كانت الدالة sprintf() غير متوفرة، فسيظل itoa() ممكنًا أو يمكنك برمجة التحويل بنفسك في حلقة.

مع المعلومات الإضافية “sprintf، في الواقع جميع وظائف f (الطباعة والمسح الضوئي) غير موجودة!” سيكون من الممكن كتابة وظيفة عامة بسيطة بنفسك. يمكن أن يبدو مثل هذا:

ج
void intToCString(int num, char* str) {
    if (num < 0) {
        *str++ = '-';
        num = -num;
    }

    int divisor = 1;
    while (num / divisor > 9) {
        divisor *= 10;
    }

    while (divisor > 0) {
        *str++ = '0' + (num / divisor);
        num %= divisor;
        divisor /= 10;
    }

    *str = '\0';
}

الحل 3

إذا لم يكن لديك itoa، فيمكنك استخدام sprintf()، ولكن هذا ثقيل جدًا لمثل هذه المهمة الخفيفة. يجب أن يعمل ما يلي بالنسبة لك

ج
int magnitude(int x)
{
    int i;
    x = abs(x);
    for(i = 0; x > 0; x /= 10, ++i);
    return i;
}

char *i2cstr(int i, char *buff) 
{
    int n = magnitude(i);

    /*  The following is only needed if i may be negative */ 
    int last = 0;
    if(i < 0) {
        i *= -1;
        buff[0] = '-';
        n += 1;
        last = 1;
    }
    /* end of dealing with negative numbers */
    
    buff[n] = 0;
    for(--n; n >= last; --n ) {
        buff[n] = i%10 + '0';
        i/= 10;
    }
    return buff;
}

تحذير: المعلمة buff يجب أن يكون حجم i2cstr() مناسبًا. بالنسبة لـ uint16_t، فهذا يعني 6 أحرف، بما في ذلك إنهاء null.

الحل 4

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

ج
void putaschar(int16_t n)
{
    if( n == 0 ) {
        /* special case for n == 0 */
        putchar('0');
    } else {
        if(n < 0) {
            /* oputput sign, and make n +ve */
            putchar('-');
            n *= -1;
        }

        /* determine largest power of 10 smaller than n */
        int16_t divisor = 10000;  /* maximum power of 10 that will fit in int16 */
 
        while( n / divisor == 0) {
            divisor /= 10;
        }

        /* send chars to the output device */
        do {
            putchar(n/divisor + '0');
            n %= divisor;
            divisor /= 10;
        } while(divisor > 0);
    }
}

في ما سبق، افترض ذلك putchar() يمثل أي سحر تحتاج إلى القيام به لإرسال حرف إلى الشاشة.

コメント

タイトルとURLをコピーしました