Newsgroup: it.comp.lang.c
Titolo: passaggio di valori tra funzioni...

Non ho capito come si possono passare valori da una funzione ad un'altra.
Ad esempio, io avevo fatto una struct che definisse un vettore, con un
puntatore e un int per il numero di elementi.
Poi ho creato una funzione per riempire il vettore (operazione inutile, ma
volevo capire il meccanismo del passaggio dei valori...)
Non ho ben capito come fare per passare, dalla main, il valore alla funzione
di riempimento e come ricavarne il puntatore. Infatti la soluzione da me
trovata è sbagliata. Riporto anche il mio (fallimentare) programma:
#include <stdio.h>
#include <stdlib.h>
typedef struct {
    int            *vett;
    int             nmax;
}               vettore;
void riemp (vettore vettdef);
int             main(void)
{
    int             i;
    vettore         vett1;
    printf("\n\nIl vettore e':\n");
 riemp(vett1);
    for (i = 0; i < vett1.nmax; i++) {
        printf("%d  ", vett1.vett[i]);
    }
    printf("\n\n");
    free(vett1.vett);
    printf("ciao a tutti\n");
    return 1;
}
void riemp (vettore vettdef)
{
 int i;
 printf("dimensione del vettore?\n");
    scanf("%d", &vettdef.nmax);
    vettdef.vett = calloc(vettdef.nmax, sizeof(int));
    if (!vettdef.vett) {
        printf("Memoria insufficente\n");
        exit(1);
    }
    for (i = 0; i < vettdef.nmax; i++) {
        printf("\nElemento di posizione %d:  ", (i + 1));
        scanf("%d", &vettdef.vett[i]);
    }
}
Grazie,
Zeppe

 di riempimento e come ricavarne il puntatore. Infatti la soluzione da me
Il fatto e' che la struttura la devi passare per riferimento,di modo che puoi
modificarne i valori,altrimenti ne modifichi soltanto la copia locale alla
funzione.
#include <stdio.h>
#include <stdlib.h>
typedef struct {
    int            *vett;
    int             nmax;
  }
    vettore;
void riemp (vettore *vettdef);
int             main()
{
    int             i;
    vettore         vett1;
    riemp(&vett1);
    printf("\n\nIl vettore e':\n");
    for (i = 0; i < vett1.nmax; i++)
 {
 printf("%d  ", vett1.vett[i]);
 }
    printf("\n\n");
    free(vett1.vett);
    printf("ciao a tutti\n");
    return 1;
}
void riemp (vettore *vettdef)
{
 int i;
 printf("dimensione del vettore?\n");
 scanf("%d", &vettdef->nmax);
 vettdef->vett = calloc(vettdef->nmax, sizeof(int));
 if (!vettdef->vett)
    {
    printf("Memoria insufficente\n");
    exit(1);
    }
 for (i = 0; i < vettdef->nmax; i++)
     {
     printf("\nElemento di posizione %d:  ", (i + 1));
     scanf("%d", &vettdef->vett[i]);
     }
}

 wrote:
[ snip ]
------------------------------------------------------------------
#include <stdio.h>
#include <stdlib.h>
typedef struct {
	int *vett;
	int nmax;
} vettore;
void riemp(vettore *vettdef);
int main(void)
{
	int i;
	vettore vett1;
	riemp(&vett1);
	puts("\n\nIl vettore e':");
	for (i = 0; i < vett1.nmax; i++) {
		printf("%d  ", vett1.vett[i]);
	}
	free(vett1.vett);
	puts("\n\nCiao a tutti!");
	return 0;
}
void riemp(vettore *vettdef)
{
	int i;
	fputs("Dimensione del vettore: ", stdout);
	scanf("%d", &vettdef->nmax);
	vettdef->vett = calloc(vettdef->nmax, sizeof(int));
	if (vettdef->vett == NULL) {
		perror("calloc"); exit(1);
	}
	for (i = 0; i < vettdef->nmax; i++) {
		printf("\nElemento di posizione %d:  ", (i + 1));
		scanf("%d", &vettdef->vett[i]);
	}
}
------------------------------------------------------------------
Ciao ciao,
Andrea
-- 
"...Unix, MS-DOS, and Windows NT (also known as the Good, the Bad, and 
 the Ugly)."
(by Matt Welsh)

 void riemp (vettore vettdef);
Il problema è che la struct vettore viene passata per valore e quindi la
funzione riempie una sua copia locale e non quella definita
esternamente. Devi, invece, passarla per riferimento, simulandolo con un
puntatore:
void riemp (vettore *vettdef);
e poi, all'interno della funzione, accedere agli elementi della struct
usando l'operatore ->.
EMG

Ho capito l'errore!
Grazie a tutti!!
I tre giorni che posto qui le mie conoscenze sul C si sono allargate un bel
po' (da "praticamente nulla" a "un pochinino")!!!
Ciao,
Zeppe

 wrote in message
388CBDB2...@tin.it...


 E' giusto o ho preso la mia solita cantonata?
Giusto.
EMG