Newsgroup: it.comp.lang.c
Titolo: problema con liste concatenate

Dunque, ho una lista concatenata i cui elementi possono essere due strutture
completamente diverse. In base alla struttura che incontro devo fare delle
operazioni. Il problema e' che ogni elemento e' allocato dinamicamente e
quindi non riesco a farne il sizeof(). Cioe' attraverso il sizeof volevo
distinguere l'azione da intraprendere. Aggiungere un campo alle strutture
che ne indichi il tipo e' troppo oneroso e non posso farlo.  Come posso
capire con che cosa ho a che fare?
Grazie

 Grazie
Prego
-- 
Of all the things I've lost, my mind is what I miss the most.
                -- Anonymous

Tux wrote:

Devi tenerne traccia tu in modo esplicito.
Potresti usare il trucco usato per i socket: 2 strutture diverse, ma con i
primi N campi in comune, una struttura che contiene solo i campi comuni.
Cast dal puntatore (immagino sia un void *) alla prima struttura generica,
controlli il valore e a seconda del risultato casti a una delle 2 strutture
e intraprendi varie azioni.
Oppure un qualcosa come:
struct maschera {
  int tipo;
  union {
      struct uno Uno;
      struct due Due;
  }
}
O ancora
struct maschera {
  int tipo;
  void *rest;
]
A resto fai puntare un oggetto di tipo "struct uno" o "struct due"... per
sapere a quali punta usi il campo "tipo".
-- 
Mox
"Trust the programmer."
"Don't prevent the programmer from doing what needs to be done."
"Keep the language small and simple."
"Provide only one way to do an operation."

 operazioni.
Hum, postresti emulare una funzione polimorfica:
#include <stdio.h>
#include <stdlib.h>
struct base {
	int (*foo)(struct base *);
        struct base *next;
};
/* Nodo della lista, tipo 1 */
struct node_1 {
	struct base base;
	int a;
	char b;
	double c;
	void *ptr;
};
/* Nodo della lista, tipo 2 */
struct node_2 {
	struct base base;
	double a;
	int b;
};
/* Funzione per manipolare il primo tipo di elemento */
int do_1 (struct base *b) {
	struct node_1 *n = (struct node_1 *)b;
	/* ... */
	printf("Tipo 1\n");
	return n->a;
}
/* Funzione per manipolare il secondo tipo di elemento */
int do_2 (struct base *b) {
	struct node_2 *n = (struct node_2 *)b;
	/* ... */
	printf("Tipo 2\n");
	return n->b;
}
void *new_node(int type) {
	if (type == 1) {
		struct node_1 *n = malloc(sizeof(struct node_1));
		n->base.foo = do_1;
		/* ... */
		return n;
	} else if (type == 2) {
		struct node_2 *n = malloc(sizeof(struct node_2));
		n->base.foo = do_2;
		/* ... */
		return n;
	}
	return NULL;
}
int main() {
	struct base *a, *b;
	b = new_node(1);
        a = new_node(2);
 
	a->foo(a);
	b->foo(b);
	free(a);
	free(b);
 
	return 0;
}
La tua  lista, quindi, conterra` elementi  di tipo /struct base/,  e per
manipolarli usi la  funzione registrata al momento  della creazione (una
sorta di callback). L'overhead e` solo di un puntatore (e una chiamata a
funzione, nel caso non la facessi gia`).
ciao
un Kronos che adoro questi hack ;)
-- 
Home: 
http://kronoz.cjb.net
Tentare e` il primo passo verso il fallimento.
Homer J. Simpson

 primi N campi in comune, una struttura che contiene solo i campi comuni.
Questa possibilitą l'ha esclusa esplicitamente, appunto...
-- 
Make everything as simple as possible, but not simpler.
                -- Albert Einstein

 Hum, postresti emulare una funzione polimorfica:
E' la soluzione naturale in C++.
Stai di fatto aggiungendo un campo alla struttura, soluzione che ha 
esplicitamente già scartato.


 esplicitamente già scartato.
Avevo inteso  che fosse  troppo oneroso  fare il  controllo sul  tipo di
volta in  volta. In ogni caso  un puntatore od  un flag per  indicare il
tipo  della struttura  non  dovrebbero avere  impatti significativi  ne`
sulle performance ne` sull'uso della memoria. Sovraottimizzazione?
ciao
Kronos
-- 
Home: 
http://kronoz.cjb.net
Porc i' mond che cio' sott i piedi!
V. Catozzo

 sulle performance ne` sull'uso della memoria. Sovraottimizzazione?
Ah beh questo lo sa solo l'autore del post originario... 8-)
-- 
You can't wake a person who is pretending to be asleep.
                -- Navajo Proverb