n° 219
Novembre 2017
Dicembre 11, 2017, 04:01:14 *
Benvenuto! Accedi o registrati.
Hai dimenticato l'e-mail di attivazione?

Accesso con nome utente, password e durata della sessione
Notizia:
 
   Indice   Linux Windows Techassistance Gameassistance videogame hardware Aiuto Ricerca Agenda Downloads Accedi Registrati  


* Messaggi recenti
Messaggi recenti
Pagine: [1]   Vai giù
  Stampa  
Autore Discussione: " warning: division by zero " che non viene sollevato  (Letto 2466 volte)
0 utenti e 1 Utente non registrato stanno visualizzando questa discussione.
vuott
Newbie
*

Karma: +2/-1
Scollegato Scollegato

Messaggi: 31


Mostra profilo
« inserita:: Agosto 06, 2016, 06:44:44 »

Salve,

vorrei capire perché alla riga:
 fs = ((double)fqsample / (durata / (10000/fq))) / fs;

del seguente codice:

Codice:
#include <stdio.h>


int main() {

   int samplerate = 44100;
   double durata = 1.000;
   double fq = 440.00;
   int fs;


    double byteforp = (double)samplerate / fq;
    int fqsample = samplerate * durata;

printf("1  %d\n", fs);

       fs = ((double)fqsample / (durata / (10000/fq))) / fs;     //  <------------||

printf("2  %d\n", fs);

    return (0);

}
non viene sollevato in fase di compilazione un " warning: division by zero "....
...come se la variabile fs non sia più - in quella posizione: ... / fs - uguale a zero.   Che?!?


Grazie
Registrato
paooolino
Full Member
***

Karma: +16/-10
Scollegato Scollegato

Messaggi: 380

Ideas in programming


Mostra profilo WWW
« Risposta #1 inserita:: Agosto 06, 2016, 08:42:39 »

Scusami, non vorrei dire una fesseria ma io penso che la divisione per zero sia tipicamente un errore che viene sollevato a runtime e non in fase di compilazione... anche perché finché non viene eseguito quel codice il compilatore non sa che valori possono prendere le variabili...
Registrato

vuott
Newbie
*

Karma: +2/-1
Scollegato Scollegato

Messaggi: 31


Mostra profilo
« Risposta #2 inserita:: Agosto 06, 2016, 09:10:22 »

anche perché finché non viene eseguito quel codice il compilatore non sa che valori possono prendere le variabili...
Capisco.


Devo aggiungere al mio primo messaggio che la variabile fs - al termine - assume questo valore: -2147483648  ....che è sostanzialmente uguale alla costante
Codice:
/* Minimum and maximum values a `signed int' can hold.  */
#  define INT_MIN (-INT_MAX - 1)
definita nel file header " /usr/include/limits.h ".
Perché ciò ?
Registrato
paooolino
Full Member
***

Karma: +16/-10
Scollegato Scollegato

Messaggi: 380

Ideas in programming


Mostra profilo WWW
« Risposta #3 inserita:: Agosto 06, 2016, 09:42:52 »

scusa ma fs non lo inizializzi... scrivi

Codice:
int fs;

e poi

Codice:
printf("1  %d\n", fs);

       fs = ((double)fqsample / (durata / (10000/fq))) / fs;     //  <------------||

o manca un pezzo di codice oppure a cosa è uguale quando fai la printf e poi quando lo usi nell'ultima espressione riportata sopra?
Registrato

oregon
Jr. Member
**

Karma: +22/-6
Scollegato Scollegato

Messaggi: 239


Mostra profilo
« Risposta #4 inserita:: Agosto 07, 2016, 01:06:19 »

Il valore di fs è casuale se non viene inizializzata, così come il risultato dell'espressione.

Forse tu pensi, erroneamente, che sia zero.
Registrato
vuott
Newbie
*

Karma: +2/-1
Scollegato Scollegato

Messaggi: 31


Mostra profilo
« Risposta #5 inserita:: Agosto 07, 2016, 01:36:44 »

Il valore di fs è casuale se non viene inizializzata, così come il risultato dell'espressione.

Forse tu pensi, erroneamente, che sia zero.

