Código
typedef struct _GNodo { void *dato; struct _GNodo *sig; } GNodo;
Tengo 3 archivos, el glist.h, glist.c, y main_g.c. Las funciones que tengo son las basicas, que me permiten crear, destruir, agregar final, agregar inicio, y recorrer.
Código
#include "glist.h" #include <stdlib.h> GList glist_crear() { return NULL; } void glist_destruir(GList lista) { GList nodoAEliminar; while (lista != NULL) { nodoAEliminar = lista; lista = lista->sig; } } GList glist_agregar_inicio(GList lista, void* dato) { nuevoNodo->dato = dato; nuevoNodo->sig = lista; return nuevoNodo; } GList glist_agregar_final (GList lista, void* dato) { nuevoNodo->dato = dato; nuevoNodo->sig = NULL; if (lista == NULL) { return nuevoNodo; } GList nodo = lista; for (; nodo->sig != NULL; nodo = nodo->sig); nodo->sig = nuevoNodo; return lista; } void glist_recorrer (GList lista, FuncionVisitante visit) { for (GList nodo = lista; nodo != NULL; nodo=nodo->sig){ visit (nodo->dato); } }
El problema que estoy teniendo, es que ahora no estoy trabajando con listas donde el dato es un int, estoy trabajando con listas donde el dato es un puntero a void. Yo se que el puntero a void puede apuntar a cualquier tipo de dato, pero para poder desreferenciarlo tengo que aplicar el cast correspondiente al tipo de dato que guarda.
Código
int main(){ int a = 3; void *ptr; ptr = &a; return 0; }
Este es el main que tengo:
Código
#include <stdio.h> #include <stdlib.h> #include <string.h> #include "glist.h" static void imprimir_entero(void* dato) { } int main(){ int a = 3; char c = 'a'; double d = 2.3; GList lista = glist_crear(); lista = glist_agregar_inicio (lista, &a); lista = glist_agregar_inicio (lista, &c); lista = glist_agregar_inicio (lista, &d); lista = glist_agregar_final (lista, &a); printf ("%lf %c %d\n", (*(double*)lista->dato),(*(char*)lista->sig->dato),(*(int*)lista->sig->sig->sig->dato) ); //~ printf ("\n %lf", (*(double*)(lista->dato))); glist_recorrer (lista, imprimir_entero); glist_destruir (lista); return 0; }
Como podria hacer para poder saber cual es el tipo de dato al que apunta void. Como podria hacer lo que esta en la linea 20
Código
printf ("%lf %c %d\n", (*(double*)lista->dato),(*(char*)lista->sig->dato),(*(int*)lista->sig->sig->sig->dato) );
de forma general con la funcion imprimir_entero. El primer caso seria con un entero, un double y un char o cadena. Gracias