Object name to String

dichiaro un oggetto Servo

Servo Test_servo;

poi lo "attaccho" poi lo uso per muovere il servo di x gradi ecc, ecc

Ma se volessi stamparmi il nome dell'oggetto Servo? Non passando al Serial.print un nome hardcodato ma il suo nome passato come argomento di una funzione, come si fa ?

Cioe' una cosa tipo:

Serial.print (x);

dove x sarebbe il nome dell'oggetto Test_servo convertito in stringa per essere stampato. Una conversione, appunto, ObjectName->String

Thanks

Per quel che ricordo io, questo compilatore non lo fà, la trovi come features su compilatori tipo Visual C Studio di M$. (Java lo fa)
Poi magari qualcuno mi smentisce.

Qui un metodo per farlo in C++

Però non sò con quale compilatore. Usa il preprocessore. Bisognerebbe provare con Arduino.

EDIT: questo mi compila ma non posso provarlo:

#include <Servo.h>
#define GET_NAME(x) #x
Servo MyServo;

void setup()
{ Serial.println( GET_NAME(myServo) );
}

void loop(){}

Il metodo Attach() restituisce un valore che indica (mi pare, vedendo il codice) il numero identificativo delll'oggetto Servo agganciato all'interrupt se l'operazione va a buon fine. Quindi basta che tu faccia un'assegnazione durante l'attach. Esempio

byte risultato = myServo.attach(x, y, z);

Se risultato ha un qualche valore, vuol dire che l'operazione ha avuto successo.

nid69ita:
EDIT: questo mi compila ma non posso provarlo:

#include <Servo.h>

#define GET_NAME(x) #x
Servo MyServo;

void setup()
{ Serial.println( GET_NAME(myServo) );
}

void loop(){}

Grazie Nid della risposta,
se ho capito con questo metodo si punta a stampare il nome della Classe, nel mio caso “Servo”, non il nome dell’oggetto, in questo caso “myServo”.
Cmq non funziona, viene stampato solo “myServo” senza il nome della classe. A me interessa solo stampare il nome dell’oggetto

Sempre in quel link, per la classe usa:

typeid(myServo).name()

Ma anche questo dipende dal compilatore. Nel link parlano (sembra) di gcc, sarebbe da provare.

leo72: Esempio

byte risultato = myServo.attach(x, y, z);

Se risultato ha un qualche valore, vuol dire che l'operazione ha avuto successo.

Grazie anche a te del tuo parere, se ho capito bene questa sarebbe una conferma dell'avvenuto attach, non sto chiedendo questo, semplicemente una volta dichiarato un oggetto della classe Servo con:

Servo MyServo;

mi servirebbe poter stampare il nome dell'oggetto, quindi a livello logico dovrei fare:

x=nome oggetto; serialprint (x); ricevere in stampa: MyServo

Me la leggo dopo con calma.

Grazie anche a te,

ho buttato giu’ uno sketch di test per avere una base di discussione uguale per tutti, ho usato una funzione per passare l’argomento che mi interessa sia per far muovere il servo (e questo funziona), sia per stamparne il nome (che fa incazzare di brutto il compilatore :stuck_out_tongue_closed_eyes:)

x Leo (quanto avevi ragione sulle funzioni con passaggi di argomenti, altro che procedure singole come facevo io, sono una goduria) :slight_smile:

#include <Servo.h>
Servo MyServo;

void setup() {
  Serial.begin(115200);
  MyServo.attach(7);
  Test_Servo(MyServo);
}

void loop() {}

void Test_Servo(Servo x)
{
  delay(2000);
  x.write(50);
  Serial.println (x);
}

nid69ita:
Sempre in quel link, per la classe usa:

typeid(myServo).name()

Ma anche questo dipende dal compilatore. Nel link parlano (sembra) di gcc, sarebbe da provare.

Provato ora di pranzo:

#include <Servo.h>
#define GET_NAME(x) #x
Servo MyServo;

void setup()
{ delay(1000);
  Serial.begin(9600);
  Serial.println( GET_NAME(MyServo) );
  Serial.println( typeid(MyServo).name() );           //error
}

void loop(){}

La macro okay (ritorna il nome dell’oggetto).
Per la typeid, il compilatore dà errore:
sketch_feb11a:9: error: cannot use typeid with -fno-rtti
perchè un parametro passato al compilatore ne impedisce l’uso. Probabilmente per rendere l’eseguibile più leggero vengono eliminate le informazioni dei tipi/classi/etc. a runtime. (Almeno credo)

