Pagina 1 di 3 1 2 3 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 25
  1. #1
    Utente di HTML.it L'avatar di Iena87
    Registrato dal
    Dec 2003
    Messaggi
    429

    [c/c++]

    Sto studiando la guida al c++ di Shildt, e volendone spulciare di tutto di più da essa, la sto seguendo passo passo, parola dopo parola, e sono arrivato a dei dubbi, o meglio delle precisazioni:
    Il libro in ocasione delle variabili locali parla di variabili spesso definitie come automatiche, ma in che senso vengono definite automatiche??? perchè sono automatiche????
    Poi continua dicendo che esiste nel C, come nel C++, una parola chiave, auto , che serve per la definizione di vriabili locali, proprio perchè queste devono essere automatiche, ma nn capisco cosa vuol dire "variabile automatica"....continua dicendo che di solito nn è mai utilizzata poichè quasi tute le variabili nn globali sono automatiche........mi potreste far capire cosa intende con automatiche????


    Poi sempre riferendosi alle variabili locali, dice che, è questa è cosa normale, non conservano il loro valore tra una chiamata e un'altra, ma è possibile chiedere al compilatore di conservarne il valore attraverso il modificatore static

    Ho provato a scrivere qualcosa in C, per accertarmi del funzionamento di static ma nn ho avuto esiti positivi, questo è ciò che ho scritto:

    codice:
    #include <stdio.h>
    #include <stdlib.h>
    #include <iostream.h>
    #include <conio.h>
    #include <climits>
    
    void f1(void);
    void f2(void);
    
    int main (){
        f1();
        f2();
        getch();
        return 0;
    }
    
    void f1(void){
        static int i;
        i=20;
        printf("%d", i);
        i=i-10;
    }
    
    void f2(void){
        int i;
        printf("%d", i);
    }

    Adesso ciò che vi chiedo è se gentilmente mi fareste capire il significato di "variabile automatica", come si usa la parola chiave auto e come static.

    Grazie mille in anticipo

  2. #2
    Utente di HTML.it L'avatar di Xadoom
    Registrato dal
    Dec 2002
    Messaggi
    1,491
    Per static si indica una variabile di tipo locale che però conserva il suo valore anche all'esterno della porzione di codice in cui è valida, ad esempio:
    codice:
    void funz1(){
     static int var = 0;
     var++;
     cout << var;
    }
    void funz2(){
     int var = 0;
     var++;
     cout << var;
    }
    La funzione due ogni volta che è chiamata stampa 0 (la variabile var è creata daccapo ad ogni chiamata della funzione), la funzione1 stampa ogni volta var incrementata di 1 perchè var "ricorda" il suo valore della chiamata precedente.
    Spero di essere stato chiaro e, sopratutto, corretto!
    Windows Xp
    [Java]
    [PHP]Notepad++
    [Fortran90-77] elf90 g77
    [C++ /WinAPI] DevC++ VisualC++

  3. #3
    Utente di HTML.it L'avatar di Iena87
    Registrato dal
    Dec 2003
    Messaggi
    429
    Originariamente inviato da Xadoom
    Per static si indica una variabile di tipo locale che però conserva il suo valore anche all'esterno della porzione di codice in cui è valida, ad esempio:
    codice:
    void funz1(){
     static int var = 0;
     var++;
     cout << var;
    }
    void funz2(){
     int var = 0;
     var++;
     cout << var;
    }
    La funzione due ogni volta che è chiamata stampa 0 (la variabile var è creata daccapo ad ogni chiamata della funzione), la funzione1 stampa ogni volta var incrementata di 1 perchè var "ricorda" il suo valore della chiamata precedente.
    Spero di essere stato chiaro e, sopratutto, corretto!
    a dir la verità nn tanto....forse nella spiegazione che mi hai fornito hai confuso la funzione con la due...io cmq da quello che hai scritto vdo che all'inizio nella prima funzione, viene creata la variabile var che è contemporaneamente inizializzata a 0, successivamente incrementata, quindi arriva a 1, e nel momento in cui la visualizziamo, vediamo sullo schermo il valore 1...finisce la pirma funzione e inizia la seconda....viene creata la variabile var, che così facendo dovrebbe avere valore 1, in quanto con static conserva il suo valore anche al di fuori del suo blocco, quindi nella seconda funzione nel momento in cui scriviamo int var si dovrebbe generare una variabile var contenente il valore 1, o almeno questio ho capito, ma azzerandola vale 0, quindi la incrementiamo e nel momento in cui la visualizziamo abbiamo 1.....dove ho sbagliato????

  4. #4
    static è usato per una var che assomiglia a una globale.
    Es
    codice:
     
    struct Es
    {
      static unsigned int Es_cnt; // contatore
    };
    static unsigned int Es::Es_cnt = 0;
    Se incrementi la var avra lo stesso valore x tutte le istanze della sruct Es.

    Spero di averti chiarito.

    P.S: lo shildt è sconsigliatissimo da tutti gli esperti di C/C++


    La stupidità umana e l'universo sono infinite.
    Della seconda non sono certo(Einstein)

    Gnu/Linux User

  5. #5
    Utente di HTML.it L'avatar di Xadoom
    Registrato dal
    Dec 2002
    Messaggi
    1,491
    No, allora le due funzioni non sono chiamate una dopo l'altra, è solo per farti vedere il diverso comportamento, prova a compilare:
    codice:
    #include <iostream>
    #include <stdlib.h>
    
    using namespace std;
    
    void funz1();
    void funz2();
    
    int main(int argc, char *argv[])
    {
      for(int i=0;i<10;i++)funz1();
      for(int i=0;i<10;i++)funz2();
      system("PAUSE");	
      return 0;
    }
    
    void funz1(){
     static int var = 0;
     var++;
     cout << var;
    }
    void funz2(){
     int var = 0;
     var++;
     cout << var;
    }
    allora funz1() ti stamperà 1,2,3,...,10 in quanto ogni volta che la chiami la variabile var tiene memoria del valore della chiamata precedente a funz1() (delle chiamate ad altre funzioni non può tenere memoria in quanto è una variabile locale di funz1().
    Funz2 ti stamperà sempre 1 in quanto ad ogni chiamata la variabile è reistanziata; c'è da osservare che una variabile di tipo static viene inizializzata solo una volta, la prima volta che viene chiamata la funzione, ecco perchè non si riazzera ogni volta che richiamo la funzione.
    Spero ora di aver chiarito meglio.
    Windows Xp
    [Java]
    [PHP]Notepad++
    [Fortran90-77] elf90 g77
    [C++ /WinAPI] DevC++ VisualC++

  6. #6
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Originariamente inviato da Iena87
    a dir la verità nn tanto....forse nella spiegazione che mi hai fornito hai confuso la funzione con la due...io cmq da quello che hai scritto vdo che all'inizio nella prima funzione, viene creata la variabile var che è contemporaneamente inizializzata a 0, successivamente incrementata, quindi arriva a 1, e nel momento in cui la visualizziamo, vediamo sullo schermo il valore 1...finisce la pirma funzione e inizia la seconda....viene creata la variabile var, che così facendo dovrebbe avere valore 1, in quanto con static conserva il suo valore anche al di fuori del suo blocco, quindi nella seconda funzione nel momento in cui scriviamo int var si dovrebbe generare una variabile var contenente il valore 1, o almeno questio ho capito, ma azzerandola vale 0, quindi la incrementiamo e nel momento in cui la visualizziamo abbiamo 1.....dove ho sbagliato????
    Xadoom intendeva dire che con chiamate successive alla funzione funz1 la variabile var non perde il suo valore, mentre nella funz2 sì. Ed ha ragione.
    Prova questo codice:
    codice:
    #include <iostream>
    using namespace std;
    
    void funz1() {
       static int var = 0;
       var++;
       cout << var << endl;
    }
    
    void funz2() {
       int var = 0;
       var++;
       cout << var << endl;
    }
    
    int main() {
       funz1();
       funz2();
       funz1();
       return 0;
    }
    L'output è il seguente:
    codice:
    1
    1
    2
    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  7. #7
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Dannata lentezza momentanea intrinseca della rete... :gren:


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  8. #8
    Utente di HTML.it L'avatar di Xadoom
    Registrato dal
    Dec 2002
    Messaggi
    1,491
    Originariamente inviato da LeleFT
    Dannata lentezza momentanea intrinseca della rete... :gren:


    Ciao.
    :adhone:
    Mica è una gara no? :tongue:
    Comunque carino....abbiamo scritto praticamente lo stesso codice come esempio!!
    Windows Xp
    [Java]
    [PHP]Notepad++
    [Fortran90-77] elf90 g77
    [C++ /WinAPI] DevC++ VisualC++

  9. #9
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    L'ho notato... infatti sembrava che l'avessi copiato... E' per questo che ho messo l'appunto sulla velocità... :gren:


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  10. #10
    Utente di HTML.it L'avatar di Iena87
    Registrato dal
    Dec 2003
    Messaggi
    429
    Grazie raga provo subito, ma ancora nn mi avete detto che vuol dire variabile automatica, se poi nn ho letto io,pardon



    X Luc@s: forse gli esperti lo sconsigliano perchè è Shildt (Ovvimanete dopo Stroustup o come si chiama) il maggiore esperto di C++

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.