[C] inizializzare vettore tramite function

Messaggioda 19stellare92 » 09/12/2018, 18:46

Ciao a tutti, mi sto esercitando con le function e i puntatori.
mi sono imbattuto in questo problema, ovvero visualizzare il vettore inizializzato tramite function nel main.
Ritorno l'indirizzo del vettore ma quando lo stampo penso mi riporti l'indirizzo e non il contenuto.
Dove sbaglio? e come potrei correggere? Forse si possono usare malloc e calloc ma se possibile non vorrei usarle, leggendo in giro per i forum mi è apparso di capire che rappresentino il male puro.
Grazie a chiunque m darà una mano.

Codice:
#include<stdio.h>
int* inizializza(int *vet,int size);

main(){

int size;

printf("Stabilisci la taglia del vettore: ");
scanf("%d",&size);
int vet[size];

inizializza(vet,size);
   
int i;printf("vet[%d]: ",size);
for(i=0;i<size;i++)
printf("%d",vet[i]);

}

int*inizializza(int*vet,int size){
int i;   
int*v;
v=vet;
for(i=1;i<=size;i++){
printf("\nvet[%d]: ",i);
scanf("%d",v);}   
return(vet);
}
19stellare92
Starting Member
Starting Member
 
Messaggio: 4 di 14
Iscritto il: 08/12/2018, 11:00

Re: [C] inizializzare vettore tramite function

Messaggioda Obidream » 09/12/2018, 19:38

19stellare92 ha scritto:Dove sbaglio?

Qui
19stellare92 ha scritto:leggendo in giro per i forum


Battute a parte, ci sono un sacco di cose opinabili ma procediamo per gradi:

Perché nel ciclo della funzione inizializza cominci da i=1 e continui sino i <= size? Nei vettori gli indice partono dallo 0.
Ad esempio:

Codice:
vett[5] = {1, 2, 3, 4, 5};


Per accedere al primo elemento si scrive:

Codice:
vett[0]


E così via sino all'ultimo:

Codice:
vett[4]


Per cui il ciclo for intanto dovrebbe essere for(i = 0; i < size; i++). Questo ti è chiaro?
((v & 0xff) && (v & 0xff00) && (v & 0xff0000) && (v & 0xff000000))
Avatar utente
Obidream
Advanced Member
Advanced Member
 
Messaggio: 975 di 2194
Iscritto il: 07/02/2012, 20:57

Re: [C] inizializzare vettore tramite function

Messaggioda 19stellare92 » 09/12/2018, 20:02

si, inizialmente l'avevo inizializzato come hai scritto tu,poi ho fatto un po di prove e mi sono dimenticato di re-inizializzarlo ad 0. Quali sono le cose opinabili? :-D

Se ti riferisci a questo
Codice:

int i;printf("vet[%d]: ",size);
for(i=0;i<size;i++)
printf("%d",vet[i]);


era solo per capire se stampando il vettore dal main ottenessi il risultato sperato, ma non è stato cosi :? :? :?

Obidream i tuoi commenti mi feriscono sempre :D stavo cercando di fare quello che mi ha insegnato ieri mettendo più function per rendere il codice piu ordinato. Comunque penso che i miei principali problemi derivino dal fatto che sono autodidatta
19stellare92
Starting Member
Starting Member
 
Messaggio: 5 di 14
Iscritto il: 08/12/2018, 11:00

Re: [C] inizializzare vettore tramite function

Messaggioda Obidream » 09/12/2018, 20:26

Non intendevo ferirti, è che sono rompiballe di mio, me ne scuso!
Comunque si collega a ciò che abbiamo detto nell'altro topic! Siccome gli array vengono passati ad una funzione by reference e non by value in realtà è sufficiente fare questo:

Codice:
#include<stdio.h>

void inizializza(int *vet, int size)
{
    int i;

    for(i = 0; i < size; ++i) {
        scanf("%d", &vet[i]);
    }
}

int main(void)
{
    int size;

    printf("Stabilisci la taglia del vettore: ");
    scanf("%d",&size);
    int vet[size];

    inizializza(vet,size);

    int i;
    for(i = 0; i < size; ++i) {
        printf("vet[%d] : %d\n", i, vet[i]);
    }

    return 0;
}


Quando passi un array ad una funzione puoi modificarlo direttamente, il passaggio non avviene per copia! Comunque anche la scanf nella tua funzione inizializza ( scopri tu perché :lol: in particolare dovresti chiederti cosa succede quando scrivi scanf("%d", v);).
Abituati ad indentare il codice in modo coerente, non voglio essere cattivo ma sono sicuro che anche tu lo trovi disordinato così come lo hai scritto sul forum. Ci sono vari stili, trova quello che ti piace di più ed usalo coerentemente.
((v & 0xff) && (v & 0xff00) && (v & 0xff0000) && (v & 0xff000000))
Avatar utente
Obidream
Advanced Member
Advanced Member
 
Messaggio: 976 di 2194
Iscritto il: 07/02/2012, 20:57

Re: [C] inizializzare vettore tramite function

