Pagina 1 di 3 1 2 3 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 24
  1. #1

    Spiegatemi questo programma

    codice:
    /*
    
    Temperatura media, escursione termica e scostamento medio
    
    di una serie di temperature rilevate in una località
    
    Le temperature sono state rilevate ogni 2 ore
    
    */
    
    #include <stdio.h>
    
    #define RILEVAZ 12 /*1*/
    
    void rilevaTemp(int *t); /*2*/
    
    void aggiorna(int *t,int *st,int *tmn,int *tmx); /*2*/
    
    float scostMed(int *t,float mt); /*2*/
    
    main(){
    
    int temp[RILEVAZ],tempMax,tempMin,escur;
    
    float medTemp,medSco;
    
    int sommaTemp;
    
    /* Acquisizione temperature rilevate */
    
    rilevaTemp(temp); /*3*/
    
    /* Calcolo media e ricerca massimo e minimo */
    
    sommaTemp = tempMin = tempMax = temp[0];
    
    aggiorna(temp,&sommaTemp,&tempMin,&tempMax); /*4*/
    
    medTemp = (float) sommaTemp/RILEVAZ; /*5*/
    
    /* Calcolo escursione termica */
    
    escur = tempMax-tempMin;
    
    /* Scostamento medio */
    
    medSco = scostMed(temp,medTemp); /*6*/
    
    /* Comunicazione risultati */
    
    printf("\nMedia temperature rilevate -> %2.2f",medTemp);
    
    printf("\nEscursione termica ---------> %d",escur);
    
    printf("\nScostamento medio ----------> %2.2f",medSco);
    
    }
    
    /* Lettura temperature */
    
    void rilevaTemp(int *t){ /*7*/
    
    int i;
    
    printf("\nAcquisizione temperature rilevate\n");
    
    for (i=0;i<RILEVAZ;i++){ /*8*/
    
    printf("Temperatura ore %d ",i*2);
    
    scanf("%d",&t[i]);
    
    }
    
    }
    
    /* Aggiornamento Somma temperature, temp massima e minima */
    
    void aggiorna(int *t,int *st,int *tmn,int *tmx){ /*9*/
    
    int i;
    
    for (i=1;i<RILEVAZ;i++){ 
    
    *st += t[i];
    
    t[i]<*tmn ? *tmn=t[i] : (t[i]>*tmx ? *tmx=t[i] : 0); /*10*/
    
    }
    
    }
    
    /* Calcolo scostamento medio */
    
    float scostMed(int *t,float mt){ /*11*/
    
    float somScost,scost,media;
    
    int i;
    
    somScost = 0;
    
    for (i=0;i<RILEVAZ;i++){
    
    scost = t[i]>mt ? t[i]-mt : mt-t[i];
    
    somScost += scost;
    
    }
    
    media = somScost/RILEVAZ;
    
    return media; /*12*/
    
    }
    Non capisco perchè nelle varie funzioni si passano dei puntatori
    Dove viene specificato a cosa puntano i puntatori?

  2. #2
    Utente di HTML.it L'avatar di ChReAn
    Registrato dal
    Aug 2002
    Messaggi
    486
    In realtà non vengono passati i puntatori ma si parla di "passaggio dei parametri per indirizzo", in opposizione al passaggio per valore.

    In pratica in C si può decidere di far sì che una funzione possa cambiare il valore di una variabile ad essa passata come parametro per indirizzo. Se il parametro viene passato per valore, invece, la funzione inserisce nello stack una copia della variabile, la utilizza per il suo scope (il campo di visibilità della funzione) e poi se ne libera.

    In C++ invece c'è una possibilità aggiuntiva per passare i parametri per indirizzo: dichiarare un parametro <type>&.
    Ad esempio:

    codice:
    void cambiaX (int &x)
    {
      x = 12;
    }
    Imposta il valore della variabile passata come parametro a 12, e tale valore persiste anche all'uscita dalla funzione perchè si è intervenuto direttamente sulla locazione in memoria del dato.

    Se invece avessi scritto

    codice:
    void cambiaX (int x)
    {
      x = 12;
    }
    La funzione avrebbe creato una copia della variabile e all'uscita dalla funzione il parametro avrebbe lo stesso valore che aveva in ingresso.
    ChReAn
    -------------------

    Slackware 9.1 powered

  3. #3
    Dove viene specificato a cosa puntano i puntatori?
    I puntatori puntano ad una zona di memoria indicata dalla variabile alla quale si fa riferimento.
    In questo caso è l'array int temp[RIVELAZ];

    NOn vorrei sbagliarmi in quanto il C non lo conosco molto bene
    Lang=Java
    Ambiente = Eclipse forever
    Ubuntu & Win XP Pro

  4. #4
    In praticainvece di passare direttamente la variabile ho passato l'indirizzo in cui si trova questa variabile?

  5. #5
    Utente di HTML.it L'avatar di ChReAn
    Registrato dal
    Aug 2002
    Messaggi
    486
    Bravissimo, proprio così.

    Infatti vedi che alla funzione "aggiorna" vengono passati parametri con "&"? Quelli sono indirizzi, come ormai sai.
    ChReAn
    -------------------

    Slackware 9.1 powered

  6. #6
    Non capisco bene perchè si ricorre a questo metodo

  7. #7
    Utente di HTML.it L'avatar di ChReAn
    Registrato dal
    Aug 2002
    Messaggi
    486
    Facciamo un esempio.
    Devi scrivere una funzione che inserisca all'interno di una variabile un dato valore. Come fai per dare visibilità a quella variabile all'interno della funzione? La dichiari globale. NO! SBAGLIATO!
    Le globali si usano il meno possibile!
    La questione si risolve creando una variabile non globale a livello di funzione chiamante, e passandola per indirizzo alla funzione chiamata che ne manipolerà il contenuto. Al termine della funzione chiamata il programma tornerà alla funzione chiamante e il valore della nostra variabile sarà quello assegnato dalla funzione chiamata.

    Se effettuassi invece il passaggio per valore, il contenuto della variabile al rientro dalla funzione chiamata risulterebbe lo stesso che si aveva prima della chiamata stessa a quella funzione.
    ChReAn
    -------------------

    Slackware 9.1 powered

  8. #8
    Originariamente inviato da ChReAn
    Facciamo un esempio.
    Devi scrivere una funzione che inserisca all'interno di una variabile un dato valore. Come fai per dare visibilità a quella variabile all'interno della funzione? La dichiari globale. NO! SBAGLIATO!
    Le globali si usano il meno possibile!
    La questione si risolve creando una variabile non globale a livello di funzione chiamante, e passandola per indirizzo alla funzione chiamata che ne manipolerà il contenuto. Al termine della funzione chiamata il programma tornerà alla funzione chiamante e il valore della nostra variabile sarà quello assegnato dalla funzione chiamata.

    Se effettuassi invece il passaggio per valore, il contenuto della variabile al rientro dalla funzione chiamata risulterebbe lo stesso che si aveva prima della chiamata stessa a quella funzione.
    Ma se dichiaro una variabile puntatore deve essere globale per essere vista dalle funzioni chiamante e chiamata

  9. #9
    Perchè non si usano le variabili globali?

  10. #10
    Utente di HTML.it L'avatar di ChReAn
    Registrato dal
    Aug 2002
    Messaggi
    486
    Le variabili dovrebbero essere visibili dal minor numero di moduli e funzioni, per evitare che del codice poco robusto possa andare a modificarne il contenuto generando dei bug di difficile individuazione e, più in generale, per garantire una pulizia del codice maggiore.

    Esempio chiarificatore sull'uso corretto di una variabile e di un passaggio per indirizzo (o riferimento):

    codice:
    void cambia_valore (int *var)
    {
      var++;
    }
    
    int main (int argc, char **argv)
    {
        int pippo;
        pippo = 2;
    
        cambia_valore (&pippo);
    
        printf ("%d\n", pippo);
    }
    Secondo te questo codice cosa stamperà? 2 o 3?

    Se avessi dichiarato la variabile all'inizio del file (appena sotto gli include per capirci) sarebbe stata globale a livello di modulo e il programma avrebbe funzionato ugualmente, ma avrei allocato dello spazio nello heap e sarei soggetto a effetti collaterali come quelli descritti sopra. Studia, studia e ancora studia, e fai pratica, solo così potrai sciogliere i dubbi.
    ChReAn
    -------------------

    Slackware 9.1 powered

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 © 2024 vBulletin Solutions, Inc. All rights reserved.