Go Down

Topic: Object name to String (Read 7454 times) previous topic - next topic

testato

Feb 11, 2014, 12:05 am Last Edit: Feb 11, 2014, 01:23 pm by Testato Reason: 1
dichiaro un oggetto Servo
Code: [Select]
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:
Code: [Select]
Serial.print (x);
dove x sarebbe il nome dell'oggetto Test_servo convertito in stringa per essere stampato.
Una conversione, appunto, ObjectName->String

Thanks
- [Guida] IDE - http://goo.gl/ln6glr
- [Lib] ST7032i LCD I2C - http://goo.gl/GNojT6
- [Lib] PCF8574+HD44780 LCD I2C - http://goo.gl/r7CstH

nid69ita

#1
Feb 11, 2014, 09:28 am Last Edit: Feb 11, 2014, 09:53 am by nid69ita Reason: 1
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++
http://stackoverflow.com/questions/3649278/how-can-i-get-the-class-name-from-a-c-object
Però non sò con quale compilatore. Usa il preprocessore. Bisognerebbe provare con Arduino.

EDIT: questo mi compila ma non posso provarlo:
Code: [Select]
#include <Servo.h>
#define GET_NAME(x) #x
Servo MyServo;

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

void loop(){}
my name is IGOR, not AIGOR

leo72

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

Code: [Select]
byte risultato = myServo.attach(x, y, z);

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

testato


EDIT: questo mi compila ma non posso provarlo:
Code: [Select]
#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
- [Guida] IDE - http://goo.gl/ln6glr
- [Lib] ST7032i LCD I2C - http://goo.gl/GNojT6
- [Lib] PCF8574+HD44780 LCD I2C - http://goo.gl/r7CstH

nid69ita

Sempre in quel link, per la classe usa:
Code: [Select]
typeid(myServo).name()
Ma anche questo dipende dal compilatore. Nel link parlano (sembra) di gcc, sarebbe da provare.
my name is IGOR, not AIGOR

testato


Esempio
Code: [Select]
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:
Quote
Servo MyServo;


mi servirebbe poter stampare il nome dell'oggetto, quindi a livello logico dovrei fare:
Quote
x=nome oggetto;
serialprint (x);
ricevere in stampa: MyServo

- [Guida] IDE - http://goo.gl/ln6glr
- [Lib] ST7032i LCD I2C - http://goo.gl/GNojT6
- [Lib] PCF8574+HD44780 LCD I2C - http://goo.gl/r7CstH

PaoloP

Me la leggo dopo con calma.

testato

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  :smiley-yell:)

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

Code: [Select]
#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);
}
- [Guida] IDE - http://goo.gl/ln6glr
- [Lib] ST7032i LCD I2C - http://goo.gl/GNojT6
- [Lib] PCF8574+HD44780 LCD I2C - http://goo.gl/r7CstH

nid69ita

#8
Feb 11, 2014, 01:47 pm Last Edit: Feb 11, 2014, 01:52 pm by nid69ita Reason: 1

Sempre in quel link, per la classe usa:
Code: [Select]
typeid(myServo).name()
Ma anche questo dipende dal compilatore. Nel link parlano (sembra) di gcc, sarebbe da provare.


Provato ora di pranzo:
Code: [Select]
#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."
my name is IGOR, not AIGOR

testato


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"
- [Guida] IDE - http://goo.gl/ln6glr
- [Lib] ST7032i LCD I2C - http://goo.gl/GNojT6
- [Lib] PCF8574+HD44780 LCD I2C - http://goo.gl/r7CstH

nid69ita

#10
Feb 11, 2014, 02:08 pm Last Edit: Feb 11, 2014, 02:18 pm by nid69ita Reason: 1


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.
my name is IGOR, not AIGOR

leo72


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?

testato

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

- [Guida] IDE - http://goo.gl/ln6glr
- [Lib] ST7032i LCD I2C - http://goo.gl/GNojT6
- [Lib] PCF8574+HD44780 LCD I2C - http://goo.gl/r7CstH

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

nid69ita


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"
my name is IGOR, not AIGOR

Go Up