PDA

Visualizza la versione completa : [C] operatore instanceof in C


feys88
09-04-2011, 14:24
esiste un operatore che mi dice il tipo della variabile ?
per esempio in java uso l'operatore instanceof, in C ?.




#include<stdio.h>
void stampaGenericoVar (void *generico);
int main (){

int x=10;
void *generico=&x;
stampaGenericoVar(generico);

char *s="prova operatore instanceof";
generico=s;
stampaGenericoVar(generico);

return 0;
}

void stampaGenericoVar (void *generico){


/* come posso scrivere
if (generico instanceof int) esegui istr.
*/
int *p=generico;
printf("%d",*p);


/* come posso scrivere
if (generico instanceof char) esegui istr.
*/
char *str=generico;
printf("%s",str);
}

Hysoka
09-04-2011, 14:52
credo proprio che tu non possa far nulla...
potrei sbagliarmi, ma nn credo

linoma
09-04-2011, 16:39
Devi organizzare i tuoi dati in modo che un eventuale instanceof possa fare il riconoscimento.



struct{
int i_type;
.
.
.
}


int instanceof(ptr,1){
return (ptr->i_type == 1);
}

MItaly
09-04-2011, 16:57
Il C non ha alcun supporto per la reflection, tutta l'informazione sui tipi cessa di esistere nel momento in cui il compilatore genera l'eseguibile.
Il C++ ha qualcosina in più (metodi virtuali, RTTI), ma comunque nulla a livello della reflection disponibile in Java e .NET (anche se con un uso astuto di overloading e template se ne può fare spesso a meno).

feys88
09-04-2011, 17:18
Originariamente inviato da linoma
Devi organizzare i tuoi dati in modo che un eventuale instanceof possa fare il riconoscimento.



struct{
int i_type;
.
.
.
}


int instanceof(ptr,1){
return (ptr->i_type == 1);
}



Ho capito quindi intendi dichiarare una struttura (per riconoscimento tipi) ciascun tipo è identificato con un numero.
quindi:



typedef struct{
int type_int; // inizializzato nella funzione main a 1
char *type_char; // inizializzato nella funzione main a 2
float type_float; // inizializzato nella funzione main a 3
.
.
.
}Tipo;

void stampaGenericoVar (void *generico,Tipo var){

if (var.type_int==1) {
int *p=generico;
printf("%d",*p);
return;
}
if (var.type_char==2){
char *str=generico;
printf("%s",str);
return;
}
// e cosi via per altri tipi
}



da quanto ho capito anche dalle risposte di altri utenti, l'unico modo per conoscere il tipo della variabile è scrivere il codice in maniera a "macchinosa" per poter scoprire il tipo della variabile.

MItaly
09-04-2011, 23:44
Più che una struct per tipo userei piuttosto un enum.
In realtà il metodo "classico" per gestire un "variant" in C è l'abbinata union+struct+enum:


typedef struct
{
enum
{
t_string,
t_double,
t_int
/* ... */
} t; /* indicazione del tipo */

union
{
char * p_string;
double p_double;
int p_int;
/* ... */
} p; /* payload */
} Variant;

In questo modo con il membro t si specifica il tipo effettivamente memorizzato, e lo si memorizza effettivamente nel relativo membro della union. Il vantaggio della union rispetto alla struct è che essa occupa in tutto lo spazio del più grande membro contenuto (ovviamente si può usare un solo membro alla volta).

Loading