簡體   English   中英

C指針和隊列問題

[英]C Issues with pointers and a queue

我正在使用具有以下結構的自寫隊列庫:

#ifndef MYQUEUE_
#define MYQUEUE_

#ifndef SET_QUEUE_SIZE
    #define SET_QUEUE_SIZE 10
#endif

typedef struct queue Queue;

/*
**  Creates and initializes the queue and prepares it for usage
**  Return a pointer to the newly created queue
*/
Queue* QueueCreate();

/*  
**  Add an element of a generic type to the queue
*/
void Enqueue(Queue* queue, void* element);

/*
**  Delete the queue from memory; set queue to NULL
**  The queue can no longer be used unless QueueCreate is called again
*/
void QueueDestroy(Queue** queue);


/*
**  Return the number of elements in the queue
*/
int QueueSize(Queue* queue);

/*
**  Return a pointer to the top element in the queue
*/
void* QueueTop(Queue* queue);

/*
**  Remove the top element from the queue
*/
void Dequeue(Queue* queue);


#endif //MYQUEUE_

現在,我在將其放入循環隊列並從循環隊列中接收數據時遇到了問題。 隊列本身已經過測試,不應出現任何問題。

運行下面的代碼(這是整個程序的一部分),我的兩次打印不會打印出相同的值。 我在哪里指出錯誤?

#include <stdlib.h>
#include <stdio.h>
#include <time.h>

#include "libs/myqueue.h"

struct package{
    unsigned sensorId:12;
    unsigned sequence:4;
    unsigned flag:2;
    unsigned sign:1;
    unsigned value:12;
    unsigned parity:1;
};

typedef struct package packs;

struct sensor_time{
    packs myPack;
    time_t time;
};

typedef struct sensor_time Sensor_Time;

Queue* queue = NULL;

int main(void){
    queue = QueueCreate();
    if(queue == NULL){
        printf("Error creating circular buffer.\n");
        exit(EXIT_FAILURE);
    }

    Sensor_Time * myData = malloc(sizeof(Sensor_Time));
    myData->myPack.sensorId = 1;
    myData->myPack.value = 20;
    myData->time = time(NULL);
    printf("Enqueued: id: %d, value: %d, time: %lu\n", myData->myPack.sensorId, myData->myPack.value, myData->time);

    Enqueue(queue, (void *)myData);

    Sensor_Time * mySens = (Sensor_Time *)QueueTop(queue);
    printf("Data read: id: %d, value: %d time: %lu", mySens->myPack.sensorId, mySens->myPack.value, mySens->time);

    return 1;
}

打印內容:

在此處輸入圖片說明

為了完整起見,這里是隊列實現:

/*----- Include Files -----*/

#include <stdlib.h>
#include <stdio.h>

#include "myqueue.h"

/*-----   Variables   -----*/

typedef void * DATATYPE;

struct queue{
    DATATYPE elements[SET_QUEUE_SIZE];
    size_t count;
    int front;
    int rear;
};
typedef struct queue Queue;
typedef Queue *myQueue;

/*----- QueueCreate   -----*/

Queue* QueueCreate(void){
    #ifdef DEBUG
        printf("QueueCreate called.\n");
    #endif

    Queue* qu = malloc(sizeof(Queue));
    qu->count = 0;
    qu->front = 0;
    qu->rear = 0;
    return qu;
}

/*----- QueueCreate    -----*/

void Enqueue(Queue* queue, DATATYPE element){
    #ifdef DEBUG
        printf("Enqueue called,  on queue %p.", queue);
        int location = queue->rear;
    #endif

    if(queue->count == SET_QUEUE_SIZE){
        printf("Queue is full.\n");
    }else{
        queue->elements[queue->rear] = element;
        queue->count++;
        queue->rear++;
        if(queue->rear == SET_QUEUE_SIZE - 1){
            queue->rear = 0;
        }
    }

    #ifdef DEBUG
        printf(" Element added on location %d.\n", location);
    #endif
}

/*----- QueueDestroy   -----*/

void QueueDestroy(Queue** queue){
    #ifdef DEBUG
        printf("QueueDestroy called on %p\n", queue);
    #endif

    free(*queue);
    *queue = NULL;
}

/*----- QueueSize   -----*/

int QueueSize(Queue* queue){
    #ifdef DEBUG
        if(queue->count > 0){
            printf("QueueSize called. Size is %d.\n", (int)queue->count);
        }
    #endif

    return queue->count;
}

/*----- QueueTop    -----*/

void* QueueTop(Queue* queue){
    #ifdef DEBUG
        printf("QueueTop called\n");
    #endif
    if(queue->count == 0){
        return NULL;
    }else{
        return &(queue->elements[queue->front]);
    }
    return NULL;
}

/*----- Dequeue     -----*/

void Dequeue(Queue* queue){
    #ifdef DEBUG
        printf("Dequeue called on %p.", queue);
        int location = queue->front;
    #endif

    if(queue->count == 0){
        printf("Queue is empty.\n");
    }else{
        queue->front++;
        if(queue->front == SET_QUEUE_SIZE - 1){
            queue->front = 0;
        }
        queue->count--;
    }

    #ifdef DEBUG
        printf(" Removed element was on location %d.\n", location);
    #endif
}

您的隊列存儲類型為void*元素。 但是, QueueTop返回指向第一個元素的指針,這將使其成為void**類型。 函數被聲明為返回void*而不是DATATYPE*的事實使這一點變得混亂,但這是合法的,因為任何指針都可以轉換為void* ,包括雙指針。

將元素添加到隊列時,將其從Sensor_Time *void* 稍后,當調用QueueTop ,您將返回值轉換為Sensor_Time * ,這是錯誤的,因為它實際上是指向指針的指針。

要解決此問題,您需要更改QueueTop以返回一個元素而不是指向該元素的指針,或者更改您的調用代碼以取消對返回的指針的引用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM