Visualizzazione dei risultati da 1 a 7 su 7
  1. #1

    [C] dubbio iperbolico sul passaggio dei parametri

    allora ho un problema: non riesco a capire quando devo usare un passaggio di parametri per riferimento o quando usare quello per valore in una funzione o in una procedura..e dal libro che ho a casa la situazione non mi è per niente chiara.

    non capisco, dagli esercizi di cui ho la soluzione che ho in casa a volte li passa in un modo altre in un altro senza un apparente ordine logico..mi potete aiutare?
    steelass

  2. #2
    Quando tu passi una variabile per riferimento, ne passi il puntatore e quindi le modifiche che tu effettui sul parametro all'interno della funzione saranno effettuate anche nella variabile della funzione chiamante.
    Quando tu passi una variabile per valore, nella funzione tu utilizzi una copia della variabile e quindi la variabile originaria non viene intaccata.
    In generale tu utilizzi il passaggio per riferimento se vuoi che la variabile passata come parametro venga modificata dalla funzione chiamata, altrimenti utilizzi il passaggio per valore.

  3. #3
    Utente di HTML.it
    Registrato dal
    Jun 2010
    Messaggi
    250
    Se sei interessato a cambiare il contenuto informativo della variabile passata,allora devi senza dubbio usare il passaggio per riferimento,altrimenti utilizzi quello per valore.

    Tipico esempio:la funzione Scambia che scambia due numeri.Il prototipo deve essere necessariamente il seguente:
    codice:
    void Scambia(int *a,int *b);
    Se non avessi passato le variabili per indirizzo...il contenuto informativo delle variabili a livello del main non sarebbe cambiato.
    Un pò più chiaro o ti ho solo confuso le idee?

  4. #4
    codice:
     #include <stdio.h>
    #include <string.h>
    typedef struct {
    char nome[11];
    int qta;
    } ingrediente;
    typedef struct {
    char nome[21];
    ingrediente ingredienti[4];
    int ningr;
    } ricetta;
    int caricaricette(ricetta*);
    int quantita(ricetta*, char[], int);
    void interseca(ricetta*, char[], char[], int);
    void main()
    {
    ricetta ricette[20];
    int qtaRic, qtaTot;
    char ingrRicerca[11], ric1[21], ric2[21];
    qtaRic=caricaricette(ricette);
    printf("Ricette inserite %d\n", qtaRic);
    printf("Inserire il nome di un ingrediente da ricercare\n");
    scanf("%s", ingrRicerca);
    qtaTot=quantita(ricette, ingrRicerca, qtaRic);
    printf("Ingrediente ricercato %s e quantita totale necessaria per
    tutte le ricette inserite %d\n", ingrRicerca, qtaTot);
    printf("Inserire il nome della prima ricetta da intersecare\n");
    scanf("%s", ric1);
    printf("Inserire il nome della seconda ricetta da intersecare\n");
    scanf("%s", ric2);
    interseca(ricette, ric1, ric2, qtaRic);
    getchar();
    getchar();
    }
    int caricaricette(ricetta *ric)
    {
    int i=0, continua=1,j;
    do
    {
    printf("Inserimento di una ricetta\n");
    printf("Inserire nome ricetta\n");
    scanf("%s", ric[i].nome);
    j=0;
    while(continua)
    {
    printf("Inserire nome del %d ingrediente\n", j+1);
    scanf("%s", ric[i].ingredienti[j].nome);
    printf("Inserire qta dell'ingrediente %d\n",j+1);
    scanf("%d", &ric[i].ingredienti[j].qta);
    j++;
    printf("Inserire un altro ingrediente? 0=No, 1=Si\n");
    scanf("%d", &continua);
    }
    continua=1;
    ric[i].ningr=j;
    printf("Inserire un altra ricetta? 0=No, 1=Si\n");
    scanf("%d", &continua);
    i++;
    }while(continua && i<20);
    return i;
    }
    int quantita(ricetta *ric, char nomeIng[], int qtaRic)
    {
    int i,j, trovato, qtaTot=0;
    for(i=0; i<qtaRic; i++)
    {
    trovato=0;
    for(j=0; j<ric[i].ningr && !trovato; j++)
    {
    if(strcmp(ric[i].ingredienti[j].nome, nomeIng)==0)
    {qtaTot+=ric[i].ingredienti[j].qta;
    trovato=1;}
    }
    }
    return qtaTot;
    }
    void interseca(ricetta *ric, char ric1[], char ric2[], int qtaRic)
    {
    int i, j, k, trovato=0, m, find=0;
    for(i=0; i<qtaRic && !trovato; i++)
    {
    if(strcmp(ric[i].nome, ric1)==0)
    trovato=1;
    }
    trovato=0;
    for(j=0; j<qtaRic && !trovato; j++)
    {
    if(strcmp(ric[j].nome, ric2)==0)
    trovato=1;
    }
    trovato=0;
    i=i-1;
    j=j-1;
    printf("Ingredienti in comune:\n");
    for(k=0, m=0; k<ric[i].ningr && m<ric[j].ningr;)
    {
    if(strcmp(ric[i].ingredienti[k].nome,
    ric[j].ingredienti[m].nome)==0)
    {printf("%s\n", ric[i].ingredienti[k].nome);
    m++;
    k++;
    find++;
    }
    else{
    if(strcmp(ric[i].ingredienti[k].nome,
    ric[j].ingredienti[m].nome)<0)
    k++;
    else
    m++;
    }
    }
    if(find==0)
    printf("Nessun Ingrediente in comune\n");
    }
    perchè in questo caso nella funzione quantità e nella procedura interseca ha passato il parametro ricetta in questo modo? eppure entrambe non modificano la ricetta ma operano al suo interno per cercare la quantità di un suo ingrediente o per dire cosa due ricette hanno in comune!
    steelass

  5. #5
    Utente di HTML.it
    Registrato dal
    Jun 2010
    Messaggi
    250
    Perchè in questo caso stai passando alla funzione un vettore che altro non è che un puntatore che punta alla prima locazione.
    Per fare un esempio:
    codice:
    int vett[5] = {2,5,8,13,27};
    cout << vett[0];
    cout << *vett;
    Le due istruzioni producono lo stesso effetto.
    Comunque le prossime volte cerca di indentare un pò il codice . .

  6. #6
    continuo a non capire..(perdonate l'ignoranza)
    steelass

  7. #7
    Utente di HTML.it
    Registrato dal
    Jun 2010
    Messaggi
    250
    In pratica
    codice:
    void interseca(ricetta*, char[], char[], int);
    è equivalente a
    codice:
    void interseca(ricetta[],char[],char[],int);
    ..provare per credere...
    Per poter passare a una funzione un array si può passare il puntatore al suo primo indirizzo.

    Ti invito a leggere Qua,in particolare versò metà pagina, ma sul web si trovano tante guide sulla "analogia tra puntatori e array"

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.