Peut-être qu'il n'y a aucun moyen de résoudre ce la façon dont je l'aime mais je ne sais pas tout si je ferais mieux de demander ...Problème avec tableau dynamique structure de données de file d'attente avec pointeur vide
Je l'ai mis en place un File d'attente simple avec un tableau dynamique pour que l'utilisateur puisse s'initialiser avec le nombre d'éléments souhaité. J'essaie également d'utiliser un pointeur void
pour autoriser tout type de données, mais c'est le problème.
Voici mon code:
typedef void * QueueValue;
typedef struct sQueueItem {
QueueValue value;
} QueueItem;
typedef struct sQueue {
QueueItem *items;
int first;
int last;
int size;
int count;
} Queue;
void queueInitialize(Queue **queue, size_t size) {
*queue = xmalloc(sizeof(Queue));
QueueItem *items = xmalloc(sizeof(QueueItem) * size);
(*queue)->items = items;
(*queue)->first = 0;
(*queue)->last = 0;
(*queue)->size = size;
(*queue)->count = 0;
}
Bool queuePush(Queue * const queue, QueueValue value, size_t val_sz) {
if(isNull(queue) || isFull(queue)) return FALSE;
queue->items[queue->last].value = xmalloc(val_sz);
memcpy(queue->items[queue->last].value, value, val_sz);
queue->last = (queue->last+1) % queue->size;
queue->count += 1;
return TRUE;
}
Bool queuePop(Queue * const queue, QueueValue *value) {
if(isEmpty(queue)) return FALSE;
*value = queue->items[queue->first].value;
free(queue->items[queue->first].value);
queue->first = (queue->first+1) % queue->size;
queue->count -= 1;
return TRUE;
}
Le problème se trouve sur la fonction queuePop
. Quand je l'appelle, je perds la valeur parce que je la libère tout de suite. Je n'arrive pas à résoudre ce dilemme. Je veux que ma bibliothèque soit générique et modulaire. L'utilisateur ne devrait pas se préoccuper de l'allocation et de la libération de la mémoire, c'est le travail de la bibliothèque.
Comment l'utilisateur peut-il toujours obtenir la valeur de queuePop
et laisser la bibliothèque gérer toutes les allocations/libérations de la mémoire?
Il n'y a absolument aucune raison pour que le paramètre 'value' de' filePop() 'soit de type' QueueValue **' - il suffit d'avoir 'QueueValue' (pointeur vers l'emplacement où l'élément sera copié). – caf
@caf - Vous avez raison, il ne me restait plus qu'une approche précédente, où 'filePop()' a fait un nouveau 'malloc()'. Je vais ajouter un commentaire. – egrunin