Visualizzazione dei risultati da 1 a 6 su 6
  1. #1
    Utente di HTML.it
    Registrato dal
    Jul 2009
    Messaggi
    88

    [C] operatore instanceof in C

    esiste un operatore che mi dice il tipo della variabile ?
    per esempio in java uso l'operatore instanceof, in C ?.

    codice:
      #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);
    }

  2. #2
    Utente di HTML.it
    Registrato dal
    Feb 2008
    Messaggi
    813
    credo proprio che tu non possa far nulla...
    potrei sbagliarmi, ma nn credo
    Nell'anno 1968 è bastata la potenza di due Commodore 64 per lanciare con successo una navicella sulla Luna; nell'anno 2007 ci vogliono la potenza di un processore quad core 3.30 GHz e 3 Gb di RAM (requisiti minimi ufficiali) per utilizzare Windows Vista. Qualcosa deve essere andato storto!

  3. #3
    Utente di HTML.it L'avatar di linoma
    Registrato dal
    Mar 2010
    Messaggi
    1,346
    Devi organizzare i tuoi dati in modo che un eventuale instanceof possa fare il riconoscimento.

    codice:
    struct{
        int i_type;
        .
        .
        .
    }
    
    
    int instanceof(ptr,1){
        return (ptr->i_type == 1);
    }
    Per gli Spartani e Sparta usa spartan Il mio github

  4. #4
    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).
    Amaro C++, il gusto pieno dell'undefined behavior.

  5. #5
    Utente di HTML.it
    Registrato dal
    Jul 2009
    Messaggi
    88
    Originariamente inviato da linoma
    Devi organizzare i tuoi dati in modo che un eventuale instanceof possa fare il riconoscimento.

    codice:
    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:

    codice:
    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.

  6. #6
    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:
    codice:
    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).
    Amaro C++, il gusto pieno dell'undefined behavior.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.