调试队列结构:“数组下标的类型为‘char’[-Werror=char-subscripts]”

问题描述 投票:0回答:1

我从 GeeksforGeeks 中获取了一些代码,为涉及 4x4 矩阵键盘的 ESP32 项目创建了一个简单的六元素队列,如果队列匹配特定字符串,则应该触发其他事情发生。经过我的修改(主要是将数组大小固定为 6 并将

Dequeue()
函数合并到
Enqueue()
中,因为我不需要单独使用它),它读取为:

const char wildString[] = "3C3421";

// FIFO queue structure for tracking the keys
typedef struct {
    char items[6];
    char front;
    char rear;
} Queue;

void initializeQueue(Queue* q) {
    q->front = -1;
    q->rear = 0;
}

// Check if the queue is full
bool isFull(Queue* q) { return (q->rear == 6); }

// Enqueue an element
void Enqueue(Queue* q, char value) {
    if (isFull(q)) q->front++; // automatically dequeue the front element if full
    q->items[q->rear] = value;
    q->rear++;
}

然后在操作循环中调用:

// create queue to search for string "3C3421"
Queue buffer;    // checks this for if the key sequence is correct
initializeQueue(&buffer);

while(1) {
    char currentChar;
    /* snip code that decodes the keypad GPIO into currentChar */

    // write result to LCD and the buffer
    LCD_writeChar(currentChar);
    Enqueue(&buffer, currentChar);

    // beep if the buffer matches desired string
    if (strcmp(buffer.items, wildString) == 0) {
        xTaskCreate(beep, "beep", configMINIMAL_STACK_SIZE, (void *)3, 5, NULL);
    }
}

但结果是 IDE 在

q->items[q->rear] = value;
处抛出错误,即
array subscript has type 'char'
,我想,嗯,是的,应该是这样,因为
strcmp()
需要一个(是的,它是来自
string.h
的那个) ).

我已经尝试了之前问题中关于对 unsigned char 进行标准化的建议,但这些最终只会引发更多错误,而且 LCD 库函数和字符串函数都需要 char 参数。请提供一点帮助吗?

arrays c char queue esp32
1个回答
0
投票

来自 Jonathan Leffler 的评论:

对前索引和后索引使用无符号字符——这将安全地避免警告。

成功了。在那段时间一直建造。

// FIFO queue structure for tracking the keys
typedef struct {
    char items[6];
    unsigned char front;
    unsigned char rear; 
} Queue;
© www.soinside.com 2019 - 2024. All rights reserved.