2

次のように実装された動的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.
}

どんな助けでもいただければ幸いです。

編集:ばかげたプログラミングの間違いを修正しました-これは私のプログラムに実際にあるものの単純化されたバージョンです。

4

3 に答える 3

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」を追加し、「Add」コードを次のように修正する必要があります。

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;
}

このように、構造体を再利用する場合、割り当てられていないメモリにアクセスしようとする問題に遭遇することはありません。これらの変数を必ず確認してください。

これがお役に立てば幸いです。

于 2012-08-30T12:17:19.237 に答える
0

構造体にもメモリを割り当てる必要があると思います。構造体のポインタを作成しましたが、その構造体にメモリを割り当てるのを忘れました

QueueStructを使用するqueuestruct=malloc(sizeof(Queuestruct))

次に、これを上記の関数のいずれかに渡すと、キュー配列の要素を格納できるキューポイターにメモリを簡単に割り当てることができます。

于 2012-08-30T12:24:12.587 に答える
-1

この実装は不十分です。変数はキューのpointerテールの位置を示しますが、そのヘッドを指すものは何ですか?

于 2012-08-30T12:17:21.957 に答える