Parametri Pointer o ByRef..?

di il
7 risposte

Parametri Pointer o ByRef..?

Buongiorno, progetto di automazione microcontrollore… ma dubbio più tecnico sulla programmazione.

Ho una classe [SetPoint] che espone varie proprietà di gestione di un Setpoint appunto… e devo gestire una rampa di raccordo tra un SP(n) ed un SP(n+1).

Per la rampa calcolo il dy[sp(n+1)-sp(n)] con dt=300s

A parte questo, la sub sotto ha 3 fasi, inizio rampa in cui calcola il dy di incremento e rileva la direzione che non cambia durante la rampa ne la stasi, il fine rampa è a raggiungimento Sp(n+1), quello che nella sub è il parametro [finalsp]

Ora io ho passato come pointer l'oggetto SP e le variabili direzione e dy in quanto vengono usate anche fuori e devo pertanto modificarne il valore.

Detta così mi chiedevo se ha senso usare i pointer o se meglio/equivalente definire i parametri byref(&) poichè alla fine li uso così…

void MoveToNewSetpoint(SetPoint *sp, float finalsp, uint8_t *direction, float *dy) {
    const float RAMP_TIME = 300; // tempo di rampa in secondi
    /*
  	Calcola il dVariazione in base al dY e dT
  	m=(y1-y0)/(x1-x0)
  	[dx]=tempo (300sec fisso)
  	[y0]= sp attuale da incrementare con gradiente dy
  	[y1]= sp finale
  	Questa Routine viene eseguita ogni 1sec in fase di variazione
  	*/
    if (sp == nullptr || direction == nullptr || dy == nullptr) {
        return 27; // Valore di sicurezza in gradi
    }

    float SP_Y0 = sp->getthreshold();
    float SP_Y1 = finalsp;
    switch (*direction) {
        case RAMP_START:
            *dy = (SP_Y1 - SP_Y0) / RAMP_TIME; 
            if (SP_Y0 < SP_Y1) {
                *direction = RAMP_UP;
            } else if (SP_Y0 > SP_Y1) {
                *direction = RAMP_DOWN;
            } else {
                *direction = RAMP_STOP;
                *dy = 0.0;
            }
            break;

        case RAMP_UP:
            SP_Y0 += *dy;
            if (SP_Y0 >= SP_Y1) {
                *direction = RAMP_STOP;
                SP_Y0 = SP_Y1;
            }
            sp->threshold(SP_Y0);
            break;

        case RAMP_DOWN:
            SP_Y0 += *dy;
            if (SP_Y0 <= SP_Y1) {
                *direction = RAMP_STOP;
                SP_Y0 = SP_Y1;
            }
            sp->threshold(SP_Y0);
            break;

        case RAMP_STOP:
            *dy = 0.0;
            break;
    }
}

Grazie