Messaggioda 19stellare92 » 09/12/2018, 21:14

Come sempre ti ringrazio per la risposta, comunque scherzavo per il fatto di ferirmi :)
Comunque ti spiego perchè ho fatto certe cose cosi magari puoi corregere il mio ragionamento quando cappello.

1)Per la struttura del codice hai ragione te, il tuo è piu ordinato, devo imparare a mettere in ordine le parentesi e tutto, ma ti giuro mi da noia vedere cose che non sono attaccatte al bordo dello schermo, ma capisco che è un mio limite e devo superarlo.

2)per quanto riguarda il vettore nel main dopo la chiamata della funzione invece volevo visualizzarlo proprio cosi, cioè in riga v[size]= 0125345 (esempio)

3)ho dichiarato un altro puntatore nella function perchè pensavo che se avessi spostato l'indice di vett per inizializzarlo usando il ciclo e poi l'avessi ritornato e successivamente nel main l'avessi voluto visualizzare avrei visualizzato il vettore ad un altro indirizzo....immagino sia una frase molto confusa però non riesco a spiegarlo in altri termini.
Quindi ti chiedo per fare prima, perchè il mio codice non restisce il vettore, davvero non capisco lo sbaglio, ho fatto una cosa molto simile a quella che mi hai mostrato tu ieri quando hai invocato la funzione reverse_string_ptr.

4)Il discorso del passaggio per indirizzo l'ho capito, comunque mi fai scoprire sempre cose nuove, ad esempio questo discorso della scanf è molto interessante, praticamente passando in ingresso l'indirizzo dell'array io posso definire tutti i valori dell'array in un colpo solo senza usare il ciclo,giusto?

Comunque perdonami se ti bombardo di domande, il mio manuale e un pò antico (1998) e mi sembra che certe cose le dia per scontate, io implemento dalle slide universitarie che trovo online.
Attualmente sono solo un paio di giorni che studio i puntatori ed ho le idee un pò confuse, sto cercando di mettere in ordine facendo esercizi.
19stellare92
Starting Member
Starting Member
 
Messaggio: 6 di 14
Iscritto il: 08/12/2018, 11:00

Re: [C] inizializzare vettore tramite function

Messaggioda Super Squirrel » 09/12/2018, 21:48

Va detto che essere autodidatta non esclude il fatto che si possa ragionare più attentamente su quello che si sta facendo!
Per esempio riguardo alla funzione:
- perché hai scelto come tipo di ritorno int* e non void, dal momento che nel main il valore ritornato dalla funzione risulta inutilizzato?
- al di là di quelle che erano le tue intenzioni, la funzione si limita a far inserire all'utente per size volte il valore puntato da vet. In che modo infatti la riga di codice scanf("%d",v); potrebbe andare a riempire i vari elementi dell'array?!

Per quanto riguarda il main volevo precisare che vet non è un array statico, ma un VLA (Variable-Length Array).

Riguardo a quanto detto da @Obidream volevo precisare che a rigore in C non si può parlare di passaggio per riferimento in quanto i riferimenti sono una prerogativa del C++. Nel C esiste solo il passaggio per valore, che effettua una copia del parametro passato alla funzione. Il passaggio per riferimento può essere invece simulato ricorrendo ai puntatori, in modo da andare a modificare una certa variabile attraverso il suo indirizzo di memoria utilizzando l'operatore di dereferenziazione.

Ti pongo a questo punto una domanda... cosa stiamo effettivamente passando ad una funzione quando gli passiamo l'identificatore di un array?
Chi dorme in democrazia, si sveglia in dittatura.
Super Squirrel
Senior Member
Senior Member
 
Messaggio: 323 di 1486
Iscritto il: 16/05/2013, 22:05

Re: [C] inizializzare vettore tramite function

Messaggioda 19stellare92 » 09/12/2018, 22:09

@super squirrel
Ho capito il mio errore praticamente nella function dovevo scrivere scanf("%d",v++); ero convinto che iterando la i nel ciclo automaticamente il puntatore andava a puntare all'elemento successivo dell'array.

Rispondendo alla tua prima domanda hai perfettamente ragione. A me non serve avere un ritorno visto che tramite la function modifico l'array nel main, quindi se volessi eseguire altre operazioni sull'array basta invovare un altra function del tipo f(vet,size);

Rispondendo alla tua seconda domanda: un puntatore è una variabile perchè può puntare ad indirizzi differenti mentre l'array no,gli viene riservata in memoria una porzione predefinita per contenerlo.Quindi alla function gli viene passato l'indirizzo di vet[0].
Io al più posso scorrere le varie celle che compongono l'array usando v++, ma di certo non posso fare una cosa del tipo:
char *v;
vet=v;
per i motivi spiegati prima.

Vi ringrazio perchè mi state facendo ragionare, e piano piano sto mettendo in ordine i pezzi
19stellare92
Starting Member
Starting Member
 
Messaggio: 7 di 14
Iscritto il: 08/12/2018, 11:00


Torna a Informatica

Chi c’è in linea

Visitano il forum: Nessuno e 1 ospite