एक पूर्णांक को एक स्ट्रिंग के रूप में विभाजित करना (अच्छी तरह से समझाया नहीं गया लेकिन…)


नमस्ते,
इसका उपयोग इस रूप में किया जा रहा है कि मैं यह चिंतन अभ्यास कैसे करूं।
मेरे पास एक यूनियन है जो बैलेंस सेंसर से एक मान लौटाता है। सीरियल मॉनीटर में ठीक काम करता है लेकिन मैं इसे एलसीडी पर प्रदर्शित करने का प्रयास कर रहा हूं, कुछ इधर-उधर देखने से पता चला है कि प्रदर्शित करने का कार्य

सी++
lcd.print()

स्क्रीन पर केवल एक ही अक्षर प्रिंट होगा।

मैंने क्या प्रयास किया है:

यूनियन के आउटपुट को स्ट्रिंग में परिवर्तित करना, समस्या यह है कि इस सिस्टम पर स्ट्रिंग मौजूद नहीं है,

सी++
char[]

अस्तित्व में है, तो मैं भी कर सकता हूँ

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

मुद्दा यह है कि सरणी को अलग-अलग मानों में कैसे विभाजित किया जाए जिसे बाद में चार पर अपलोड किया जा सके[]??

आपको यह अंदाज़ा हो गया होगा कि मैं यहाँ कहाँ जाने की कोशिश कर रहा हूँ…
मैं सटीक रूप से रिपोर्ट करने के लिए एक बैलेंस सेंसर का उपयोग करने की कोशिश कर रहा हूं कि क्या ‘प्रेस’ लेवल पर है (यह फर्श ढलान नहीं है) इसलिए मुगिन्स को इसे साबित करने का काम दिया गया था… बैलेंस सेंसर वापस आ जाता है (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 देता है। अच्छा। मैं जिस एलसीडी का उपयोग कर रहा हूं वह एक समय में केवल एक अक्षर दिखाएगा, उदाहरण के लिए यदि आप ‘4988’ भेजते हैं तो आपको ‘4’ मिलता है इसलिए मैं सोच रहा था कि क्या मैं इंट को चार में बदल दूं[] सरणी मैं वहां से स्थिति और आउटपुट की गणना करने के लिए for() का उपयोग कर सकता हूं

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

समाधान 1

सी में, एक चार[] प्रभावी रूप से एक स्ट्रिंग है: अंत में एक शून्य मान ‘\0’ जोड़ें और यह सभी व्यावहारिक उद्देश्यों के लिए एक स्ट्रिंग है – इन्हें “शून्य समाप्त स्ट्रिंग” कहा जाता है

स्ट्रिंग को आउटपुट करने के लिए, आपको असाइन करना होगा readOut[a] इसे पढ़ने के बजाय, और अपने मान को वर्णों में विभाजित करें – जो मुश्किल नहीं है लेकिन यह इस बात पर निर्भर करेगा कि इनपुट वास्तव में किसमें संग्रहीत है।

कुछ विचारों के लिए Google “C पूर्णांक को स्ट्रिंग में परिवर्तित करें” और “C पूर्णांक को हेक्स स्ट्रिंग में परिवर्तित करें”।

समाधान 2

प्रस्तुत डेटा प्रकारों के अनुसार, सेंसर परिणाम को 16-बिट पूर्णांक में बाइनरी संख्या के रूप में संग्रहीत करता है। पहला कदम यह पता लगाना होगा कि z_gyro का अधिकतम और न्यूनतम मान क्या है। यदि यह एक चिह्न के साथ 4-अंकीय मान निकलता है, तो एक वर्ण स्ट्रिंग में रूपांतरण के लिए कम से कम 6 वर्ण की आवश्यकता होगी। यदि बफ़र रीडआउट को 8 बाइट्स के साथ घोषित किया गया है, तो आउटपुट के लिए स्ट्रिंग लंबाई का उपयोग करने में कोई नुकसान नहीं है।
मेरा सुझाव है कि पहले पूर्णांक मान को एक स्ट्रिंग में परिवर्तित करें। यदि आप सी कमांड स्प्रिंटफ() का उपयोग कर सकते हैं, तो यह आसान है:

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

फिर स्ट्रिंग के अंत तक सभी वर्णों को अलग-अलग प्रिंट() फ़ंक्शन में पास करने के लिए फॉर-लूप का उपयोग करें।

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

यदि स्प्रिंटफ() फ़ंक्शन उपलब्ध नहीं है, तो itoa() अभी भी संभव होगा या आप रूपांतरण को स्वयं लूप में प्रोग्राम कर सकते हैं।

अतिरिक्त जानकारी के साथ “स्प्रिंटफ, वास्तव में सभी एफ फ़ंक्शन (प्रिंट, स्कैन) मौजूद नहीं हैं!” एक साधारण सामान्य फ़ंक्शन स्वयं लिखना संभव होगा। यह इस तरह दिख सकता है:

सी
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

यदि आपके पास इटोआ नहीं है, तो आप स्प्रिंटफ() का उपयोग कर सकते हैं, लेकिन इतने हल्के काम के लिए यह काफी भारी है। निम्नलिखित आपके लिए काम करना चाहिए

सी
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 वर्ण हैं, जिसमें समाप्ति शून्य भी शामिल है।

समाधान 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をコピーしました