Buongiorno a tutti. Partite dal presupposto che sono in fase di apprendimento, per cui il problema che vi pongo sarà per alcuni alquanto stupido; negli ultimi giorni svolgendo alcuni esercizi sulle callback, sono inciampata in errori di compilazione che credo siano dovuti ad errori che faccio nello scrivere le direttive di inclusione al preprocessore, quando si tratta di progetti composti da più moduli. Sbagliare con le direttive di inclusione è sbagliare l'abc proprio, ecco perchè prima di scrivervi ho fatto varie ricerche nei manuali, ma mi è risultato comunque complicato capire gli errori.
Il codice che posto di seguito non ha alcun senso in se per se, ho scritto una porzione di codice esemplificativa (con i medesimi errori di compilazione), per chiedere il vostro aiuto.
main.c
#include <stdio.h>
#include <stdlib.h>
#include "mytype.h"
#include "dataINT.h"
#include "dataFLOAT.h"
#include "libreria.h"
int main(){
int scelta;
TYPE func;
DATO d;
printf("Scegli tipo di dato\n1)Intero\n2)Float\n\n");
scanf("%d",&scelta);
switch(scelta){
case 1:
func=set_INT();
break;
case 2:
func=set_FLOAT();
break;
}
d=lib_init(func);
d=lib_insert(d);
lib_print(d);
system("PAUSE");
return 0;
}
mytype.h
#ifndef MYTYPE_H_INCLUDED
#define MYTYPE_H_INCLUDED
typedef struct funz_type{
void *(*input) (void);
void *(*random) (void);
void (*print) (void*);
//altre callback
}TYPE;
#endif // MYTYPE_H_INCLUDED
libreria.h
#ifndef LIBRERIA_H_INCLUDED
#define LIBRERIA_H_INCLUDED
struct t_dato{
void * dato;
TYPE func;
}t_dato;
typedef struct t_dato * DATO;
DATO lib_init(TYPE f);
DATO lib_insert();
void lib_print(DATO d);
#endif // LIBRERIA_H_INCLUDED
libreria.c
#include <stdio.h>
#include "mytype.h"
#include "libreria.h"
DATO lib_init(TYPE f){
DATO d=(t_dato*)malloc(sizeof(struct t_dato);
d->dato=NULL;
d->func=f;
return d;
}
DATO lib_insert(DATO d){
int scelta;
printf("*** INSERT \n1)Random\n2)Inserisci Manualmente\n\n");
scanf("$d",&scelta);
if(scelta==1)
d->func.random();
else
d->func.input();
return d;
}
void lib_print(DATO d){
d->func.print(d->dato);
return;
}
dataINT.h
#ifndef DATAINT_H_INCLUDED
#define DATAINT_H_INCLUDED
void * inputINT (void);
void * randomINT (void);
void printINT (void * a);
TYPE set_INT();
#endif // DATAINT_H_INCLUDED
dataINT.c
#include <stdio.h>
#include <stdlib.h>
#include "mytype.h"
#include "dataINT.h"
void * inputINT (void){
int *in=malloc(sizeof(int));
printf("Inserisci INTERO: ");
scanf("%d", in);
return in;
}
void * randomINT (void){
int *in=malloc(sizeof(int));
*in= (rand()%100) ;
return in;
}
void printINT (void * a){
int in= *(int*) a;
printf("%d\n", in);
}
TYPE set_INT(){
TYPE f;
f.input=&inputINT;
f.random=&randomINT;
f.print=&printINT;
}
dataFLOAT.h
#ifndef DATAFLOAT_H_INCLUDED
#define DATAFLOAT_H_INCLUDED
void * inputFLOAT (void);
void * randomFLOAT (void);
void printFLOAT (void * a);
TYPE set_FLOAT();
#endif // DATAFLOAT_H_INCLUDED
dataFLOAT.c
#include <stdio.h>
#include <stdlib.h>
#include "mytype.h"
#include "dataFLOAT.h"
void * inputFLOAT (void){
float *in=malloc(sizeof(float));
printf("Inserisci NUMERO CON VIRGOLA: ");
scanf(" %f", in);
return in;
}
void * randomFLOAT (void){
float *in=malloc(sizeof(float));
int k= rand()%100;
*in=rand()%100;
*in=((*in)/k)+k;
return in;
}
void printFLOAT (void * a){
float in= *(float*) a;
printf("%.2f\n", in);
}
TYPE set_FLOAT(){
TYPE f;
f.input=&inputFLOAT;
f.random=&randomFLOAT;
f.print=&printFLOAT;
}
Quello che mi serviva è avere una struttura dati che contenga le callback, la cui definizione sia visibile a diverse librerie.. in questo caso specifico, da "libreria","dataINT", etc.... Ecco perchè ho pensato di inserire la struct in un file a sè, da includere dove mi serve... Quello che ho ottenuto è un macello!
Con questo ordine degli #include nel main ottengo errori di "undefinited reference to..." a tutte le funzioni, ma cambiando l'ordine comunque incorro nel problema che "libreria.h" non vede il tipo "TYPE"..... Per cui non riesco ad uscirne.. help!
Grazie anticipatamente!