- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试创建文本文件的精确副本,并且我正在使用循环缓冲区。
我使用的写入方法是:
void addItem(CircularBuffer *cBuff, BufferItem *cbItem) {
cBuff->cBuffItems[cBuff->lastInd] = *cbItem;
cBuff->lastInd = ( ((cBuff->lastInd) + 1) % cBuff->size);
if (cBuff->lastInd == cBuff->startInd)
{
cBuff->startInd = (cBuff->startInd + 1) % cBuff->size; // Overwriting full buffer.
}
}
这是我将每个字符复制到缓冲区的方法:
BufferItem result;
char ch;
while( ( ch = fgetc(fp) ) != EOF ){
result.offset = ftell(fp);
result.data = ch;
addItem(&cBuff, &result);
}
它只写前三个字符,然后给我一个段错误。我确保缓冲区大小足够大,我尝试了不同的数据集,所有数据集都给出相同的结果(仅将前 3 个字符复制到缓冲区中)。
如果我不将其添加到缓冲区,而只打印 result.offset 和 result.data,我会得到我所期望的结果。所以 addItem 一定是问题所在,如果我删除 addItem 中的第二行,它会起作用,但显然它只是覆盖了第一行。
我做错了什么?
这里是循环缓冲区和循环缓冲区的实现:
// Circular buffer items.
typedef struct {
char data ;
off_t offset ;
} BufferItem ;
// Circular buffer
typedef struct {
int startInd; // Index of first element added to buffer.
int lastInd; // Index of most recent element added to buffer.
int size; // Number of elements in circular buffer.
BufferItem *cBuffItems; // Circular buffer items.
} CircularBuffer;
void initializeBuffer(CircularBuffer *cBuff, int size) {
cBuff->cBuffItems = calloc(cBuff->size, sizeof(BufferItem));
cBuff->size = size + 1;
cBuff->startInd = 0;
cBuff->lastInd = 0;
}
就像我提到的,我确实初始化了缓冲区,这是 main 的简化版本:
int main( int argc, char *argv[] )
{
if (argc != 4)
{
printf("Expected 3 arguments, received %d\n", argc - 1);
return 1;
}
int bufSize; // Capacity of BufferItems in circular buffer.
char *file; // Pathname of file to be copied.
char *copy; // Name to be given to the copy.
sscanf(argv[1], "%d", &bufSize);
file = argv[2];
copy = argv[3];
initializeBuffer(&cBuff, bufSize);
// Open file to be copied.
FILE *fp = fopen(file, "r" );
// Create copy file.
FILE *cp = fopen(copy, "w+" ); // Overwrite if file exists.
BufferItem result;
char ch;
while( ( ch = fgetc(fp) ) != EOF ){
result.offset = ftell(fp);
result.data = ch;
addItem(&cBuff, &result);
}
fclose(fp);
fclose(cp);
return 0;
}// Main.
最佳答案
一旦显示初始化代码,问题就清楚了:您在设置之前使用了cBuff->size
。
void initializeBuffer(CircularBuffer *cBuff, int size) {
cBuff->cBuffItems = calloc(cBuff->size, sizeof(BufferItem));
cBuff->size = size + 1;
cBuff->startInd = 0;
cBuff->lastInd = 0;
}
因此,您将使用准随机大小,并获得相应的准随机结果。正如您现在所看到的,正是您最初未显示的代码造成了麻烦 - 这就是为什么我们必须要求看到一个可行的示例!
你可以非常简单地修复它:
void initializeBuffer(CircularBuffer *cBuff, int size) {
cBuff->cBuffItems = calloc(size + 1, sizeof(BufferItem));
cBuff->size = size + 1;
cBuff->startInd = 0;
cBuff->lastInd = 0;
}
这使用参数size
而不是cBuff
的未初始化元素。我建议分配一定数量的元素,然后说有不同数量的元素可供使用,这会引起麻烦。我选择将两个数字加一;但总的来说,最好使用不带增量的 size
值。
您还可以重新排序分配(因此您可以在分配cBuff->cBuffItems
之前设置cBuff->size
);这也可以工作(只要您使分配大小与记录的大小一致。
可以说,您应该检查 calloc()
的结果。
关于C中的循环(ring)缓冲区写入方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24471949/
我想知道 dpdk 是如何绕过内核的。用户空间应用程序如何访问 NIC 空间。 dpdk访问网卡用什么工具?我知道,dpdk 使用 uio_pci_generic 或 igb_uio 或 vfio-p
我一直在学习有关 Windows 驱动程序开发的基础知识,我一直在寻找术语 Ring 0 和 Ring 3。这些是指什么?它们与内核模式和用户模式相同吗? 最佳答案 Linux x86 环使用概述 了
我被引导相信 Pedestal 是 Ring 的替代品,但是从所有示例中我看到 Pedestal 实际上使用了 Ring。这是最令人困惑的!我是否需要了解并了解 Ring 的工作原理才能有效使用 Pe
我复制了一些在 compojure 1.1.18 和其他旧库中工作的旧代码,但使用最新版本我无法让它工作。 这是我的 minimal example code复制自 the minimal examp
为什么 golang 中的列表/环类型为单个项目使用额外的结构 Element/Ring 而不是 interface{} ?我假设有一些好处,但我看不到。 编辑:我的意思是询问 api,而不是关于在实
FileNotFoundException Could not locate ring/util/request__init.class or ring/util/request.clj on cla
使用 Ring 的 Jetty 适配器,如果我的请求太大,我会收到 413: FULL HEAD 错误。我将它追踪到一个名为 headerbuffersize 的属性,但是当我尝试在 run-jett
上下文 我刚刚得到http://blog.jayfields.com/2011/02/clojure-web-socket-introduction.html工作。 我还可以使用ring + comp
我正在尝试创建文本文件的精确副本,并且我正在使用循环缓冲区。 我使用的写入方法是: void addItem(CircularBuffer *cBuff, BufferItem *cbItem) {
void sema_down (struct semaphore *sema) { old_level = intr_disable (); while (sema->value == 0)
我的问题是,如果已经读取了 Ring 请求的正文,我该如何惯用地读取它? 这是背景。我正在为 Ring 应用程序编写一个错误处理程序。当发生错误时,我想记录错误,包括重现和修复错误可能需要的所有相关信
我正在制作一个 Messenger 机器人,并使用 Ring 作为我的 http 框架。 有时我想在机器人发送的消息之间应用延迟。我的期望是使用 Thread/sleep 是安全的,因为这将使事件线程
我在 Emacs 中有以下代码可以删除突出显示区域中的换行符: (defun remove-newlines-in-region () "Removes all newlines in the r
我是 Ring(以及一般的 Clojure 服务器端编程)新手。我有一个基于 Ring 的应用程序,在“开发模式”下运行良好,即它可以监听 localhost:3000 并做出适当的响应。作为部署此应
如何生成监听给定端口的独立环 uberjar ? 开发时,我使用以下 leiningen/ring 命令启动我的应用程序,我可以在其中指定端口: lein with-profile dev ring
我在 Emacs 中有以下代码可以删除突出显示区域中的换行符: (defun remove-newlines-in-region () "Removes all newlines in the r
我有一个任务 - 电话响起时立即更改铃声音量。例如:检测到有来电后,我需要将铃声音量设置为 0(静音),并且还应禁用振动器(如果尚未禁用)。然后当我需要执行另一个代码时会有延迟(startComput
我需要创建带间隙的圆形。 我正在创建一个代表时钟的进度条。 12 个间隙,每个间隙分配给小时数。 这正是我想要实现的目标。 (死星上的外环) 到目前为止,这是我的代码: 在activity.xml
我已经定义了一个简单的环形可绘制对象,将其用作按钮背景。这是我的做法: /> 我在相对布局中使用它,如: round_button 是我定义圆环的 xm
根据这个相关问题(Boost Polygon Serialization)。我正在尝试使用 Boost 序列化多边形。我现在遇到的问题是,我正在尝试使用自定义 X、Y、点的多边形来编译示例,但编译器在
我是一名优秀的程序员,十分优秀!