EDIT: da sito GCC:
“-fno-rtti
Disable generation of information about every class with virtual functions for use by the C++ runtime type identification features (dynamic_cast' and typeid’). If you don’t use those parts of the language, you can save some space by using this flag. Note that exception handling uses the same information, but it will generate it as needed.”

nid69ita: La macro okay (ritorna il nome dell'oggetto).

Scusa ma ti sbagli, come ho detto nel mio precedente intervento il tuo sketch non stampa il nome dell'oggetto ma semplicemente la stringa "MyServo" perche' l'hai hardcodata nella serial print. Cioe' se inserisci quella macro nel mio sketch vedrai che stampa "x" non "MyServo"

Testato:

nid69ita: La macro okay (ritorna il nome dell'oggetto).

Scusa ma ti sbagli, come ho detto nel mio precedente intervento il tuo sketch non stampa il nome dell'oggetto ma semplicemente la stringa "MyServo" perche' l'hai hardcodata nella serial print. Cioe' se inserisci quella macro nel mio sketch vedrai che stampa "x" non "MyServo"

Confermo. La macro stampa il nome della variabile, fruttando la Stringification Mentre per stampare la classe dell'oggetto si può fare con la Typeid, che il compilatore gcc accetta. Però Arduino tra i parametri che passa al compilatore c'e' quel -fno-rtti che impedisce l'uso di questo comando.

Testato: Ma se volessi stamparmi il nome dell'oggetto Servo?

Potresti riformulare meglio la domanda? Cos'è che vuoi stampare, esattamente?

PS: Prima di andare a togliere/mettere flag che fanno poi lievitare il codice, perché non modificare la lib inserendo un metodo che dia info sull'oggetto creato?

Proprio per essere chiaro ho allegato lo sketch di test ;)

Quello l'ho visto ma vorrei sapere... te, che cosa vuoi avere da un Serial.print(servo)? ;) Che informazione vuoi che ti restituisca? Il suo numero di telefono? L'orario a cui è stato creato? :P

leo72: Quello l'ho visto ma vorrei sapere... te, che cosa vuoi avere da un Serial.print(servo)? ;) Che informazione vuoi che ti restituisca? Il suo numero di telefono? L'orario a cui è stato creato? :P

Beh, le info possibili sono solo 2, o il nome della variabile oggetto oppure la classe dell'oggetto. Il nome della variabile te lo da il preprocessore, per la classe dei usare la typeid. @Testato vorrebbe la classe. Perciò Servo MyServo; vorrebbe in print "Servo"

No, credo che lui voglia il nome dell'istanza creata.

Testato: una volta dichiarato un oggetto della classe Servo con:

Servo MyServo;

mi servirebbe poter stampare il nome dell'oggetto, quindi a livello logico dovrei fare:

x=nome oggetto; serialprint (x); ricevere in stampa: MyServo

Se ho capito, tu faresti:

Servo myServo;
x = myServo;
Serial.print(x); ==> myServo

dove x però è a sua volta un oggetto Servo, spero. Altrimenti non ho capito io cosa vuol fare. :D Se invece x è il ritorno di un qualche valore dell'oggetto MyServo/classe Servo, non puoi fare nulla Perchè la return della attach()

return this->servoIndex

è semplicemente l'indice del vettore servos dichiarato static interno alla classe dei servo

static servo_t servos[MAX_SERVOS];

Ogni object di tipo Servo si riserva una cella in questo vettore. Questo è il significato di quel ID. E servo_t è solo una struct con dentro una ulteriore struct con info quali numero pin, se attivo, e ticks. E null'altro.

Appunto... su un microcontrollore, a che gli serve sapere come si chiama l'istanza di un oggetto? :open_mouth:

nid69ita:

nid69ita:
Sempre in quel link, per la classe usa:

typeid(myServo).name()

Ma anche questo dipende dal compilatore. Nel link parlano (sembra) di gcc, sarebbe da provare.

Provato ora di pranzo:

#include <Servo.h>

#define GET_NAME(x) #x
Servo MyServo;

void setup()
{ delay(1000);
 Serial.begin(9600);
 Serial.println( GET_NAME(MyServo) );
 Serial.println( typeid(MyServo).name() );           //error
}

void loop(){}



La macro okay (ritorna il nome dell'oggetto).
Per la typeid, il compilatore dà errore:
sketch_feb11a:9: error: cannot use typeid with -fno-rtti
perchè un parametro passato al compilatore ne impedisce l'uso. Probabilmente per rendere l'eseguibile più leggero vengono eliminate le informazioni dei tipi/classi/etc. a runtime. (Almeno credo)

EDIT: da sito GCC:
"-fno-rtti
Disable generation of information about every class with virtual functions for use by the C++ runtime type identification features (`dynamic_cast' and `typeid'). If you don't use those parts of the language, you can save some space by using this flag. Note that exception handling uses the same information, but it will generate it as needed."

mmmmm…nid o nid che stai a dì ]:). -fno-rtti funziona solo sul PC o su piattaforme su cui si possono usare le shared lib. Quindi su un PC quel parametro evita di ritornare informazioni dinamiche per mezzo della libreria shared rtti.

Su arduino e in genere su avr8 e simili il linguaggio C++ non può far uso di librerie rtti o meglio non esistono le shared lib. In via del tutto !!!teorica!!! potresti ricompilare gcc per avr abilitando rtti che dovrà essere statica (di suo non lo è) e quindi poi ti ritroveresti parte del codice rtti nel firmware, ma ciò non è stato pensato.

Se testato, (come giustamente chiedeva leo) ci dice il motivo per fare ciò, ci troviamo un workaround (o almeno ci proviamo). Quindi a che ti serve, cosa volevi fare ecc.?

Ciao.

MauroTec: mmmmm...nid o nid che stai a dì ]:). -fno-rtti funziona solo sul PC o su piattaforme su cui si possono usare le shared lib. Quindi su un PC quel parametro evita di ritornare informazioni dinamiche per mezzo della libreria shared rtti. Su arduino e in genere su avr8 e simili il linguaggio C++ non può far uso di librerie rtti o meglio non esistono le shared lib.

L'errore sketch_feb11a:9: error: cannot use typeid with -fno-rtti me lo ha dato il compilatore (anzi l'IDE Arduino), quindi deduco che al gcc Arduino passa quel parametro. Poi se non lo passa e il gcc sapendo di non avere librerie shared rtti mi dà quel msg, è il compilatore che mi mette su cattiva strada nel cercare il motivo di un simile msg :grin: