Memisahkan bilangan bulat sebagai string (tidak dijelaskan dengan baik tapi…)

pemrograman


Halo semua,
Ini digunakan sebagai bagaimana saya melakukan latihan berpikir ini.
Saya memiliki gabungan yang mengembalikan nilai dari sensor Keseimbangan. Berfungsi dengan baik di monitor serial tetapi saya mencoba menampilkannya di LCD, beberapa pencarian menunjukkan bahwa fungsinya untuk ditampilkan

C++
lcd.print()

hanya akan mencetak satu karakter ke layar.

Apa yang saya coba:

Mengonversi keluaran serikat menjadi string, masalahnya adalah string tidak ada di sistem ini,

C++
char[]

memang ada, aku juga bisa melakukannya

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

Masalahnya adalah bagaimana membagi array menjadi nilai individual yang kemudian dapat diunggah ke karakter[]??

Anda mendapatkan gambaran tentang ke mana saya mencoba pergi ke sini…
Saya mencoba menggunakan sensor keseimbangan untuk melaporkan secara akurat jika ‘tekan’ rata (bukan kemiringan lantai) sehingga muggins diberi tugas untuk membuktikannya… sensor keseimbangan kembali (accel_t_gyro.value.z_gyro) yang merupakan kesatuan yang dibuat dari berikut ini:

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

jadi ini memberikan empat digit angka 4988 misalnya. Bagus. LCD yang saya gunakan hanya akan menampilkan satu karakter dalam satu waktu, jika misalnya Anda mengirim ‘4988’ Anda mendapatkan ‘4’ jadi saya berpikir jika saya mengubah int menjadi char[] array Saya dapat menggunakan for() untuk menghitung posisi dan output dari sana

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

Solusi 1

Di C, sebuah karakter[] secara efektif adalah sebuah string: tambahkan nilai null ‘\0’ di bagian akhir dan itu adalah string untuk semua tujuan praktis – ini disebut “string yang diakhiri null”

Untuk menghasilkan output ke string, Anda harus menetapkannya readOut[a] daripada membacanya, dan membagi nilai Anda menjadi karakter – yang tidak sulit tetapi akan bergantung pada input sebenarnya yang disimpan.

Google untuk “C mengkonversi integer ke string” dan “C mengkonversi integer ke string hex” untuk beberapa ide.

Solusi 2

Berdasarkan tipe data yang disajikan, sensor menyimpan hasilnya sebagai bilangan biner dalam bilangan bulat 16-bit. Langkah pertama adalah mencari tahu berapa nilai maksimum dan minimum z_gyro. Jika ternyata nilai 4 digit dengan tanda, setidaknya diperlukan 6 karakter untuk dikonversi menjadi string karakter. Jika buffer readOut dideklarasikan dengan 8 byte, tidak ada salahnya menggunakan panjang string untuk outputnya.
Saya sarankan untuk mengubah nilai integer menjadi string terlebih dahulu. Jika Anda dapat menggunakan perintah C sprintf(), ini mudah:

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

Kemudian gunakan for-loop untuk meneruskan semua karakter satu per satu ke akhir string ke fungsi print().

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

Jika fungsi sprintf() tidak tersedia, itoa() masih dapat dilakukan atau Anda dapat memprogram sendiri konversinya dalam satu putaran.

Dengan tambahan informasi “sprintf, ternyata semua fungsi f (print, scan) tidak ada!” adalah mungkin untuk menulis sendiri fungsi generik sederhana. Ini bisa terlihat seperti ini:

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

Solusi 3

Jika Anda tidak memiliki itoa, Anda bisa menggunakan sprintf(), tapi itu cukup berat untuk tugas ringan. Berikut ini seharusnya cocok untuk Anda

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

Peringatan: parameter buff untuk i2cstr() harus berukuran sesuai. Untuk uint16_t itu 6 karakter, termasuk mengakhiri null.

Solusi 4

Jika hanya perlu menampilkan nilainya, Anda tidak perlu mengonversinya menjadi string terlebih dahulu.

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

di atas, asumsikan itu putchar() mewakili keajaiban apa pun yang perlu Anda lakukan untuk mengirim karakter ke layar.

コメント

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