[Risolto] Funzione con variabili "Byref"

Ciao a tutti,

Innanzi tutto mi scuso per i termini che ho usato nel titolo e che userò nel testo che segue di questo topic ma non sapendo esattamente che termini usare cercherò di spiegarmi come posso.

Il fatto di non saper esattamente che termini usare è anche il motivo per cui non sono riuscito a trovare on line la soluzione al mio problema che ora vado a spiegarvi.

ho fatto un programma per il mio mega all'interno del quale ho delle struct:

//Definizione struttura asse
struct Asse {

  int ValPwm;    
  float FloatPwm;

  int PinJogGo;  //Indirizzo pin Jog GO
  int PinJogBa;  //Indirizzo pin Jog BACK
  
  int PinFcZero; //Indirizzo pin finecorsa di Zero
  float PosZero; //Posizione da caricare in Abs allo zero (preset zero mark)
  float PosMax;  //Limite software Max
  float PosMin;  //Limite software Min
    
  float PosAbs;  //Posizione assoluta rispetto allo zero macchina
  float PosRel;  //Posizione relativa rispetto allo zero pezzo
  float Org;     //Quota Abs zero pezzo --------------------------------- (SALVATO IN EEPROM)
  
};

ho poi dichiarato i miei tre assi come strutture:

//Dichiarazione variabili pubbliche
Asse X;
Asse Y;
Asse Z;

Ho creato delle funzioni che vado a richiamare per modificare alcuni valori dei miei assi a queste funzioni però devo fornire l'asse da modificare e ottenere di ritorno l'asse modificato.

Ora arriviamo al mio problema, quando faccio cose simili in VB.Net uso Sub o Funzioni con variabili ByRef che fanno esattamente la stessa cosa:

Dim A as integer

Sub Add(ByRef Valore as Integer)
  Valore += 1
End Sub

In arduino per fare una cosa simile ho fatto così:

Asse SetPwmOut(Asse AX){

  AX.ValPwm = (int) AX.FloatPwm;         //Carico nel valore int della pwm il floatpwm
  AX.ValPwm = abs(AX.ValPwm);            //Rendo assoluto il valore della Pwm

  return AX;
  
}

E richiamare la funzione in questo modo:

X=SetPwmOut(X);

E' corretto?

Mi sembrava di aver letto da qualche parte che per fare ciò che voglio io basta mettere * prima della variabile tra parentesi o qualcosa di simile.

Qualcuno mi può dare dei chiarimenti? grazie

Quella funzione secondo me non ha molto senso, se vuoi modificare il valore e non modificare e poi assegnarlo ad altro. Meglio una void che modifica il valore.

Di default il passaggio per valore/copia o referenza/puntatore in C è un pò più complicata, perchè dipende da cosa passi. Le variabili semplici per valore. Anche le struct per valore. Gli array/vettori e gli oggetti per referenza.

Quindi nel tuo caso devi per forza passare Asse usando i puntatori o essendo in C++ usare i reference. Meglio i reference, che non richiedono di mettere la & nella chiamata.

void SetPwmOut(Asse & AX)  // per reference
{ AX.ValPwm = (int) AX.FloatPwm;         //Carico nel valore int della pwm il floatpwm
  AX.ValPwm = abs(AX.ValPwm);            //Rendo assoluto il valore della Pwm
}
...
chiamata:      SetPwmOut(X);

http://www.learncpp.com/cpp-tutorial/73-passing-arguments-by-reference/

Tramite puntatori la chiamata richiede passare l'indirizzo usando & e -> per l'accesso agli elementi di struct

void SetPwmOut(Asse * AX)  // per reference
{ AX->ValPwm = (int) AX->FloatPwm;         //Carico nel valore int della pwm il floatpwm
  AX->ValPwm = abs(AX->ValPwm);            //Rendo assoluto il valore della Pwm
}
...
chiamata:      SetPwmOut(&X);

Ti ringrazio infinitamente per il tuo aiuto, sei stato grande, sinceramente il primo metodo mi sembra il più semplice, li provo subito grazie

Willy_80: Ti ringrazio infinitamente per il tuo aiuto, sei stato grande, sinceramente il primo metodo mi sembra il più semplice, li provo subito grazie

Okkio che il primo metodo funziona perchè Arduino si programma in C++ Fosse C non funzionerebbe.