PDA

Visualizza la versione completa : [C] Impostare le variabili come locali e non globali


giumanji
04-02-2012, 16:19
Ho finito il programma che mi permette di copiare i valori pari di vett_1 e vett_2 in un terzo vettore vett_3 e funziona correttamente adesso:


#include <stdio.h>
#include <stdlib.h>
/*Funzioni*/
void inserimento();
void scansione();
void pari();
/*Variabili*/
int l,n,i,z;
int vett_1[];
int vett_2[];
int vett_3[];
main()
{
inserimento();
scansione();
pari();
system("PAUSE");
}


void inserimento()
{
printf("Numero valori da inserire nei vettori: ");
scanf("%d",&l);
vett_1[l];
vett_2[l];
vett_3[l*2];
printf("\n");
for(i=0;i<l;i++){
printf("Inserisci il %d%c valore del primo vettore: ",i+1,248);
scanf("%d",&vett_1[i]);
}
printf("\n");
for(i=0;i<l;i++){
printf("Inserisci il %d%c valore del secondo vettore: ",i+1,248);
scanf("%d",&vett_2[i]);
}
}


void scansione()
{
z=0;
for(i=0;i<l;i++){
if(vett_1[i]%2==0){
vett_3[z]=vett_1[i];
z++;
}
}
for(i=0;i<l;i++){
if(vett_2[i]%2==0){
vett_3[z]=vett_2[i];
z++;
}
}
}


void pari()
{
int MAX=z;
printf("\nNumeri pari inseriti nei due vettori %d \n",z);
printf("Elenco dei numeri pari :\n") ;
for(z=0;z<MAX;z++)
printf("Elementi pari %d\n",vett_3[z]);
}


Mi chiedevo: C'è un modo per evitare di scrivere tutte le variabili utilizzate come globali ma farle utilizzare solo all'interno delle funzioni in modo che il programma continua a funzionare correttamente?? Perchè facendo diverse prove quando cercavo di scriverle solo all'interno delle funzioni il programma non funziona...avete qualche suggerimento?? Grazie in anticipo per gli aiuti.

oregon
04-02-2012, 16:34
Dichiarale nel main e passale alle funzioni come argomento.

Prova e facci vedere come modifichi il codice ...

giumanji
04-02-2012, 16:51
#include <stdio.h>
#include <stdlib.h>
/*Funzioni*/
void inserimento(int, int);
void scansione(int, int, int);
void pari(int);
/*Variabili*/
int vett_1[];
int vett_2[];
int vett_3[];
main()
{
int l,n,i,z;
inserimento(l,i);
scansione(z,i,l);
pari(z);
system("PAUSE");
}


void inserimento(int l, int i)
{
printf("Numero valori da inserire nei vettori: ");
scanf("%d",&l);
vett_1[l];
vett_2[l];
vett_3[l*2];
printf("\n");
for(i=0;i<l;i++){
printf("Inserisci il %d%c valore del primo vettore: ",i+1,248);
scanf("%d",&vett_1[i]);
}
printf("\n");
for(i=0;i<l;i++){
printf("Inserisci il %d%c valore del secondo vettore: ",i+1,248);
scanf("%d",&vett_2[i]);
}
}


void scansione(int z, int i, int l)
{
z=0;
for(i=0;i<l;i++){
if(vett_1[i]%2==0){
vett_3[z]=vett_1[i];
z++;
}
}
for(i=0;i<l;i++){
if(vett_2[i]%2==0){
vett_3[z]=vett_2[i];
z++;
}
}
}


void pari(int z)
{
int MAX=z;
printf("\nNumeri pari inseriti nei due vettori %d \n",z);
printf("Elenco dei numeri pari :\n") ;
for(z=0;z<MAX;z++)
printf("Elementi pari %d\n",vett_3[z]);
}

Dici così? E i vett dove li dichiaro? Xò non funziona...

SancheZ
04-02-2012, 19:13
Ci credo che non funziona.

Se scrivi cosi', all'uscita delle funzioni inserimento(), scansione() e pari() nelle variabili che utilizzi come parametro avrai gli stessi valori che avevi in partenza, poiché tali variabili vengono passate per COPIA e non per RIFERIMENTO. Dovresti piuttosto usare una forma del tipo:

void scansione(int *z, int *i, int *l)

ed invocarla da main() con

scansione(&z,&i,&l);

perché possa funzionare.

Altra cosa: volevi rendere locali solo le variabili l,n,i e z o anche i vettori? :)

giumanji
05-02-2012, 12:39
Così stai utilizzando i puntatori giusto?? cmq volevo rendere locali anche i vettori...e grazie per l'aiuto ! :) :)

oregon
05-02-2012, 12:47
Originariamente inviato da giumanji
Così stai utilizzando i puntatori giusto?? cmq volevo rendere locali anche i vettori...e grazie per l'aiuto ! :) :)

Devi usare i puntatori se devi passare argomenti che devono essere modificati.

Prova anche da solo con i vettori ... poi vediamo cosa hai scritto (altrimenti non impari ...)

giumanji
05-02-2012, 13:00
Ho capito ...ho un pò di problemi con i puntatori perchè sul libro vengono spiegati male. Appena trovo una lezione completa ed imparo ad usarli allora proverò a farlo in questo modo. Grazie per l'aiuto. :)

Daisyland
05-02-2012, 14:25
Originariamente inviato da giumanji
Ho finito il programma che mi permette di copiare i valori pari di vett_1 e vett_2 in un terzo vettore vett_3 e funziona correttamente adesso:
.....

Ma quando compili questo codice, il tuo originale, non ti segnala 3 warning per tutti e 3 i vettori ?


[Warning] array 'vett_1' assumed to have one element

giumanji
05-02-2012, 14:39
Si me li da xkè sono dichiarati fuori dal main senza scrivere nnt dentro le parentsi quadre...se non utilizzo le funzioni e dichiaro i vettori all'interno del main dopo avere richiesto la lunghezza così:


......
......
main()
{
printf("Numero valori da inserire nei vettori: ");
scanf("%d",&l);
int vett_1[l];
int vett_2[l];
int vett_3[l*2];
printf("\n");
for(i=0;i<l;i++){
printf("Inserisci il %d%c valore del primo vettore: ",i+1,248);
scanf("%d",&vett_1[i]);
}
......
......
......

non mi segna nessun errore xò siccome non so come passarli alle funzioni sono costretto a dichiararli fuori dal main...tu sai come eliminare questi warning??

oregon
05-02-2012, 14:42
Il fatto di allocarli in quel modo è consentito solo con compilatori C99.

Non lo puoi fare con tutti gli altri e non è raccomandabile.

Dovresti utilizzare l'allocazione dinamica usando dei puntatori e le funzioni apposite (malloc, calloc).

Alle funzioni passerai i puntatori dopo avere allocato nel main lo spazio necessario ...

Loading