Newsgroup: it.comp.lang.c++
Titolo: la lezione sui puntatori? certo che l'ho capita...

#include <stdlib.h>
#define uint unsigned int
struct _point {
    double x;
    double y;
    double z;
};
struct _triangle {
    _point *vertex[3];
    double trasparency;
    double refraction;
    double reflession;
};
int main() {
    _point *pointptr;
    _triangle *triangleptr;
    uint numberofpoints = 1;
    uint numberoftriangles = 1;
    pointptr = (_point*)malloc(numberofpoints*sizeof(_point));
    triangleptr = (_triangle*)malloc(numberoftriangles*sizeof(_triangle));
    pointptr[0].x=1;
    pointptr[0].y=1;
    pointptr[0].z=0;
    triangleptr[0].vertex[0]=pointptr[0];
    free(pointptr);
    free(triangleptr);
}
allora, temo proprio di non aver capito molto sui puntatori, perchč
l'istruzione triangleptr[0].vertex[0]=pointptr[0]; genera errore durante la
compilazione... (cannot convert `_point' to `_point*' in assignment) come
mai?
inoltre, se io nella struct triangle volessi mettere un numero variabile di
puntatori a vertex, come faccio? (visto che, come immaginavo, questo
struct _polygon {
    uchar numberofvertex;
    _point *vertex[numberofvertex];
    double trasparency;
    double refraction;
    double reflession;
};
ultimo ma non meno importante non ho ben afferrata la differenza tra '.' e
'->'.
ringrazio sin d'ora tutti quanti vorranno aiutarmi.

 };
non funziona)

 '->'.
Purtroppo, quà non posso aiutarti... ti consiglio invece proprio di partire
dalle basi del C++, hai un libro di testo? Ce ne sono di ottimi da
scaricare, se t'interessa.
Non dico che non ti posso aiutare per prenderti in giro, come qualche tempo
fa qualcuno mi ha frainteso, solo che penso che quando le lacune sono così
grandi, se t'interessa veramente programmare in C++ sarebbe meglio partire
dalle basi.
Veramente, datti una letta agli esempi più semplici, dopo quando avrai
problemi pratici, posta pure che ne discutiamo...
P.S. nei tuoi programmi non c'è ombra di C++ (sicuro che non stia
frequentando un corso di linguaggio C) !
Ciao.

 ha scritto nel messaggio
news:bv6fsr$ht6$1...@lacerta.tiscalinet.it...


 Ciao.
Mi sento di intervenire solo sull'ultimo punto di questa diatriba. La
differenza tra . e -> è abbastanza semplice.
- . ti consente di accedere al campo di una struct
(ad esempio data
 struct punto
  {
   int x;
   int y;
  }
 struct punto uno;
 
 scrivendo uno.x posso accedere al valore di x
 quindi se scrivessi 
 printf("%d",&uno.x); 
 mi stampa a video il valore di x
) 
- L'operatore -> è forse un po' piu' complicato ma non piu' di tanto:
consideriamo un puntatore a struct 
struct punto *ptrpunto;
struct punto uno;
uno.x=12;
uno.y=4;
ptrpunto =&uno;//ora il puntatore punta ad uno
ptrpunto->x=4;//cosi' accedo alla componente x della variabile puntata
da ptrpunto
La sorpresa è che se stampo:
printf("%d",&uno.x);   ottengo 4
printf("%d",&uno.y);   ottengo 4
Un consiglio spassionato questa è forse una delle parti piu' difficili
e non è questione di C++, OOP e cose varie. E' questione di
C....armati di santa pazienza cercati in internet qualche esempio già
implementato e da rimodificare e prova e riprova !!! Come disse
qualcuno in un noto film "Welcome to the real World."
Paolo
ora ptrpunto è un puntatore alla struct. Come faccio ad accedere

 ha scritto nel messaggio
news:67c5edfb.04012...@posting.google.com...


 variabile, come faccio?
usa il vettore della libreria standard C++:
std::vector<_point *> vertex;
Nota: generalmente non e' consigliabile usare l'underscore come
iniziale dei nomi...
--
Ciao!
Skunkguru.

 > effettivamente quello che mi manca č un buon manuale c++ a cui far


...
[...]
Secondo me gli hai solo confuso le idee. Dando per scontato che l'OP
conosca l'operatore '*' di dereferenziazione dei puntatori:
int i = 2;
int * pi = &i;
int j = *pi;
E l'operatore '.' di accesso ai membri di una struttura o di una
classe:
struct S {
  int i;
};
S s;
s.i = 3;
L'operatore '->' e' definito come combinazione dei due operatori
precedenti:
S * sp = &s;
i = sp->i;
j = (*sp).i;
L'operatore '->' e' stato introdotto perche' le parentesi dell'esempio
qui sopra sono indispensabili per problemi di precedenza tra operatori
e la necessita' di accedere ai membri di una struttura tramite un
puntatore e' talmente frequente da rendere desiderabile il risparmio
di caratteri da digitare.
Ciao,
Nicola

 
La risposta purtroppo è un po' complessa perchè richiede come puoi
facilmente prevedere l'uso di una struttura dati chiamata lista. In
questo caso il vantaggio di una simile struttura dati è che non
conosci la cardinalità dell'insieme di dati su cui operi. Difetto:
francamente a parte i casi semplici di lista di interi o di caratteri
è molto facile rischiare di perdersi nei meandri della memoria....e
vedersi comparire d'improvviso sullo schermo il classico messaggio
"Segmentation Fault"....
Perdonami ma ci ho pensato un po' e non riesco al momento a fare un
esempio decente che sia anche compilabile. Se mi riuscirà nei giorni
successivi mi farò sentire ancora. Comunque prima di concludere ti
lascio un possibile link di manuali
http://www.science.unitn.it/cisca/manuali.html
.
Se non dovesse bastare vai a curiosare anche nei siti delle varie
università. Caso mai un aiuto ti può venire anche da google ponendo
come voce di ricerca uno fra i temi che piu' ti aggradano:
programmazione c, puntatori, strutture dati, algoritmi etc. etc.
Altrimenti vai anche a curiosare sempre su google nella sezione
Directory, magari anche nelle versioni non solo italiane.
Paolo

...

Capisco la tua obiezione ed in parte forse la condivido, io ho tentato
di spiegare le cose attingendo per lo piu' alla mia memoria. Tanto
piu' che il lavoro che sto facendo adesso nulla ha a che fare con il
mondo della programmazione. Riconosco forse di aver peccato nel dare
per scontato cose che non lo sono, ma ho tentato con esempi semplici
di far capire una cosa fondamentale che la persona in questione non
aveva ancora capito. Personalmente perdonami se te lo dico ma anche il
tuo secondo esempio non è propriamente esplicativo perchè rispecchia
per certi versi lo schema di un teorema matematico, bello ma privo di
concretezza se non lo vedi immediatamente applicato. Poi personalmente
ritengo che il problema principale non sia nè tuo nè mio, ma della
persona che ha posto la domanda che forse si deve mettere ancora nello
spirito giusto per abbordare simili argomenti: pazienza, tempo e
continui tentativi partendo dagli esempi piu' semplici ai piu'
complessi.
Ciao
Paolo

 ha scritto nel messaggio
news:67c5edfb.04013...@posting.google.com...


 ...
