Ho un dubbio che mi attanaglia la mente sulle struct incomplete.
Praticamente ho creato un ADT FIFO costituito da oggetti Item, anch'essi astratti.
(Item è composto da una stringa e un intero).
Non capisco come si faccia a risolvere un problema di "tipo incompleto".
Nel file item.c c'è questo pezzo di codice suggeritomi da un amico:
Codice: Seleziona tutto
i = (Item) malloc (sizeof(*i));
Codice: Seleziona tutto
i = (Item *) malloc (sizeof(Item));
Il punto è che... non capisco il senso della malloc di cui sopra.
Anche perché nella fifo questa malloc
Codice: Seleziona tutto
queue = (Queue *) malloc (sizeof(Queue));
Il mio amico non è stato in grado di farmi capire niente, probabilmente ha solo copincollato da qualche sorgente.
Qualcuno sa darmi una spiegazione?
Allego sotto i listati.
Grazie in anticipo!
item.h
Codice: Seleziona tutto
#ifndef ITEM_H_INCLUDED
#define ITEM_H_INCLUDED
#define MAXBUF 100
#define MAXSTRING 20
#define FAILURE 0
#define SUCCESS 1
typedef struct ItemStruct *Item;
Item ItemGet();
void printItem (Item item, FILE *fp);
#endif // ITEM_H_INCLUDED
Codice: Seleziona tutto
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "item.h"
struct ItemStruct
{
char word[MAXSTRING];
int number;
};
Item ItemGet()
{
Item i;
char buf[MAXBUF];
i = (Item) malloc (sizeof(*i));
if (i == NULL)
{
fprintf ( stderr, "Error: insufficient memory for new element.\n");
return NULL;
}
fgets(buf, MAXBUF, stdin);
sscanf(buf, "%s %d", i->word, &i->number);
return i;
}
void printItem (Item item, FILE *fp)
{
fprintf(fp, "%s %d\n", item->word, item->number);
}
Codice: Seleziona tutto
#ifndef FIFO_H_INCLUDED
#define FIFO_H_INCLUDED
#include "item.h"
typedef struct QueueStruct Queue;
Queue *QueueInit(int size);
int QueueEmpty(Queue *queue);
void QueuePut(Queue *queue, Item item);
Item QueuePush(Queue *queue);
void QueuePrint(Queue *queue, FILE *fp);
void QueueFree(Queue *queue);
#endif // FIFO_H_INCLUDED
Codice: Seleziona tutto
#include <stdio.h>
#include <stdlib.h>
#include "fifo.h"
struct QueueStruct
{
Item *q;
int N;
int head;
int tail;
};
/*
* QueueInit (int size)
*
* Create a queue of size [Size+1].
*
*/
Queue *QueueInit(int size)
{
Queue *queue;
queue = (Queue *) malloc (sizeof(Queue));
if (queue == NULL)
{
fprintf ( stderr, "Error: insufficient memory for new element.\n");
return NULL;
}
queue->q = (Item *) malloc (sizeof(Item) * (size+1));
if(queue == NULL)
{
fprintf ( stderr, "Error: insufficient memory for new queue.\n");
free(queue);
return NULL;
}
queue->N = size+1;
queue->head = queue->N;
queue->tail = 0;
return queue;
}
/*
* QueueEmpty()
*
* Checks if the queue is Empty.
*
*/
int QueueEmpty(Queue *queue)
{
return queue->head % queue->N == queue->tail;
}
void QueuePut(Queue *queue, Item item)
{
if ( (queue->tail + 1) != queue->head)
{
queue->q[queue->tail++] = item;
queue->tail = queue->tail % queue->N;
}
else
fprintf(stdout, "Full queue! Data not inserted.\n");
}
Item QueuePush(Queue *queue)
{
queue->head = queue->head % queue->N;
return queue->q[queue->head++];
}
void QueuePrint(Queue *queue, FILE *fp)
{
int i;
for(i=queue->head % queue->N; i !=queue->tail; i++)
printItem (queue->q[i], fp);
}
void QueueFree(Queue *queue)
{
int i;
for(i=queue->head % queue->N; i !=queue->tail; i++)
free(queue->q[i]);
free(queue->q);
free(queue);
}