Pagina 1 di 3 1 2 3 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 22
  1. #1
    Utente di HTML.it
    Registrato dal
    Oct 2005
    Messaggi
    337

    [C] funzione, passaggio vettore

    consideriamo il vettore vett[n]

    per passarlo come parametro a una funzione generica, nella dichiarazione della funzione, io farei:

    void funz ( int *ptr){...}

    però ho visto sul libro che si può anche fare

    void funz ( int vett[]){...}

    quest'ultimo caso non mi è molto chiaro, nel senso con le parentesi "[" "]" io passo solitamente un valore.
    forse è dato dal fatto che le parentesi quadre siano vuote e dalla convenzione del C di passare sempre i vettori per riferimento?

    potrei dare anche così, quindi?

    void funz ( int vett[0]){...}

    ?

    grazie

  2. #2

    Re: [C] funzione, passaggio vettore

    Originariamente inviato da {-_-}
    void funz ( int *ptr){...}
    però ho visto sul libro che si può anche fare
    void funz ( int vett[]){...}
    Sono equivalenti. Comunque, a mio avviso, le quadre sono una forma obsoleta (il libro è per caso "Linguaggio C" di Kerningham e Ritchie?)

    Originariamente inviato da {-_-}
    void funz ( int vett[0]){...}
    Questa forma invece è concettualmente errata: nelle quadre definisci una dimensione del vettore (0), e la dimensione del vettore è utile nella definizione di una variabile, non nella sua dichiarazione.

  3. #3
    Utente di HTML.it
    Registrato dal
    Oct 2005
    Messaggi
    337
    l'ho visto su questo libro:

    "corso di programmazione completa", H.M Deitel, P.J. Deitel"

    questo per intenderci:
    http://www.hoepli.it/libro.asp?ib=97...02&from=kelkoo

    grazie mille. per i chiarimenti, sui libri vedevo solo che utilizzavano entrambe le forme, senza spingersi nel dettaglio.

    grazie

  4. #4
    Prego. Per curiosità ho controllato la data della prima edizione (2000, neanche tanto tempo fa):
    http://libri.kelkoo.it/cpc_5101_ps_1..._20631412.html

    Comunque per curiosità ho fatto un controllo sul mio PC: su 440.268 linee di headers, 1.413 contengono []. Un rapporto molto basso che conferma quanto le quadre siano poco usate.

  5. #5
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    A me sono servite come introduzione ai puntatori quando li studiai tempo fa. Probabilmente sono riportate per uso didattico e basta.

  6. #6
    Utilizzare questa forma:
    codice:
    void funz ( int *ptr){...}
    velocizza il codice, perchè viene passato solo l'indirizzo dell'array, mentre con:
    codice:
    void funz ( int vett[]){...}
    viene passata una copia dell'array.


  7. #7
    Utente di HTML.it
    Registrato dal
    Oct 2005
    Messaggi
    337
    scusami, ora mi sono creato un nuovo dubbio ,

    nel secondo caso, quell con le [] hai scritto che copia l'array, ma allora nel secondo caso io copio l'array nella funzione , quindi in teoria l'array alla fine della funzione viene distrutto e la copia originale rimane invariata, ma ciò non accade.

    quindi copia l'array e poi modifica l'originale?


  8. #8
    Originariamente inviato da menphisx
    Utilizzare questa forma:
    codice:
    void funz ( int *ptr){...}
    velocizza il codice, perchè viene passato solo l'indirizzo dell'array, mentre con:
    codice:
    void funz ( int vett[]){...}
    viene passata una copia dell'array.
    Un'enorme panzana: a volte non capisco queste uscite gratuite.

    codice:
    #include <stdio.h>
    
    void
    azzera (char stringa[])
    {
      stringa[0] = '\0';
    }
    
    int
    main()
    {
      char a[] = "Quante volte viene stampata";
      printf (a);
      azzera (a);
      printf (a);
      return 0;
    }
    Compila ed esegui questo codice: come mai, nonostante i due printf(), la stringa viene stampata una sola volta? Risposta: la funzione azzera() non lavora sulla copia di a[], modifica l'originale.

  9. #9
    Originariamente inviato da ntd
    Un'enorme panzana: a volte non capisco queste uscite gratuite.
    Hai ragione, ma capita di sbagliare.

  10. #10
    Utente di HTML.it
    Registrato dal
    Oct 2005
    Messaggi
    337
    grazie per i chiarimenti, mi erano cadute tutte le certezze , adesso provo la tua verifica, anche se sono certo del risultato.

    nel frattempo anch'io mi sono fatto un esperimentino per verificare

    grazie ancora

    codice:
    #include <stdio.h>
    
    int vett[10]= {0,1,2,3,4,5,6,7,8,9};
    
    void funz (int v[]){
    	int i;
        for (i=0; i<10;i++)
          vett[i]= vett[i]+1;
    
    	
    	for (i=0; i<10;i++)
    printf("B %d-->", vett[i]);printf("\n\n");
    }
    
    
    void main(){
    int i;
    for (i=0; i<10;i++)
    printf("A %d-->", vett[i]);
    printf("\n\n");
    
    funz (vett);
    
    for (i=0; i<10;i++)
    printf("C %d-->", vett[i]);
    printf("\n\n");
    }

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.