7 Risposte

  • Re: Parametri Pointer o ByRef..?

    Potresti usare i reference, anche se le differenze sono poche

    https://www.google.com/amp/s/www.geeksforgeeks.org/pointers-vs-references-cpp/amp/

    Piuttosto non comprendo il

    return 27;

    per una void…

  • Re: Parametri Pointer o ByRef..?

    Corretto è un refuso, prima era una function e restituiva il valore float di SP, quando ho modificato passando i parametri è rimasto ed il Compilatore di Arduino mangia tutto…

    Come compreso leggendo la bibliografia, tra cui appunto anche il link che mi hai passato, nel mio caso specifico non ci sono differenze di sostanza, nel mio caso non ho riassegnazioni da fare… e forse risulta “per me” più leggibile potendo usare il [.] al posto poi del [->] per l'accesso a proprietà e metodi.

  • Re: Parametri Pointer o ByRef..?

    Ok, per il refuso.

    Capisco che sia meno problematico usare la sintassi con il . per chi non è abituato e in questo caso va anche bene dal punto di vista operativo.

    Per chi, come me, è cresciuto a pane e puntatori con il C (abitudine derivata da anni di assembly(er) a 8 bit con registri puntatori), viene naturale usare i puntatori. Non ne potrei fare  a meno neanche usando il C++ anche se possono creare tanti problemi se usati male.

  • Re: Parametri Pointer o ByRef..?

    04/05/2024 - oregon ha scritto:


    Ok, per il refuso.

    Capisco che sia meno problematico usare la sintassi con il . per chi non è abituato e in questo caso va anche bene dal punto di vista operativo.

    Non dovendo produrre Codice C++ per lavoro, posso fare di questo una passione e lo reputo rilassante… purtroppo essendo “molto” pignolo mi preme capire a fondo i concetti, ci gioco finchè non capisco bene… quindi lo stesso codice lo scriverò n volte per fare tutti i cambiamenti volti ad imparare…

    Ho iniziato a scrivere delle classi le usavo in VB6 e VBA non vorrai che non ne sfrutti le potenzialità quì…, sono ancora molto maccheroniche, ma imparo e gioco.

    Come succedeva negli anni 90 con il Vb4/5 perdevo le notti… mi succede ancora… per studiare e provare…,anche perchè non ho altro tempo che dopo le 22 la sera, ma reputo ancora molto forte questo stimolo… mi servirebbero giornate molto lunghe… anche perchè non sopporto non riuscire a fare le cose come voglio io…

    Per chi, come me, è cresciuto a pane e puntatori con il C (abitudine derivata da anni di assembly(er) a 8 bit con registri puntatori), viene naturale usare i puntatori. Non ne potrei fare  a meno neanche usando il C++ anche se possono creare tanti problemi se usati male.

    Ho letto un sacco di testi, e concettualmente ho capito come e cosa, ma la sensibilità di capire quando è opportuno e quando no e come sfruttarli ancora è lontano, serve sbatterci la testa… anche perchè mi ci perdo ancora troppo ed è indice di nonsolidità concettuale.

  • Re: Parametri Pointer o ByRef..?

    Le linee guida dicono “usa il reference quando puoi, usa il puntatore quando devi”. Se vuoi seguire questa logica, userai il reference nelle interfacce della tua applicazione, mentre il puntatore sotto il cofano quando c'è da gestire la memoria, strutture dati o interfacciarsi con librerie esterne che ne fanno uso.

    Per i valori nulli puoi usare std::optional.

    Nel caso dei microcontrollori però avrei qualche dubbio, visto che ti troverai a lavorare con funzioni di sistema e tanto C, che fanno uso dei puntatori, oltre al fatto che come hanno detto sopra il C++ a volte è “opaco”, ad esempio il sopracitato optional potrebbe contenere puntatori ed allocazioni di cui non hai il controllo.

  • Re: Parametri Pointer o ByRef..?

    C'e' una differenza filosofica/subdola tra reference e puntatore.

    Iniziamo con il dire che un reference E' un puntatore.

    Quello che succede e' che il compilatore aggiunge AUTOMATICAMENTE un “&” (prendi l'indirizzo) ed un “*” (vai a quell'indirizzo)
    OGNI VOLTA che deve essere passato un valore via reference OPPURE un parametro di tipo reference viene usato.

    Questo fa si che, A PARTE FORZATURE fatte da parte del programmatore, un reference NON POTRA' MAI ESSERE NULLO.

    Un “puntatore”, invece, PUO' essere NULLO (a suo tempo rappresentato con lo 0 --zero-- e la macro NULL, ora anche con la keyword “nullptr”). E poiche' il puntatore potrebbe essere nullo, in “teoria” il codice dovrebbe SEMPRE fare i controlli del caso.

    Il “pasticcio impasticciato" nasce quando si vuole usare un puntatore come reference, per il motivo di cui sopra (essere NULLO).
    In “teoria” usare un reference come puntatore NON E' un problema per la natura stessa di reference: e' un puntatore SICURAMENTE NON NULLO.

    MA, ovviamente, SE si converte un puntatore (che potrebbe essere NULLO) in un reference ed il reference in un puntatore, si e' fortunati SE l'applicazione sputa SOLO in un occhio e non in tutti e due :-)

    Il pasticcio si impasticcia ulteriormente quando si usa il trucco del puntatore per fare delle conversioni di tipi. Ma questa e' un'altra storia.

    Il concetto “std::optional” e' abbastanza recente e cerca di FORZARE il programmatore a RICORDARSI che il puntatore potrebbe essere NULLO e quindi fare i controlli del caso. AIUTA MA NON RISOLVE i problemi di cattiva programmazione.

  • Re: Parametri Pointer o ByRef..?

    Grazie dei suggerimenti, avanzati per me al momento, ma apprezzati.

    Unica cosa, come premesso il codice che uso lavora su micricontrollori, Arduino, ed il compilatore non supporta ancora std::optional, ma il concetto è chiaro.

Devi accedere o registrarti per scrivere nel forum
7 risposte