- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我已经尝试在 C 中实现环形缓冲区/循环队列。
它应该通过 argv 获取所有参数,将它们一个一个地插入队列,然后以相同的方式将它们从队列中弹出,并在输出时打印它们。
代码如下:
#include <stdio.h>
#include <stdlib.h>
#include <inttypes.h>
#include <errno.h>
struct buffer
{
int32_t front, rear, capacity, *array;
};
__attribute__ ((noreturn)) void prog_error(const char* str)
{
perror(str);
exit(1);
}
struct buffer *init_queue(int32_t size)
{
struct buffer *queue = malloc(sizeof(struct buffer));
if (!queue)
return NULL;
queue->capacity = size;
queue->front = -1;
queue->rear = -1;
queue->array = malloc(queue->capacity * sizeof(int32_t));
if (!queue->array)
return NULL;
return queue;
}
void enqueue(struct buffer *queue, int32_t x)
{
if (((queue->rear + 1) % queue->capacity == queue->rear))
prog_error("Queue overflow");
queue->rear = (queue->rear + 1) % queue->capacity;
queue->array[queue->rear] = x;
if (queue->front == -1)
queue->front = queue->rear;
}
int32_t dequeue(struct buffer *queue)
{
int32_t data = 0;
if (queue->front == -1)
prog_error("Queue underflow");
data = queue->array[queue->front];
if (queue->front == queue->rear)
queue->front = queue->rear = -1;
queue->front = (queue->front + 1) % queue->capacity;
return data;
}
int main(int argc, char **argv)
{
if (argc < 2)
prog_error("Too few arguments");
int32_t size = (int32_t) argc - 1;
struct buffer *queue;
if (!(queue = init_queue(size)))
prog_error("Allocation error");
for (int32_t i = 1; i < size; ++i)
enqueue(queue, (int32_t) atoi(argv[i]));
for (int32_t i = 0; i < size; ++i)
printf("%" PRId32 "\n", dequeue(queue));
free(queue);
}
但是最后一个值总是被 1 代替。
而且,如果我正好给它 1 个值,那么它会下溢(或者这是环形缓冲区的正常行为?)。我该如何解决这个问题?
最佳答案
循环
for (int32_t i = 1; i < size; ++i)
如果 argc = 2
则不循环
然后,如果您将单个 arg 传递给您的应用程序,则不会在您的队列中插入任何数据,并且
if (queue->front == -1)
由于 init_queue
,dequeue
函数始终为 true
。
同样的事情传递了更多的参数。由于 i=1
的起始值,您总是会跳过参数。
关于c - 环形缓冲区困难,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35199060/
我正在尝试从网站(名称)“抓取”一些数据。我知道如何获得列表中的第一个名字——但我需要以同样的方式保存几千个名字。 这是我的代码: library(rvest) library(tidyverse)
我正在尝试制作一个环形 UIBezierPath 用作 CAShapeLayer 的 path 以下产生一个循环路径: let radius = 100.0 let circularPath = UI
如何在 1 分钟后停止 setTimeout。由于循环,它继续运行。TIA var image1 = new Image() image1.src = "images/slide1.jpg"
我现在这个问题发布了更多次,但我还没有解决我的问题。在我的例子中,foregroundColor 不工作。即使 foregroundColor 没有选择任何颜色,环也不会出现 darkGray 颜色。
public class Tester { // instance variables - replace the example below with your own Scanne
来自澳大利亚的投票问题: 一个机器人会不断地输入信息,它可以达到 1000 行。他将输入的内容示例: "1 2 3 2 1 3 2 3 1 1 2 3 3 1 2 " 我怎么知道他什么时候输入完信息?
有人可以启发如何进行这项工作吗?所以现在我有一个 do/while 循环,里面有一个开关。开关由一个 int 选择处理,scanf 是“%d”。但是,如果我写一个不同于数字的字符符号,如 a、b、c.
我是一名优秀的程序员,十分优秀!