Newsgroup: it.comp.lang.c
Titolo: lista di strutture dati

Ciao a tutti,
ho il seguente problema in c.
Ho una serie di tipi complessi che rappresentanto degli "oggetti"
typedef struct messaggio {}
typedef struct condizione {}
quello che mi servirebbe è creare una struttura dati (parliamo ad esempio
di lista) che possa contenerli entrambi, ovviamente senza dover scrivere
le varie funzioni due volte.
Quello che ho pensato è creare una lista di puntatori  a void {void*
element;*void next}
la cosa che non mi è chiara è come passare il parametro da confrontare
per le varie operazioni.
qualcuno sa darmi un input?
grazie
Fabio

 qualcuno sa darmi un input?
Qualcosa tipo
struct _elem
{
   struct _elem* next;
   int type;
   void* structP;
};
dove type e' un intero che ti permette di distinguere tra la struttura
messaggio e condizione?
HTH
C:\>iao Angelo
-- 
Posted via Mailgate.ORG Server - 
http://www.Mailgate.ORG

 qualcuno sa darmi un input? grazie Fabio
L'idea  di una  lista di  puntatori a  void non  e`, come  dicevo prima,
errata ...  non e` pero`  l'unica strada possibile;  qui di sotto  ti ho
scritto un breve programmino utilizzando una union.
#include <stdio.h>
#include <stdlib.h>
/* giusto per comodita` ... */
#define __add_message(x,y)      __add_member(DATA_MESSAGE, x, y)
#define __add_condition(x,y)    __add_member(DATA_CONDITION, x, y);
/* numero di items */
#ifndef NITEMS
# define NITEMS         5
#endif
/* struttura di esempio per i messaggi */
struct my_message
{
  char a;
  int b;
};
typedef struct my_message message_t;
/* struttura di esempio per la condizione */
struct my_condition
{
  long c;
  short d;
  int e;
};
typedef struct my_condition condition_t;
/* definizione della lista */
typedef struct my_cell *cell_t;
 
struct my_cell
{
  /*
  il numero di bit e` in funzione di quanti tipi di messaggi
  puoi avere
  */
  unsigned int type:1;
 
  union
  {
    message_t message;
    condition_t condition;
  } data;
  cell_t next;
};
/* definizione dei tipi di messaggi */
enum cell_type
{
  DATA_CONDITION,
  DATA_MESSAGE
};
typedef enum cell_type type_t;
/* aggiunge un membro alla lista */
static __inline__ int __add_member(type_t type, void *ptr, cell_t *list)
{
  cell_t curr = NULL, scan = NULL;
 
  if ((curr = malloc(sizeof(struct my_cell))) == NULL)
    return 0;
 
  /* si ... non e` proprio canonico ... ;P */
  (void)memcpy(&curr->data, ptr, sizeof(curr->data));
  curr->type = type;
  curr->next = NULL;
 
  if (*list != NULL)
  {
    /* solito inserimento in coda */
    for(scan = *list; scan->next != NULL; scan = scan->next);
    scan->next = curr;
  }
 
  else
    *list = curr;
 
  return 1;
}
/* libera tutta la memoria allocata per la lista */
static __inline__ void __destroy_queue(cell_t *list) 
{
  if (*list != NULL) 
  {
    __destroy_queue(&(*list)->next);  
    free(*list);
 
    *list = NULL;
  } 
}
/* stampa il contenuto della lista */
static __inline__ void __print(cell_t list) 
{
  int i;
 
  for (i = 1; list != NULL; list = list->next, i++)
  {
    (void)fprintf(stdout, "\nItem: %d - message type: %s\n",
                  i, list->type ? "MESSAGE" : "CONDITION");
 
    if (list->type)
      (void)fprintf(stdout, "a = %c && b = %d\n",
                    list->data.message.a, list->data.message.b);
 
    else
      (void)fprintf(stdout, "c = %ld && d = %d && e = %d\n",
                    list->data.condition.c, list->data.condition.d,
                    list->data.condition.e);
  }
}
/* main di esempio */
int main(void)
{
  int i;
  cell_t list = NULL;
 
  /* una coda ipotetica di condizioni */
  condition_t cond_queue[NITEMS] =
  {
    { 3000,  6, -1},
    { 6000, 12, -2},
    { 9000, 18, -3},
    {12000, 24, -4},
    {15000, 30, -5}
  };
 
  /* una coda ipotetica di messaggi */
  message_t mes_queue[NITEMS] =
  {
    {'a', 1}, 
    {'b', 2},
    {'c', 3},
    {'d', 4}, 
    {'e', 5}
  };
 
  /* riempi la lista */
  for (i = 0; i < NITEMS; i++)
  {
    /* controlla i valori di ritorno */
    __add_message(&mes_queue[i], &list);
    __add_condition(&cond_queue[i], &list);
  }
 
  /* stampa la lista */
  __print(list);
 
  __destroy_queue(&list);
  return 0;
}
Ciao.
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it