我有一个设置长度的队列,实现为像这样实现的动态c数组:
typedef struct {
float* queue;
int size;
int pointer;
} QueueStruct;
void createQueue(QueueStruct* queueInstance, int size){
queueInstance->queue = malloc(sizeof(float)*size);
queueInstance->size = size;
queueInstance->pointer = 0;
}
void addElementToQueue(QueueStruct* queueInstance,float element){
queueInstance->queue[pointer] = element;
if (queueInstance->pointer == queueInstance.size - 1){
queueInstance->pointer = 0;
} else {
++queueInstance->pointer;
}
}
void freeQueue(QueueStruct* queueInstance){
free(queueInstance->queue);
}
我想实现这个功能:
float* returnQueue(QueueStruct queueInstance){
//I want this function to malloc a new float* and then put the queue in it in the
// correct order, from start to finish, as pointed too by the pointer.
//Im not sure how to do this.
}
任何帮助都将不胜感激。
编辑:纠正了一个愚蠢的编程错误 - 这是我程序中实际内容的简化版本。
答案 0 :(得分:2)
让我们看看我是否做对了。
float* returnQueue(QueueStruct *queueInstance){
int j = 0;
float *ret = malloc(sizeof(float)*queueInstance->size); //Allocates the memory you want.
//Copies the elements from pointer to End into the new buffer (assumes, that the array has been filled at least once, add a marker to make sure)
if(queueInstance->FilledOnce) { //Marker variable, explanation as above.
for(int i = queueInstance->pointer; i < queueInstance->size; ++i, ++j)
ret[j] = queueInstance->queue[i];
}
//Copies the newest elements (from beginning to pointer) into the buffer.
for(int i = 0; i < queueInstance->pointer; ++i, ++j)
ret[j] = queueInstance->queue[i];
return ret; //Returns the code in question.
}
要使此代码正常工作,您必须在结构中添加“FilledOnce”,并修改“添加”代码,如下所示:
void addElementToQueue(QueueStruct* queueInstance, float element){
queueInstance->queue[queueInstance->pointer] = element;
if (queueInstance->pointer == queueInstance.size - 1){
queueInstance->pointer = 0;
queueInstance->FilledOnce = 1;
} else {
++queueInstance->pointer;
}
}
我还建议你,一旦完成变量就重置你的变量。
void freeQueue(QueueStruct* queueInstance){
free(queueInstance->queue); //Frees the queue
queueInstance->queue = NULL; //Nulls the reference
queueInstance->FilledOnce = 0;
queueInstance->pointer = 0;
queueInstance->size = 0;
}
这样,如果重用结构,就不会遇到尝试访问未分配内存的问题。请务必检查这些变量。
我希望这会有所帮助。
答案 1 :(得分:0)
我认为你也应该为你的结构分配内存。 你已经创建了struct的指针但是忘了为该结构分配内存
使用QueueStruct queuestruct = malloc(sizeof(Queuestruct))
然后当你将它传递给上面的任何函数时,你可以轻松分配 队列poiter的内存,您可以在其中存储队列数组的元素
答案 2 :(得分:-1)
此实施不足。一个pointer
变量给我们一个队列尾部的位置,但是什么指向它的头部?