Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - Informazioni su programmazione
Forum - C/C++ - Informazioni su programmazione

Avatar
JjJjJ (Normal User)
Newbie


Messaggi: 6
Iscritto: 20/11/2008

Segnala al moderatore
Postato alle 16:52
Giovedì, 20/11/2008
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!!!!!!!

PM Quote
Avatar
pierotofy (Admin)
Guru^2


Messaggi: 6230
Iscritto: 04/12/2003

Segnala al moderatore
Postato alle 15:29
Domenica, 23/11/2008
E' vera, quando tu definisci un array tipo:

Codice sorgente - presumibilmente C/C++

  1. 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:

Codice sorgente - presumibilmente C/C++

  1. 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:

Codice sorgente - presumibilmente C/C++

  1. 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: https://piero.dev
PM Quote
Avatar
JjJjJ (Normal User)
Newbie


Messaggi: 6
Iscritto: 20/11/2008

Segnala al moderatore
Postato alle 20:57
Giovedì, 04/12/2008
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!:)

PM Quote
Avatar
JjJjJ (Normal User)
Newbie


Messaggi: 6
Iscritto: 20/11/2008

Segnala al moderatore
Postato alle 11:13
Domenica, 07/12/2008
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?

PM Quote
Avatar
pierotofy (Admin)
Guru^2


Messaggi: 6230
Iscritto: 04/12/2003

Segnala al moderatore
Postato alle 19:01
Domenica, 07/12/2008
Testo quotato

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.

Testo quotato


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.

Testo quotato


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: https://piero.dev
PM Quote
Avatar
JjJjJ (Normal User)
Newbie


Messaggi: 6
Iscritto: 20/11/2008

Segnala al moderatore
Postato alle 17:01
Lunedì, 08/12/2008
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

PM Quote
Avatar
pierotofy (Admin)
Guru^2


Messaggi: 6230
Iscritto: 04/12/2003

Segnala al moderatore
Postato alle 22:51
Lunedì, 08/12/2008
Devi postarci il contenuto della funzione number... che ne so io perchè vuole due variabili se non conosco il suo contenuto.


Il mio blog: https://piero.dev
PM Quote
Avatar
JjJjJ (Normal User)
Newbie


Messaggi: 6
Iscritto: 20/11/2008

Segnala al moderatore
Postato alle 7:55
Martedì, 09/12/2008
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==result[x])
presenza=1; //quindi doppio
x++;
}
while (x<a && presenza==0);
[...]

PM Quote
Avatar
JjJjJ (Normal User)
Newbie


Messaggi: 6
Iscritto: 20/11/2008

Segnala al moderatore
Postato alle 13:33
Martedì, 09/12/2008
mentre funzione svolgimento

int svolgimento (int a, int vettore[], int result [], int volte[])
{ int p=1, presenza=0, x=0, y=0, z=1;

vettore[0]=result[0]; //primo numero mai doppio
volte[0]=number(a,0,vettore);

for(int i=1, i<a, i++)
{x=0;
do
{if (vettore==result[x])
   presenza=1;
   x++;}
   while(x<a && presenza==0);

if(presenza ==0)
{result[p]=vettore;
p++;
volte[z]=number(a,i,vettore);
z++;
}
presenza=0;
}
return p;

}



grazie 1000 :asd::asd:

PM Quote