c - 如何纠正循环数组插入中的索引

标签 c producer-consumer

我正在尝试找到在动态圆形数组中插入前面的公式。我遇到的一个问题是当尝试运行显示时,在这种情况下,前两次插入后的 inx 将关闭,因为有一个未占用的索引。这是假设我遵循选择起始索引的正确方法。

void insertCDAfront(CDA *items,void *val){//insert in the slot prior t         
    assert(items->array!=0);
    if(sizeCDA(items)==0){
        items->array[items->start]=val;
        items->size++;

    }
    else{   

        if(items->size==items->capacity){
            items->capacity=items->capacity*items->factor;
            void **arr=calloc(items->capacity,sizeof(void *));
            assert(arr!=0);
            for(int i=0;i<items->size;i++){
                arr[i]=getCDA(items,i);

            }
            items->array=arr;
            items->start=0;

        }

        items->start=(items->start-1+items->capacity)%items->capacity;
        items->array[items->start]=val;
        items->start=0;

        items->size++;
    }
}


void *getCDA(CDA *items,int index){//
    assert (index<items->size&&index>=0);
    int spot=(items->start+index+items->capacity)%items->capacity;
    return items->array[spot];
}

void displayCDA(FILE *f,CDA *items){
    int i=0;
    if (items->size==0){
        fprintf(f,"("")");
    }
    else if (items->size==1){
        fprintf(f,"(");
        items->display(f,items->array[i]);
        fprintf(f,")");
    }
    else{
        fprintf(f,"%s","(");
        while (i!=items->size-1){     //i!=end
            items->display(f,getCDA(items,i));
            fprintf(f,"%s",",");
            i++;
        }

        items->display(f,getCDA(items,i));
        fprintf(f,"%s",")");
    }
}

最佳答案

听起来你正在尝试制作一个环形缓冲区......这是一个学术起点:

#define PREDETERMINED_ERROR_VALUE  (0)
#define MAX_SIZE                   (100)
int ring_buffer[MAX_SIZE] = {0};
unsigned int head = 0;
unsigned int tail = 0;

void add_item(int new_data)
//!\todo check for overrun
{ring_buffer[head++] = new_data;}

unsigned int get_size_of_ring_buffer(void)
{
unsigned int ret;
if tail <= head
    ret = head - tail;
else
    ret = head + MAX_SIZE - tail;
return (ret);
}

int get_item(void)
{
//!\todo consider returning error code and modifying a param with the data
int ret;
if (tail != head)
    ret = ring_buffer[tail++];
else
    ret = PREDETERMINED_ERROR_VALUE;
return (ret);
}

关于c - 如何纠正循环数组插入中的索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46222508/

相关文章:

c - 尝试为结构中的字符串分配内存时出现段错误

c++ - 一个生产者,两个消费者作用于生产者产生的一个 'queue'

java - 同步实现: Java

c - 使用两个指针在 C 中查找列表是否是非循环的 - 为什么要与 faster->next 进行比较?

c - 将 alpha channel 写入解码的 ffmpeg 帧

c - 循环与其他循环的交互

检查 C 中包含 undefined variable 的关系表达式的有效性

具有消费者完成通知的 Java 生产者消费者模式

c - 生产者/消费者 : 1 producer, 多个消费者 - 1 个信号量、1 个互斥量、1 个条件变量

c# - 需要具有 .NET 4.0 新功能的单一生产者/单一消费者模式示例