Va bene, però perché nel primo printf() il valore stampato della variabile fs è sempre zero ?
Pur ponendo la variabile fs come double, il valore stampato dal primo printf() è comunque 0.000000

Puoi chiarirmi, seppur brevemente, quel concetto " è casuale se non viene inizializzata " ?
grazie
Registrato
oregon
Jr. Member
**

Karma: +22/-6
Scollegato Scollegato

Messaggi: 239


Mostra profilo
« Risposta #6 inserita:: Agosto 07, 2016, 08:42:50 »

Capita che sia zero ma non è detto che debba esserlo. Se non lo indichi esplicitamente, è casuale, per te può essere zero per altri un altro valore, anche nello stesso PC, da una esecuzione all'altra. Se vuoi essere sicuro devi scrivere

int fs=0;

Ecco spiegato semplicemente.

Molti compilatori segnalano questo fatto e non fanno neanche avviare il programma, con un messaggio simile

error C4700: uninitialized local variable 'fs' used

Comunque ti consiglio di calcolare tutto con i double, evitando conversioni ed approssimazioni tra interi e double. Vedrai anche che il secondo risultato sarà visualizzato come INF (infinito).

Registrato
vuott
Newbie
*

Karma: +2/-1
Scollegato Scollegato

Messaggi: 31


Mostra profilo
« Risposta #7 inserita:: Agosto 07, 2016, 03:23:26 »

Molto bene.
Ti ringrazio.
Registrato
M.A.W. 1968
** LEGGETE IL REGOLAMENTO ! **
Global Moderator
Hero Member
*****

Karma: +224/-19
Scollegato Scollegato

Messaggi: 2988


Discrete And Combinatorial Mathematics


Mostra profilo WWW
« Risposta #8 inserita:: Agosto 07, 2016, 07:35:53 »

Iniziamo col sottolineare ancora una volta che in nessun caso di normale interesse il valore di una variabile non inizializzata (sia pure static, come vedremo tra qualche riga) è da considerarsi noto a compile time.

Molti compilatori, se autorizzati a farlo dalle relative impostazioni finegrain warning enable rules FWER, daranno quantomeno un warning del tipo:
Warning W8013 [filename] [line]: Possible use of [varname] before definition in function main()

Ambienti avanzati di parsing e checking, dal family tree di Lint ai parser MISRA e AbsInt, segnaleranno invece in maniera assai più pervasiva e dettagliata la presenza di simile grave errore, sia con variabile inizializzata esplicitamente a zero che nel caso opposto di mancata inizializzazione (e in molti altri affini, ma non complichiamo inutilmente la trattazione).

Occorre inoltre sottolineare come solo le variabili automatiche soffrono di tali problemi di mancata inizializzazione, essendo create a runtime nello stack (quantomeno sulle banali architetture mainstream). Per contro, variabili static dichiarate senza essere inizializzate esplicitamente saranno allocate nel segmento BSS (acronimo di Block Started by Symbol, un'arcana nomenclatura la cui origine si perde tra gli assemblatori 2GL e i primi vagiti dei dinosauri IBM nella notte dei tempi informatici), il quale nel 99,9% delle architetture e dei sistemi viene per intero dinamicamente inizializzato a zero al momento del loading. Una banale esemplificazione empirica di tale regola si ottiene compilando ed eseguendo il seguente codice:

Codice:
#include <stdio.h>

int a;

int main()
{
    int b;

    printf("a = %d, b = %d\n", a, b);

    return 0;
}

A tale proposito gli standard del linguaggio sono comunque estremamente chiari e, per una volta, coerenti.  
Registrato

I Moderatori invitano tutti gli utenti a prendere visione del REGOLAMENTO e a rispettarlo.

Un blog? Io? Occhiolino
vuott
Newbie
*

Karma: +2/-1
Scollegato Scollegato

Messaggi: 31


Mostra profilo
« Risposta #9 inserita:: Agosto 09, 2016, 03:52:04 »

Grazie molte M.A.W. per la puntuale spiegazione.
Registrato
Pagine: [1]   Vai su
  Stampa  
 
Vai a:  

Copyright © 2017 Edizioni Master SpA. p.iva : 02105820787

Tutti i diritti di proprietà letteraria e artistica riservati. - Privacy



powered by Simple Machines