Visualizzazione dei risultati da 1 a 8 su 8
  1. #1
    Utente di HTML.it
    Registrato dal
    May 2008
    Messaggi
    1,683

    [C] Scope e passaggio di parametri a funzione

    Ciao a tutti! casualmente ho dovuto mettere mano a un codice in C, linguaggio che non uso regolarmente da una decina di anni. Ho trovato una cosa strana, che non capisco come possa funzionare, ho fatto un esempio per spiegarmi meglio
    codice:
     #include  #include   void caricavettore(int[], int); void visualizza(int[], int); int main() {     int n = 5;     int v[n];     caricavettore(v,n);     visualizza(v,n); } void caricavettore(int v[], int n){     int i;     for(i = 0; i < n; i++){         printf("Inserisci elememto ");         scanf("%d",&v[i]);     } } void visualizza(int v[], int n){     int i;     for(i = 0; i < n; i++){         printf("%d \n",v[i]);     } }
    Questo codice funziona, ma non capisco come mai. Sicuro che sto facendo una domanda stupida, ma in altri linguaggi questa logica non funzionerebbe,mi spiego: Le variabili che dichiaro in una funzione tra cui anche il main possono essere viste solo dalla funzione stessa e le altre funzioni non possono accedervi e meno che non passo come parametri. E se creo una cosa di questo tipo
    codice:
     int main(){ 	int i = 1; 	a(); } int a(){ 	int i = 2; }
    avrò due variabili "i" con valori diversi, l'assegnazione nella funzione a() non dovrebbe modificare l'omonima variabile nel main. Quindi, mi sta bene che caricavettore possa inserire elementi nell'array "v" che gli ho passato, ma non capisco come, senza un return, questo possa modificare la variabile "v" nel main. Sapete spiegarmi come mai? grazie

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,298
    Formatta bene il codice sul forum ... come vedrai non si capisce molto ...

    Comunque, per il primo codice non capisco perché hai dubbi... i dati che interessano alle funzioni li passi come parametri ... le variabili i sono locali e sono semplici contatori ...

    Per il secondo, le due variabili sono effettivamente diverse.

    La modifica del vettore v non ha nulla a che vedere con la visibilità della variabile i ma con il fatto che il vettore viene passato per indirizzo e non per copia, dunque la scanf agisce effettivamente sul vettore del main.
    Ultima modifica di oregon; 15-11-2019 a 11:12
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    Utente di HTML.it
    Registrato dal
    May 2008
    Messaggi
    1,683
    Hai ragione, ieri sera c'erano dei problemi sul sito, forse dipende da quello, non riesco nemmeno a modificarlo, lo riporto qua
    codice:
    void caricavettore(int[], int);
    void visualizza(int[], int);
     
    int main() {
        int n = 5;
        int v[n];
        caricavettore(v,n);
        visualizza(v,n);
    } 
    void caricavettore(int v[], int n){
        int i;     
        for(i = 0; i < n; i++){
            printf("Inserisci elememto ");
            scanf("%d",&v[i]);     
        } 
    } 
    void visualizza(int v[], int n){
        int i;     
        for(i = 0; i < n; i++){
            printf("%d \n",v[i]);
        }
    }
    codice:
    int main(){
        int i = 1;
        a(); 
    } 
    int a(){     
        int i = 2; 
    }

  4. #4
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,298
    Ok comunque ti ho già risposto ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  5. #5
    Utente di HTML.it
    Registrato dal
    May 2008
    Messaggi
    1,683
    il mio dubbio è che, se sono globali perchè devo passarle?
    di solito se passi delle variabili poi si fa un return

  6. #6
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,298
    Sono globali? Che dici?

    Ti ripeto ... il vettore è passato per puntatore e quindi è perfettamente modificabile dalle funzioni.
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  7. #7
    Utente di HTML.it
    Registrato dal
    May 2008
    Messaggi
    1,683
    Quote Originariamente inviata da oregon Visualizza il messaggio
    Sono globali? Che dici?

    Ti ripeto ... il vettore è passato per puntatore e quindi è perfettamente modificabile dalle funzioni.
    Non volevo essere maleducato o insistente con la mia domanda, è che ricordavo erronemanete che con il c il discorso dei puntatori fosse esplicito e non implicito

  8. #8
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,298
    No ... nessun problema ... non ti preoccupare. Il fatto è che gli array (nel tuo caso v) in C sono sempre e unicamente passati per indirizzo.
    No MP tecnici (non rispondo nemmeno!), usa il forum.

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