Tách một số nguyên thành một chuỗi (không được giải thích rõ ràng nhưng …)

lập trình


Chào mọi người,
Điều này đang được sử dụng như cách tôi thực hiện bài tập tư duy này.
Tôi có một liên kết trả về giá trị từ cảm biến Cân bằng. Hoạt động tốt trên màn hình nối tiếp nhưng tôi đang cố gắng hiển thị nó trên LCD, một số thử nghiệm xung quanh đã cho thấy chức năng hiển thị

C++
lcd.print()

sẽ chỉ in một ký tự duy nhất ra màn hình.

Những gì tôi đã thử:

Chuyển đổi đầu ra của liên minh thành chuỗi, vấn đề là chuỗi không tồn tại trên hệ thống này,

C++
char[]

tồn tại, vậy tôi có thể làm được không

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

Vấn đề là làm thế nào để chia mảng thành các giá trị riêng lẻ mà sau đó có thể tải lên char[]??

Bạn hiểu ý tưởng về nơi tôi đang cố gắng đi đến đây …
Tôi đang cố gắng sử dụng cảm biến cân bằng để báo cáo chính xác xem ‘nhấn’ có cân bằng hay không (đó không phải là độ dốc của sàn) nên muggins được giao nhiệm vụ chứng minh điều đó… cảm biến cân bằng trả về (accel_t_gyro.value.z_gyro) đó là một liên minh được thực hiện từ những điều sau đây:

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

vì vậy nó cho một số có bốn chữ số 4988 chẳng hạn. Khỏe. Màn hình LCD tôi đang sử dụng sẽ chỉ hiển thị một ký tự mỗi lần, ví dụ: nếu bạn gửi ‘4988’, bạn sẽ nhận được ‘4’ vì vậy tôi đang suy nghĩ liệu tôi có chuyển đổi int thành char không[] mảng tôi có thể sử dụng for() để đếm các vị trí và đầu ra từ đó

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

Giải pháp 1

Trong C, một char[] thực chất là một chuỗi: thêm giá trị null ‘\0’ vào cuối và đó là một chuỗi cho tất cả các mục đích thực tế – chúng được gọi là “các chuỗi kết thúc null”

Để xuất ra chuỗi, bạn phải gán cho readOut[a] thay vì đọc từ nó và chia giá trị của bạn thành các ký tự – điều này không khó nhưng sẽ phụ thuộc vào nội dung đầu vào thực sự được lưu trữ.

Google cho “C chuyển đổi số nguyên thành chuỗi” và “C chuyển đổi số nguyên thành chuỗi thập lục phân” để biết một số ý tưởng.

Giải pháp 2

Theo các loại dữ liệu được trình bày, cảm biến lưu trữ kết quả dưới dạng số nhị phân trong số nguyên 16 bit. Bước đầu tiên là tìm ra giá trị tối đa và tối thiểu của z_gyro là bao nhiêu. Nếu nó là giá trị gồm 4 chữ số có dấu thì cần ít nhất 6 ký tự để chuyển đổi thành chuỗi ký tự. Nếu bộ đệm readOut được khai báo bằng 8 byte thì việc sử dụng độ dài chuỗi cho đầu ra sẽ không có hại gì.
Tôi khuyên bạn nên chuyển đổi giá trị số nguyên thành chuỗi trước. Nếu bạn có thể sử dụng lệnh C sprintf() thì việc này thật dễ dàng:

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

Sau đó, sử dụng vòng lặp for để chuyển tất cả các ký tự riêng lẻ đến cuối chuỗi vào hàm print().

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

Nếu hàm sprintf() không có sẵn, itoa() vẫn có thể thực hiện được hoặc bạn có thể tự mình lập trình chuyển đổi theo vòng lặp.

Với thông tin bổ sung “sprintf, trên thực tế tất cả các chức năng f (in, quét) không tồn tại!” bạn có thể tự mình viết một hàm tổng quát đơn giản. Nó có thể trông như thế này:

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

Giải pháp 3

Nếu bạn không có itoa, bạn có thể sử dụng sprintf(), nhưng nó khá nặng đối với một tác vụ nhẹ như vậy. Những điều sau đây sẽ phù hợp với bạn

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

Hãy cẩn thận: tham số buff đối với i2cstr() phải có kích thước phù hợp. Đối với uint16_t đó là 6 ký tự, bao gồm cả kết thúc nul.

Giải pháp 4

Nếu chỉ cần xuất giá trị thì trước tiên bạn không cần chuyển đổi thành chuỗi.

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

ở trên, giả sử rằng putchar() đại diện cho bất kỳ phép thuật nào bạn cần thực hiện để gửi char đến màn hình.

コメント

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