[C] Struct incomplete: un mistero.
Inviato: sab 21 giu 2014, 23:43
Premetto che si tratta solo di una richiesta di spiegazioni, il programma per fortuna funziona perfettamente.
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:
che io in precedenza avevo scritto come
Nella mia versione mi dava come errore "incomplete type error", che con la prima versione non si presenta.
Il punto è che... non capisco il senso della malloc di cui sopra.
Anche perché nella fifo questa malloc
funziona egregiamente.
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
item.c
fifo.h
fifo.c
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);
}