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
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.
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.
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
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
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 )
x Leo (quanto avevi ragione sulle funzioni con passaggi di argomenti, altro che procedure singole come facevo io, sono una goduria)
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"
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?
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?
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?
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"
dove x però è a sua volta un oggetto Servo, spero. Altrimenti non ho capito io cosa vuol fare.
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.
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.?
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