Array di puntatori ad oggetti. Problema incremento puntatore

Chiedo cortesemente aiuto in questo progetto che sto realizzando per Arduino Uno. Premetto che lo stesso codice funziona correttamente se compilato per x86 (con le opportune modifiche).

Ho una classe PointXY dalla quale istanzio gli oggetti sky_p0, sky_p1, ..., sky_p8. Praticamente sono 9 punti con coordinate X e Y.
L'indirizzo di questi oggetti l'ho messo nell'array di puntatori *skyPoly[] in modo da passarlo alla classe Cam che ne farà uso.
Richiamando il metodo Sky.printPoints() solo le coordinate X e Y del primo punto vengono stampate correttamente. Sembra che il puntatore non venga incrementato correttamente.

Grazie

    class PointXY
    {
        public:
            PointXY(int Px, float Py);
            int X;
            float Y;
    };
	
    PointXY::PointXY(int Px, float Py)
    {
        X = Px;
        Y = Py;
    }
	
    class Cam
    {
        public:
            Cam(PointXY *p, int nrPolyPoints);
            void printPoints();

        private:
            int nrPoints;
            PointXY *points;
    };

    Cam::Cam(PointXY *p, int nrPolyPoints)
    {
        points = p;
        nrPoints = nrPolyPoints;    
    }

    void Cam::printPoints()
    {
        for (int i = 0; i < nrPoints - 1 ; i++)
        {           
            Serial.print((points+i)->getX()); Serial.print(" ");
			Serial.print((points+i)->getY());
            Serial.println();        
        }
    }

	PointXY sky_p0(0, 0.0f);
	PointXY sky_p1(150, 100.0f);
	PointXY sky_p2(300, 0.0f);
	PointXY sky_p3(450, 100.0f);
	PointXY sky_p4(500, 0.0f);
	PointXY sky_p5(750, 100.0f);
	PointXY sky_p6(900, 0.0f);
	PointXY sky_p7(1100, 100.0f);
	PointXY sky_p8(1200, 0.0f);

	PointXY *sky_poly[] = {&sky_p0, &sky_p1, &sky_p2, &sky_p3, &sky_p4, &sky_p5, &sky_p6, &sky_p7, &sky_p8}; // Array of pointer to the class type
	Cam Sky(*sky_poly,9);


	void setup() {
	}

	void loop() {
		Sky.printPoints();
		delay(1000);
	}


Buongiorno e benvenuto nella sezione Italiana del forum,

cortesemente, come prima cosa, leggi attentamente il REGOLAMENTO di detta sezione, (... e, per evitare future possibili discussioni/incomprensioni, prestando molta attenzione al punto 15), dopo di che, come da suddetto regolamento (punto 16.7), fai la tua presentazione NELL'APPOSITA DISCUSSIONE (... quello che vedi in blu è un link, fai click su di esso per raggiungere la discussione) spiegando bene quali esperienze hai in elettronica e programmazione, affinché noi possiamo conoscere la tua esperienza ed esprimerci con termini adeguati.

Grazie,

Guglielmo

P.S.: Ti ricordo che, purtroppo, fino a quando non sarà fatta la presentazione nell’apposita discussione, nel rispetto del succitato regolamento nessuno ti risponderà (eventuali risposte o tuoi ulteriori post, verrebbero temporaneamente nascosti), quindi ti consiglio di farla al più presto. ;)

Fateci sapere quando avete finito la presentazione, ci sono alcune cose da dire sul vostro codice.

scusatemi ma mi ero perso la presentazione... ora è tutto ok

benvenuto nel forum.

Nel tuo codice

hai le lettere maiuscole per le variabili di istanza, ma le usi senza le maiuscole.

Non dovrebbe nemmeno compilare.

Hai pubblicato il codice corretto?


Cam Sky(*sky_poly, 9) è sbagliato perché sky_poly dereferenzia il primo elemento dell'array, che è di tipo PointXY. Dereferenziare produce un oggetto PointXY, ma il costruttore di Cam si aspetta un PointXY* (un puntatore al primo elemento di un array di oggetti PointXY). Si sta passando un singolo oggetto invece di un puntatore a un array. La chiamata corretta dovrebbe essere Cam Sky(sky_poly, 9); per passare direttamente l'array di puntatori.

Nel semplificare il codice c'è stata una svista da parte mia per quanto riguarda le variabili di istanza. In questo esempio consideriamo X e Y maiuscole.

Giustamente @J-M-L, la riga di codice

	Cam Sky(*sky_poly,9);

dereferenzia solamente il primo elemento dell'array.

Ho modificato quindi il richiamo del costruttore della classe Cam in:

   Cam Sky(sky_poly,9);

Ho dovuto però correggere la classe Cam utilizzando un puntatore di puntatore

   class Cam
    {
        public:
            Cam(PointXY **p, int nrPolyPoints);
            void printPoints();

        private:
            int nrPoints;
            PointXY **points;
    };


    Cam::Cam(PointXY **p, int nrPolyPoints)
    {
        points = p;
        nrPoints = nrPolyPoints;    
    }

Modificando anche Sky.printPoints() in:

   void Cam::printPoints()
    {
        for (int i = 0; i < nrPoints ; i++)
        {            
            Serial.print("P"); Serial.print(i); Serial.print(" ");
            Serial.print(points[i]->getX()); Serial.print(" ");
            delay(200);
            Serial.print(points[i]->getY());
            Serial.println();
            delay(200);
        }
    }

ottengo il risultato voluto:


Sky.printPoints(); restituisce

P0 0 0.00
P1 150 100.00
P2 300 0.00
P3 450 100.00
P4 500 0.00
P5 750 100.00
P6 900 0.00
P7 1100 100.00
P8 1200 0.00

C'e' un motivo per cui X e Y sono pubblici, visto che l'accesso in lettura a quei membri di PointXY() lo fai con delle getX e getY ?

@nid69ita In realtà ci sono i metodi getX() e getY() per accedere alle variabili x e y che nel progetto completo sono private. Purtroppo pulendo il codice mi è sfuggita questa cosa.