Presentazione e warning if-else

di il
5 risposte

Presentazione e warning if-else

Buonasera a tutti, sono un nuovo utente e questo e' il mio primo post.
Sono un poor man proveniente da anni di programmazione fortran 90 e ho una conoscenza superficiale di C, siate comprensivi
Ho tagliato del tutto il Fortran e mi sono assestato su python e C+, sostanzialmente C con un "travestimento" da C++ (il minimo indispensabile) per poter accedere ad alcune tecnologie che mi servono, come CUDA.
Uso C sostanzialmente per codici semplici di calcolo numerico e algebra lineare (orientata ad AI), anche HPC.

Vengo alla domanda. Ho la necesssita' di implementare un singolo codice che vada bene indifferentemente per reali a 32 o 64 bit, a seconda dei casi. In fase di compilazione passo al preprocessore il numero 32 o 64 tramite l'opzione -D e cosi definisco un tipo real che e' un float o un double:

typedef float real;

int main() {

 real xxx;

 printf("Input x: ");
 if (sizeof(real) ==4){
   scanf("%f", &xxx);
 } else if (sizeof(real) ==8){
   scanf("%lf", &xxx);
 }

}
Il compilatore (ad esempio gcc) non gradisce particolarmente l'idea: compila un eseguibile che funziona, ma mi da' un warning del tipo

test.c:14:13: warning: format ‘%lf’ expects argument of type ‘double *’, but argument 2 has type ‘real *’ {aka ‘float *’} [-Wformat=]
14 | scanf("%lf", &xxx);
| ~~^ ~~~~
| | |
| | real * {aka float *}
| double *
| %f

Vi chiedo se sto sbagliando come idea di fondo e se c'e un modo per eliminare questo tipo di warning.
Grazie anticipatamenteper ogni suggerimento e un saluto a tutti.

5 Risposte

  • Re: Presentazione e warning if-else

    #ifdef
  • Re: Presentazione e warning if-else

    Non so se ho capito il problema ma potresti scrivere
    
    #if _WIN32 || _WIN64
    	#if _WIN64
    		#define IS64BIT
    	#else
    		#define IS32BIT
    	#endif
    #endif
    
    // Check GCC
    #if __GNUC__
    	#if __x86_64__ || __ppc64__
    		#define IS64BIT
    	#else
    		#define IS32BIT
    	#endif
    #endif
    
    #ifdef IS64BIT
    	#define FMT "%lf"
    	typedef double real;
    #else
    	#define FMT "%f"
    	typedef float real;
    #endif
    
    int main()
    {
    	real a = 0;
    	printf("Valore: " FMT "\n", a);
    
    	return 0;
    }
    
    
  • Re: Presentazione e warning if-else

    Grazie mille! Funziona
    Come al solito le risposte migliori sono le piu' semplici...

    Pero' una cosa non capisco, Oregon: come mai scrivi
    printf("Valore: " FMT "\n", a);
    e non
    printf("Valore:  FMT \n", a);
    ?
  • Re: Presentazione e warning if-else

    Se metti FMT tra virgolette verrà visualizzata la parola FMT e non sarà sostituita dalla costante corrispondente, similmente a cosa succede se inserisci tra virgolette il nome di una variabile.
  • Re: Presentazione e warning if-else

    Grazie mille
Devi accedere o registrarti per scrivere nel forum
5 risposte