我从 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 参数。请提供一点帮助吗?
对前索引和后索引使用无符号字符——这将安全地避免警告。
成功了。在那段时间一直建造。
// FIFO queue structure for tracking the keys
typedef struct {
char items[6];
unsigned char front;
unsigned char rear;
} Queue;