Errore invalid operands of types float and double to binary operator

di il
50 risposte

50 Risposte - Pagina 2

  • Re: Errore invalid operands of types float and double to binary operator

    Edit: oppure leggendo i forum dove posto
  • Re: Errore invalid operands of types float and double to binary operator

    @+m2+

    Da ignorante abituato ai programmini, non ho ancora capito perché inizializzare le variabili dovrebbe essere un accorgimento (non mi riferisco ai puntatori per i quali la motivazione mi è abbastanza chiara).
    Ipotizziamo che io stia implementando un algoritmo che preveda una variabile n a cui verrà assegnato un certo valore x non noto a priori; se io adesso nello scrivere il codice dimentico di assegnare il valore x ad n, sia che la variabile n non sia stata inizializzata sia che la variabile n sia stata inizializzata ad un certo valore, il programma mi darà cmq un risultato errato.
    Da dove nasce quindi l'utilità di inizializzare tutte le variabili? Non so, magari un'inizializzazione strategica potrebbe rivelarsi utile in fase di debugging?

    Altro dubbio... se dichiaro una variabile senza inizializzarla e poi la stampo, devo aspettarmi solo di vedere un valore indefinito oppure anche un crash da parte del programma?
    Situazione diversa sarebbe ovviamente la seguente:
    int a;
    int b = 2 / a;
    in cui il programma ovviamente crasha se alla variabile a viene assegnato in automatico il valore 0.
  • Re: Errore invalid operands of types float and double to binary operator

    .
  • Re: Errore invalid operands of types float and double to binary operator

    Nippolo ha scritto:


    @+m2+

    Da ignorante abituato ai programmini, non ho ancora capito perché inizializzare le variabili dovrebbe essere un accorgimento (...)
    Tranquillo, lo capirai.
    Magari quando i programmi su cui lavori avranno righe a milioni.
    Non a migliaia, quelli sono programmini per dilettanti o nella fascia diciamo delle scuole medie.

    Le cose iniziano a farsi "divertenti" quando la scala aumenta sensibilmente e/o quando, lo ribadisco, si passa dall'hobby al lavoro (quindi i soldi), magari alla stessa incolumità delle persone.

    La versione breve è: è già abbastanza difficile, fare buoni programmi, anche senza complicarsi la vita inutilmente.
    Le buone abitudini vanno coltivate, così come evitate le cattive.

    Vale il parallelo della cintura di sicurezza: nella stragrande maggioranza dei casi non serve, anzi è inutile.
    Porta via addirittura tempo,indossarla, ed è anche scomoda.

    Vale la pena metterla sempre, come "attività automatica" [così non viene dimenticata], non appena saliti, per quel caso tra mille in cui ti salva le natiche?
    Ognuno faccia le sue considerazioni
  • Re: Errore invalid operands of types float and double to binary operator

    Innanzitutto ringrazio entrambi per le risposte.

    @migliorabile
    Ho letto con interesse quanto hai scritto (e non sono ironico), anche se non era esattamente quello che avevo chiesto.
    Quindi, anche se non apprezzi certi post, considera che chi li scrive ha un'esperienza decennale se non ventennale.
    I consigli che vi diamo, NON SONO BUTTATI li a caso, ma risultato di anni ed anni di esperienza.
    Da cosa hai dedotto che non apprezzo certi post?
    Io non sto mettendo affatto in dubbio che è buona pratica inizializzare sempre le variabili, sto semplicemente chiedendo (ormai da 3 post) il motivo...
    Magari alcuni lo considereranno un pregio e altri un difetto, ma io sono abituato a capirle le cose e non a prenderle per vere solo perché me le dice qualcuno di autorevole. Questa filosofia la applico anche a parti invertite, nel senso che io non mi aspetto che la gente mi creda sulla parola, anzi di solito tendo a motivare quello che dico anche se non mi viene chiesto. Ci sono invece persone che la prendono sul personale quando gli vengono chieste spiegazioni (mi è successo molte volte per esempio con medici e professori) e secondo me sbagliano.
    Sai perche' un allievo puo' superare un maestro?
    Perche' se l'allievo segue i consigli del maestro, puo' evitare tutte le strade sbagliate che il maestro a suo tempo ha provato a seguire rendendosi conto solo alla fine che erano sbagliate.
    Con la conseguenza che puo' arrivare prima la' dove e' arrivato il maestro e quindi proseguire per nuove strade.

    Anche lui, a sua volta, percorrera' strade giuste e strade sbagliate, e questa esperienza la potra' passare al prossimo allievo.
    Sono d'accordo, a patto però che venga spiegato il motivo per cui una strada sia sbagliata. Se l'allievo impara nozioni senza allenare minimamente il proprio spirito critico, non credo che andrà molto lontano rispetto ai risultati raggiunti dal proprio maestro.
    Magari non c'entra con l'argomento, ma volevo esprimere un mio pensiero: l'esperienza è sicuramente importante, ma bisogna stare attenti perché a volte può fungere da paraocchi.

    In ogni caso volendo estrapolare una spiegazione da quello che hai raccontato, il motivo dovrebbe essere più o meno quello che ho scritto nel precedente post. Ossia se ci si dimentica di assegnare un valore ad una variabile opportunamente inizializzata in precedenza, la fase di debugging sarà più semplice. Giusto?

    @+m2+

    Ti ringrazio per gli aneddoti, ma non capisco che senso ha girare intorno alla questione con frasi criptiche senza mai arrivare al punto. Come già detto quello che chiedevo è una semplice motivazione, magari corredata da un esempio pratico.
  • Re: Errore invalid operands of types float and double to binary operator

    La motivazione è banale.
    I tuoi programmi conterranno errori.
    che prima o poi dovrai correggere.
    non inizializzare una variabile ed utilizzarla supponendo che abbia un certo valore (esempio come check di un ciclo) è un errore frequente.
    while qualcosa do resto
    Abbastanza chiaro?
    Totale = totale + valore
    Ancora meglio?

    ---
    Esistendo l'halting problem devi sempre guardare col massimo sospetto il tuo codice, perché la probabilità che sia sbagliato è pressoché 1.
    E se è sbagliato, perché lo è? Perché sei umano, e quindi sbaglierai.
    Dove e come? Non so, ma di sicuro lo farai
  • Re: Errore invalid operands of types float and double to binary operator

    Nippolo ha scritto:


    sto semplicemente chiedendo (ormai da 3 post) il motivo...
    C'è un esempio nella mia risposta a giuli piu' su. Allora, il motivo è, in poche parole, che una variabile locale viene "allocata" semplicemente abbassando lo stack pointer esp (o, in x64, rsp). All'entrata di una procedura trovi tipicamente questo (si chiama "stack frame"):
    push ebp
    mov ebp, esp
    sub esp, 10h
    L'istruzione sub esp, 10h "crea" uno spazio per 10h (=16 dec) bytes di variabili locali, per esempio 4 int32. Il problema è che non fa altro: il contenuto della memoria fra esp e esp+10h resta sempre lì. E lo stack è già stato utilizzato prima, o da te stesso, o da Windows, quindi può contenere un qualsiasi valore. Perciò, se vuoi utilizzare una variabile locale, devi per forza metterci dentro tu questo valore, che sia zero o altro. Se lo dimentichi, hai un bug che è difficilissimo a scoprire.

    Per fortuna, un compiler intelligente controlla se hai utilizzato una variabile locale senza inizzializzarla, e ti dà un avviso. Ovviamente, se il programma ha un milione di righe, e il compiler sputa fuori tanti warnings, può capitare che non vedi questo avviso. Quindi, i colleghi qua che scrivono ogni giorno programmi con milioni di righe hanno un po' ragione quando ti consigliano di inizzializare sempre.
  • Re: Errore invalid operands of types float and double to binary operator

    @Nippolo ...

    Non ti è mai capitato di calcolare un totale e visualizzarlo alla fine di una funzione?
    Ora supponi che sia un totale di euro relativo ad un pagamento di qualcosa e che questo totale sia 525.
    L'amministrazione paga e tanti saluti ma il totale è viziato dal fatto che la variabile totale non era inizializzata e in quel momento valeva 28 (un errore minimo ma non è questo l'importante).
    E se parliamo di un programma che elenca valori medici relativi all'esame xyz, fatto con tante operazioni e che dà come risultato 12,97 solo perché una variabile non era stata inizializzata (magari doveva partire da 1 ...) con conseguenze sulla salute?

    Gli esempi sono ovvi, ma trovare il problema in programmi del genere risulterebbe molto complesso perché non hai un errore evidente finché non hai TANTI pagamenti sbagliati o TANTI pazienti con problemi.

    Tutto questo, con danni economici (e penali) per non avere inizializzato correttamente le variabili.
  • Re: Errore invalid operands of types float and double to binary operator

    Nippolo ha scritto:


    l'esperienza è sicuramente importante, ma bisogna stare attenti perché a volte può fungere da paraocchi.
    Generalmente accade proprio il contrario.
    L'assenza di esperienza fa operare col paraocchi.
    Perchè l'esperienza non è altro che la somma degli errori che hai fatto, e dai quali (si spera) hai imparato.
    Il mondo informatico è, lo ribadisco, già abbastanza complicato e difficile, di suo, per potersi permettere il "lusso" di non eliminare ogni possibile fonte di rischio (grande o piccola che sia), qualora possibile a costo zero.

    Ripropongo il classico esempio che ho già postato su questo forum (e che rappresenta proprio uno dei casi tipici, ne ho altri 1000 "in canna", ben più complicati. questo comunque ha il pregio della concisione)
    Come giudichi queste due porzioni di codice
    A
    
      char lamiapassword[10];
      int flagsonoamministratore;
    (...resto del codice...)
    
    
    B
    
      int flagsonoamministratore;
      char lamiapassword[10];
    (...resto del codice...)
    
    1) equivalenti
    2) meglio A
    3) meglio B
    ?
  • Re: Errore invalid operands of types float and double to binary operator

    +m2+ ha scritto:


    1) equivalenti
    2) meglio A
    3) meglio B
    ?
    1) equivalenti se riesci a limitare l'input a 10 byte. Se non ci riesci, tutte le scelte sono sbagliate.
  • Re: Errore invalid operands of types float and double to binary operator

    jj2007 ha scritto:


    +m2+ ha scritto:


    Se non ci riesci, tutte le scelte sono sbagliate.
    @jj ... Se non ci riesci devi capire in quale caso si può sporcare il flag e in quale no
  • Re: Errore invalid operands of types float and double to binary operator

    Se non ci riesci sei comunque nei guai per un buffer overflow, quindi ci devi riuscire e basta.

    Strano che discutiamo una cosa che ovviamente sarebbe un fat bug. In questo thread disputiamo l'utilità di inizializzare variabili locale - "errore" innocuo perché produce una warning del compiler se, e solo se, la variabile viene utilizzata. Dubito, pero', che il compiler se ne accorge del rischio di un char lamiapassword[10];
  • Re: Errore invalid operands of types float and double to binary operator

    jj2007 ha scritto:


    Se non ci riesci sei comunque nei guai per un buffer overflow, quindi ci devi riuscire e basta.
    Un buffer overflow senza altre conseguenze e un buffer overflow con la conseguenza immediata di diventare "amministratore" dell'applicazione, sono cose diverse. Si tratta di adottare una strategia "difensiva" programmando.
  • Re: Errore invalid operands of types float and double to binary operator

    non inizializzare una variabile ed utilizzarla supponendo che abbia un certo valore (esempio come check di un ciclo) è un errore frequente.
    while qualcosa do resto
    Abbastanza chiaro?
    Totale = totale + valore
    Ancora meglio?
    C'è un esempio nella mia risposta a giuli piu' su.
    Non ti è mai capitato di calcolare un totale e visualizzarlo alla fine di una funzione?
    Ora supponi che sia un totale di euro relativo ad un pagamento di qualcosa e che questo totale sia 525.
    L'amministrazione paga e tanti saluti ma il totale è viziato dal fatto che la variabile totale non era inizializzata e in quel momento valeva 28 (un errore minimo ma non è questo l'importante).
    E se parliamo di un programma che elenca valori medici relativi all'esame xyz, fatto con tante operazioni e che dà come risultato 12,97 solo perché una variabile non era stata inizializzata (magari doveva partire da 1 ...) con conseguenze sulla salute?
    Forse mi sono spiegato io male...
    In questi casi è ovvio che si esegue una dichiarazione con inizializzazione, perché la variabile in questione viene utilizzata prima di un'assegnazione che riguarda la stessa variabile.
    Mi riferivo invece a qualcosa del genere:
    int n;
    cin >> n;
    funzione(n);
    Ok che è buona pratica inizializzare le variabili, ma con quale criterio dovrei scegliere il valore con cui inizializzare n?

    Per quanto riguarda la questione sulle porzioni di codice A e B mi astengo, perché sono argomenti che non ho mai trattato (mi sono avvicinato alla programmazione per gioco, non ho mai studiato informatica seriamente).
  • Re: Errore invalid operands of types float and double to binary operator

    .
Devi accedere o registrarti per scrivere nel forum
50 risposte