Oppure

Loading
20/11/08 15:52
JjJjJ
Ciao a tutti,
sono un nuovo utente ignorante in materia.
scrutando nel sito ho trovato un programma in c che mi permette di togliere i doppioni da una lista di numeri (Nome:Doppioni).
volevo chiedervi cose molto banali per voi ma per me montagne gigantesche:
come faccio ad usare tale programma con i puntatori??mi hanno detto male che esso è già un programma che usa i puntatori (con vettore[]) tale affermazione è giusta oppure no?sapete spiegarmi meglio??grazie infinite!!!!!!!
aaa
23/11/08 14:29
pierotofy
E' vera, quando tu definisci un array tipo:

char vettore[255];


Tu definisci implicitamente comunque un puntatore, in questo caso vettore, che farà riferimento all'elemento zero dell'array.

Quando tu accedi ad un elemento dell'array, il compilatore calcola l'indirizzo dell'elemento. Nel nostro caso supponendo che vettore faccia riferimento all'indirizzo di memoria 0x00001, se accediamo al 4° elemento dell'array con quest'espressione:

char t = vettore[3];


Il valore da assegnare viene calcolato sommando 3 a 0x000001 = 0x000004.

Interessante anche il fatto che essendo gli operandi commutabili (2 + 3 = 5 e 3 + 2 = 5), un compilatore che rispetta lo standard ANSI ti permetterà di accedere al 4° elemento del vettore anche scrivendo il codice in questa maniera:

char t = 3[vettore];


Quest'ultima forma è una sottigliezza puramente didattica e non andrebbe usata durante lo sviluppo del codice ovviamente perchè illogica.
Il mio blog: piero.dev
04/12/08 19:57
JjJjJ
Grazie mille per la risposta..
grazie al tuo aiuto sono riuscito a usare un puntatore per scorrere l'array vettore:

main ()
{
int i =0;
int *pint=NULL;

[..dopo tutto quello che c'è ho inserito..]

pint = int * vettore;

printf ("pint = %p, vettore = %p \n", pint, vettore);
for (i=0, i<50, i++)
{printf("el %2d: pint = %p, *pint=%d\n", i, pint, *pint);
pint++;
}
}

facendo l'eseguibile non ho trovato problemi.. la mia domanda è: cosa servono quei numeri che vengono scritti su schermo utilizzando < %p >, cioè l'indirizzo? sono numeri specifici oppure cambiano di volta in volta?

poi, quando io non utilizzo tutti e 50 numeri dell'array vettore[50], e termino prima il mio inserimento a n numeri, tutti i miei puntatori n+1 fino a 50 mi danno come risultato numeri non inseriti... è normale? perché vengono fuori se io quei puntatori non li dovrei usare??

grazie mille scusa il disturbo!:)
aaa
07/12/08 10:13
JjJjJ
Perchè nella funzione number si utilizzano 2 interi come m e n per il controllo su interi x e y? non ne basta solo uno per vedere se vi sono altri numeri doppi all'interno della serie iniziale?
aaa
07/12/08 18:01
pierotofy
Postato originariamente da JjJjJ:
cosa servono quei numeri che vengono scritti su schermo utilizzando < %p >, cioè l'indirizzo? sono numeri specifici oppure cambiano di volta in volta?


Quei "numeri" indicano l'indirizzo di memoria dell'elemento. Parlando di memoria allocata posso cambiare di volta in volta.

quando io non utilizzo tutti e 50 numeri dell'array vettore[50], e termino prima il mio inserimento a n numeri, tutti i miei puntatori n+1 fino a 50 mi danno come risultato numeri non inseriti... è normale? perché vengono fuori se io quei puntatori non li dovrei usare??


E' normale, quando dichiari l'array lui mette a disposizione del programma N blocchi in memoria per salvare i tuoi dati, se dopo però non utilizzi tutti e 50 gli elementi è compito tuo fermare la procedura che visualizza gli elementi inseriti prima di 50, altrimenti lui visualizzerà anche gli elementi che non hai inserito... che se non appropriamente inizializzati, possono contenere chissà quale valore. E' buona pratica quindi utilizzare, subito dopo aver dichiarato l'array, la funzione memset per inizializzare tutti gli elementi dell'array. Alcuni compilatori lo fanno implicitamente per te, ma è buona pratica farlo manualmente.

Perchè nella funzione number si utilizzano 2 interi come m e n per il controllo su interi x e y? non ne basta solo uno per vedere se vi sono altri numeri doppi all'interno della serie iniziale?


Non ho capito... potresti spiegarti meglio?
Il mio blog: piero.dev
08/12/08 16:01
JjJjJ
Cerco di spiegarmi un attimino meglio.
Nella funzione svolgimento lei ha dichiarato x=0, y=0 dove presumo che x stia per il numero doppio e y variabile che andrà a incrementare il valore del numero doppio x nella funzione number. giusto?

la mia domanda si rivolge alla funzione number;
int number(int m, int n, int vettore[])

non capisco perché si debba usare sia int m che int n per vedere quante volte il numero doppio è stato inserito. non basta soltanto una variabile tra le 2 per il controllo?

Grazie mille
aaa
08/12/08 21:51
pierotofy
Devi postarci il contenuto della funzione number... che ne so io perchè vuole due variabili se non conosco il suo contenuto.
Il mio blog: piero.dev
09/12/08 6:55
JjJjJ
int number (int m, int n, int vettore[])
{
int y=0, x=0;
do
{
if (vettore[n]==vettore[y])
x++;
y++;
}
while (y<m);
return x;
}

Nella funzione svolgimento x mi diceva se il numero era un doppione:
[...]
if(vettore[i]==result[x])
presenza=1; //quindi doppio
x++;
}
while (x<a && presenza==0);
[...]
aaa