Salve a tutti. Ho un problemino su questo programma: in pratica la funzione TerzaCoordinata dovrebbe restituirmi tutti i nomi dei punti in cui la terza coordinata sia maggiore di un valore dato. Il problema è che mi mostra solo l'ultimo di questi nomi ripetuto n volte. Ho capito pure il perchè: in pratica il puntatore alla struttura non avanza, e mi scrive sempre la stessa cosa. Ho provato con p++ ma non funziona lo stesso. Il puntatore alla struttura dovrebbe iniziare dal primo elemento ma non so come scriverglielo al compilatore. Perchè in teoria scrivere Punto3D *p=new Punto3D[n] l'operatore new mi riestituisce l'indirizzo di memoria del primo elemento allocato nell'heap. Ma riscrivendolo commetto un errore e comunque non funziona. Come ovviare? Grazie. Il codice è il seguente:
#include <iostream>
using namespace std;
struct Punto3D
{
double x, y, z;
char *nome;
};
void LeggePunto3D (Punto3D *p, int); // Prototipi
void LeggeVettoriPunti3D (Punto3D *p, int);
void TerzaCoordinata (Punto3D *p, int, int);
int main ()
{
int n;
cout << "Inserisci il numero di punti: ";
cin >> n;
Punto3D *p; // Puntatore alla struttura Punto3D
p=new Punto3D[n]; //Allocazione dinamica di un array di n strutture
p->nome=new char[15]; // ..e di un array di caratteri
LeggePunto3D (p,n); // Funzione che prende i dati di input
LeggeVettoriPunti3D (p,n); /*Funzione che restituisce gli indirizzi di ciascun elemento
dell'array*/
cout << "Inserisci un valore: ";
int valore;
cin >> valore;
TerzaCoordinata (p,n,valore);
delete [] p; // Deallocazione finale. Ad ogni new deve corrispondere un delete
delete [] p->nome;
cout << endl << endl;
system ("PAUSE");
return 0;
}
void LeggePunto3D (Punto3D *p, int n)
{
for (int i=0; i<n; i++)
{
cout << "Inserisci le coordinate x,y e z: ";
cin >> p->x >> p->y >> p->z;
cout << "Inserisci il nome: ";
cin.sync();
cin.getline (p->nome,15);
}
}
void LeggeVettoriPunti3D (Punto3D *p, int n)
{
for (int i=0; i<n; i++)
cout << "Indirizzo dell'elemento " << i << " : " << &p[i] << endl;
}
void TerzaCoordinata (Punto3D *p, int n, int valoredato)
{
for (int i=0; i<n; i++)
{
if (p->z > valoredato)
cout << p->nome << endl;
}
}