int queue_init(Queue *queue) {//initial const uint32_t size = 2; queue->data = (uint8_t*)malloc(sizeof(uint8_t) * size); queue->head = 0; queue->tail = 0; queue->size = size; // If malloc returns NULL (0) the allocation has failed. return queue->data != 0; } /*int queue_is_full(Queue *queue) { return ((queue->tail + 1) % queue->size) == queue->head; }*/ int queue_is_full(Queue *queue) { return ((queue->tail + 1) % queue->size) == (queue->head % queue->size); } int queue_is_empty(Queue *queue) { return queue->tail == queue->head; } int queue_enqueue(Queue *queue, uint8_t item) { if (!queue_is_full(queue)) { queue->data[queue->tail++] = item; queue->tail %= queue->size; return 1; } else { uart_disable(); return 0; } } int queue_dequeue(Queue *queue, uint8_t *item) { if (!queue_is_empty(queue)) { *item = queue->data[queue->head++]; queue->head %= queue->size; return 1; } else { return 0; } }
时间: 2024-04-26 15:20:48 浏览: 116
这段代码是一个简单的队列实现,定义了一个结构体 Queue,包含队列数据、队首、队尾和队列大小等信息。其中,queue_init 函数用于队列初始化,queue_is_full 和 queue_is_empty 函数用于判断队列是否已满或已空,queue_enqueue 和 queue_dequeue 函数用于元素入队和出队操作。值得注意的是,queue_is_full 函数中的计算方式使用了取模运算,避免了队列溢出的问题。另外,在队列已满的情况下,queue_enqueue 函数会禁用串口输出并返回 0,表示入队失败。
相关问题
把这个结构体更改命名为charbuff,并修改下列函数变量typedef struct { uint8_t *data; //!< Array of data, stored on the heap. uint32_t head; //!< Index in the array of the oldest element. uint32_t tail; //!< Index in the array of the youngest element. uint32_t size; //!< Size of the data array. } Queue; Queue charBuf; int queue_init(Queue *queue) { const uint32_t size = 4; queue->data = (uint8_t*)malloc(sizeof(uint8_t) * size); queue->head = 0; queue->tail = 0; queue->size = size; // If malloc returns NULL (0) the allocation has failed. return queue->data != 0; } int queue_is_full(Queue *queue) { return ((queue->tail + 1) == queue->head; } int queue_is_empty(Queue *queue) { return queue->tail == queue->head; } int queue_enqueue(Queue *queue, uint8_t item) { if (!queue_is_full(queue)) { queue->data[queue->tail++] = item; queue->tail %= queue->size; return 1; } else { uart_disable(); return 0; } } int queue_dequeue(Queue *queue, uint8_t *item) { if (!queue_is_empty(queue)) { *item = queue->data[queue->head++]; queue->head %= queue->size; return 1; } else { return 0; } }
如果将结构体重命名为`charbuff`,可以将代码修改为如下形式:
```
typedef struct {
uint8_t *data; //!< Array of data, stored on the heap.
uint32_t head; //!< Index in the array of the oldest element.
uint32_t tail; //!< Index in the array of the youngest element.
uint32_t size; //!< Size of the data array.
} charbuff;
charbuff charBuf;
int queue_init(charbuff *queue) {
const uint32_t size = 4;
queue->data = (uint8_t*)malloc(sizeof(uint8_t) * size);
queue->head = 0;
queue->tail = 0;
queue->size = size;
// If malloc returns NULL (0) the allocation has failed.
return queue->data != 0;
}
int queue_is_full(charbuff *queue) {
return ((queue->tail + 1) == queue->head);
}
int queue_is_empty(charbuff *queue) {
return queue->tail == queue->head;
}
int queue_enqueue(charbuff *queue, uint8_t item) {
if (!queue_is_full(queue)) {
queue->data[queue->tail++] = item;
queue->tail %= queue->size;
return 1;
} else {
uart_disable();
return 0;
}
}
int queue_dequeue(charbuff *queue, uint8_t *item) {
if (!queue_is_empty(queue)) {
*item = queue->data[queue->head++];
queue->head %= queue->size;
return 1;
} else {
return 0;
}
}
```
这样就将结构体重命名为`charbuff`,并将函数参数中的`Queue`类型改为`charbuff`类型。这样做可以使代码更加清晰易懂,减少歧义和误解。同时,也需要将变量名统一修改为`charBuf`。
int queue_init(Queue *queue) { const uint32_t size = 2; queue->data = (uint8_t*)malloc(sizeof(uint8_t) * size); queue->head = 0; queue->tail = 0; queue->size = size; // If malloc returns NULL (0) the allocation has failed. return queue->data != 0; }
这段代码是关于队列初始化的,它通过动态内存分配来为队列分配必要的空间。具体来说,它首先定义了队列的大小为2,然后通过malloc函数分配了一个长度为2的uint8_t类型的数组,即分配了2个字节的空间。接下来,它将队列的头和尾都初始化为0,表示队列为空。最后,它将队列的大小设置为2,即队列最多可以容纳两个元素。如果malloc函数返回的指针为0,即分配空间失败,则返回0,否则返回1。
阅读全文