|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Bannato
Iscritto dal: Nov 2004
Messaggi: 124
|
[C]Problema nel passare un vettore a una funzione
Ciao,
ho trovato questo programma sul libro di programmazione ma non mi funziona e non riesco a capire il perchè...a me sembra logico....che c'è di sbagliato? /* Passare alla funzione un vettore */ #include <stdio.h> #define SIZE 5 void modificaArray(int[], int); int main(){ int a[SIZE] = {0,1,2,3,4}; int i; printf("Effetto di passare un intero array mediante una chiamata per riferimento: \n \n Il valore dell'array originale è:\n"); for(i=0; i<=SIZE-1;i++) printf("%3d",a[i]); printf("\n"); modificaArray(a, SIZE); // I vettori sono passati per RIFERIMENTO printf("Il valore dell'array modificato è:\n"); for(i=0;i=SIZE-1;i++) printf("%3d",a[i]); return 0; } void modificaArray(int b[], int size){ int j; for(j=0; j<=size-1;j++) b[j] *= 2; } Altre domande: 1)Perchè nel prototipo della funzione void modificaArray(int[], int); c'è int[] ? vuole semplicemente dire che uno degli argomenti è un array? e l'altro int indica il valore SIZE perchè cmq la funzione è per valore anche se simula la chiamata per riferimento e la funzione vede il mio vettore come un puntatore alla prima locazione del vettore? 2)Quando chiamo la funzione con il comando: modificaArray(a, SIZE); perchè non devo mettere le parentesi graffe? 3)Domandone sulla mia funzione: void modificaArray(int b[], int size){ int j; for(j=0; j<=size-1;j++) b[j] *= 2; } quì metto b[] invece che a[] e size invece che SIZE perchè sono copie dei valori?La funzione riceve un puntatore alla prima locazione del vettore e poi ne modifica gli elementi moltiplicandoli per 2...ho capito bene? Grazie |
![]() |
![]() |
![]() |
#2 |
Senior Member
Iscritto dal: Feb 2004
Città: TREVISO
Messaggi: 902
|
probabilmente non hai notato che il problema non è nulla di trascendentale, ma è soltanto qui:
Codice:
for(i=0;i=SIZE-1;i++) printf("%3d",a[i]); se scrivere "i=SIZE-1" non stamperà mai l'array modificato, perchè la condizione del For non è mai soddisfatta in quanto la variabile i non è uguale a "SIZE-1".....piuttosto metti "i<SIZE" per quanto riguarda le altre domande: 1) esatto, nel prototipo mettere "int * nomevettore" "oppure "int [] nomevettore" è la stessa cosa, perchè l'array non è altro che un puntatore alla prima locazione dell'array 2) questa non la capisco, perchè dovrebbero esserci le graffe scusa? è una chiamata di procedura, non è la definizione di una procedura... 3) non del tutto corretto, per quanto riguarda la variabile b, il suo valore è effettivamente una copia del valore passato alla funzione (quindi di SIZE). Per quanto riguarda l'array, esso non è una copia, ma è l'array originale, in quanto il passaggio alla funzione avviene per riferimento, non per valore, perciò quello che vai a modificare sulla funzione è il vettore originario, non la copia (penso che questo lo sai già, non so se hai malposto la domanda dicendo che sono "copie di valori")
__________________
![]() Ultima modifica di akyra : 24-11-2004 alle 10:40. |
![]() |
![]() |
![]() |
#3 | |
Bannato
Iscritto dal: Nov 2004
Messaggi: 124
|
Quote:
per la 3 lo so che è il vettore originale perchè il C non passa mai vettori e non ritorna mai oggetti di tipo vettore ma soltanto puntatori quindi indirizzi di memoria fisici.... intendevo dire che non mi era chiaro perchè bisognava dargli un altro nome: void modificaArray(int b[], int size){ Cmq grazie mille, sei stato molto chiaro e io molto fesso a non accorgermi di aver sbagliato a digitare la condizione. Ciao e grazie Andrea |
|
![]() |
![]() |
![]() |
#4 | |
Senior Member
Iscritto dal: Feb 2004
Città: TREVISO
Messaggi: 902
|
Quote:
comunque sbagliare è normale, non ti preoccupare, a me è capitato di peggio ![]()
__________________
![]() |
|
![]() |
![]() |
![]() |
#5 |
Senior Member
Iscritto dal: Sep 2002
Città: Celano (AQ) Segno_Zodiacale: Leone Ascendente: Cammello Segni_Particolari: Quello
Messaggi: 9571
|
per quanto riguarda la funzione modificaArray(), puoi benissimo togliere il secondo parametro (cioè size) perchè tu hai già dichiarato con un macro all'inizio dl programma il valore di SIZE che è 5. quindi SIZE sarà visibile in tutto il programma.
nella inizializzazione dell'array a non inserire tra quadre la macro SIZE in quanto stai inizializzando l'array contestualmente alla dichiarazione e la taglia dell'array non serve. se invece avresti inizializzato l'array dopo la dichiarazione allora in fase di dichiarazione avresti dovuto mettere il SIZE. come ho detto non serve passare il parametro size (minuscolo) in quanto hai già dichiarato SIZE che essendo una macro è visibile in tutto il programma. per quanto riguarda il nome degli array tu puooi assegnare anche lo stesso nome perchè ti trovi in funzioni diverse. se invece avessi dichiarato una variabile globale col nome a[] allora questa sarebbe visibile in tutte le funzioni. siccome tu hai dichiarato a[] all'interno del main, in modificaArray() tu puoi assegnare qualsiasi nome all'array. |
![]() |
![]() |
![]() |
#6 | |
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Quote:
|
|
![]() |
![]() |
![]() |
#7 |
Bannato
Iscritto dal: Nov 2004
Messaggi: 124
|
si cionci...infatti il proff ha fatto così perchè negli esempi successivi che devo ancora studiarmi ha fatto i vettori e le matrici dinamiche....
Grazie a tutti voi, ora mi sono chiarito un po' le idee :-) |
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 00:22.