Nombre para función "analogRead()" dentro de una clase

Hola a todos. Estoy desarrollando una clase y tengo un problema al crear una función dentro de la clase que se llama analogRead(void). Como podeis observar es el mismo nombre que la función analogRead de Arduino. La única diferencia es que no se le pasan valores. El código de la función es este:

uint16_t myclase::analogRead(uint8_t ch){
return(analogRead(A6));
}

Lo único que hace es devolver el valor analógico de la entrada A6.

El problema es que da un error a la hora de compilar:

myclase.cpp:79:22: error: no matching function for call to 'myclase::analogRead(const uint8_t&)'

 return(analogRead(A6));

Se podría pensar que es por usar el mismo nombre que una función de Arduino pero lo curioso es que no da error si lo haces con "digitalRead" que también existe en Arduino.

¿A alguien le he ocurrido?

Gracias!!

Retiro lo dicho de que con digitalRead no ocurre. Con digitalRead me compila sin problemas pero el microcontrolador se queda completamente colgado.

Conclusión: no puedo usar los nombres analogRead o digitalRead dentro de una clase.

Hola raymirabel

Creo que no deberia de haber problemas en usar los mismos nombres, ya que en realidad no es eso lo que ocurre.

Cuando usas el analogRead() nativo en tu aplicacion veras que lo escribes tal cual, pero el que has creado en tu clase cuando lo usas en el programa lleva un prefijo de resolucion de ambito myclase:: que le indica al compilador que estamos hablado de una funcion analogRead() distinta.

Ademas me parece que el mensaje de error no habla de duplicidad, sino mas bien de error sintactico. Revisa si la clase esta realmente instanciada como y es accesible en el punto donde escribes la sentencia.

Como detalle hablas de analogRead(void) al comienzo de tu post, y en el ejemplo la invocas como analogRead(uint) quizas sea un error al escribir, pero si no ahi hay otra fuente de problemas.

Saludos

Disculpa, tienes razón que hay un error. Vuelvo a poner el código:

El fichero myclase.h:

#include <stdint.h>
#include "Arduino.h"


class myclase{
  public:
 myclase();
 uint16_t analogRead(void);
};

El fichero myclase.cpp:

#include <myclase.h>
#include <stddef.h>
#include <stdint.h>

 myclase::myclase(void){
}
 
uint16_t myclase::analogRead(void){
 return(analogRead(A6));
}

Y el sketch donde compilo:

#include <myclase.h>

myclase pr;

void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);
}

void loop() {
  // put your main code here, to run repeatedly:
  Serial.println(pr.analogRead());
  delay(1000);
}

en la definicion de tu clase la funcion retorna un unsigned int ,sin embargo analogRead retorna un int.no se si esto puede ser la causa del fallo,por probar...

No, tampoco influye.

Confirmado, he probado a crear una función con digitalRead y ocurre lo mismo. En este caso me deja compilar pero cuando vuelco el programa en Arduino el micro se queda totalmente pillado:

bool myclase::digitalRead(uint8_t din){
 return(!digitalRead(din));
}

Bueno a veces los privados no funcionan.
Te he enviado 2 privados pidiendo que edites tus post ahora lo hago público.
Lee las normas y luego edita todos los post desde el 1ro al último donde pones códigos sin usar tags (</>)
Ve a More (abajo derecha), luego Modify y estas en edición de cada Post. Seleccionas todo el código y click en </>
Es muy fácil.

Cuando entras a un foro raymirabel, debes leer las Normas del mismo!!
Y además debes observar como otros han preguntado y que cosas no estan bien.
No pasa nada, edita y a resolver tu problema. Post Inicial, Post#3 y post#5 para editar.

Hola surbyte. No me han llegado los privados. Gracias por tu mensaje. No me había fijado en el tema de "normas". La verdad es que no encontraba la forma de poner el código correctamente, por eso lo ponía en cursiva. Ahora edito los post.

Gracias por poner tus post de forma correcta, raymirabel. Ahora vamos a tu problema. Creo que hay dos posibles soluciones:

  • Si cambias el nombre de tu método a otro que no se confunda con la función global, creo que compilaría correctamente. Prueba a llamarlo, por ejemplo, uint16_t leeAnalog(void).
  • No obstante, puede que lo que quieras es que tu método se llame exactamente así y que el compilador busque la función global, en lugar de quedarse perdido intentando resolver entre los métodos de tu clase (de hecho, creo que es lo que buscas, pero he preferido ser malo y dejarlo para el final :smiling_imp: :smiling_imp: ). En tal caso, creo que lo podías indicar tal que así: return(::analogRead(A6));

Prueba y comenta si te dio los resultados esperados. Saludos.

EDITO: la única librería que necesitas incluir es Arduino.h. Olvídate de stddef y stdint.

Gracias noter. Efectivamente necesito que el nombre del método se llame igual para mantener un poco los nombres originales de las funciones de Arduino. He probado a poner ::analogRead() y ::digitalRead(), es decir con los :: delante y ahora va perfecto!!!

Me imagino que cuando pones los :: sin referirte a ninguna clase, tomará por defecto la principal o la global, ¿es así?

Realmente soy humilde programando y no tengo muchos conocimientos acerca de las clases, y no te cuento si ya nos vamos a herencias, sobrecargas, etc... ;)

Respecto a los includes stddef y stdint, en una ocasión me dio error al compilar y creía que los tipos uint8_t, uint16_t, etc, estaban definidas dentro de estas librerías y por eso las he dejado.

Muchas gracias a todos por vuestra colaboración.

Me imagino que cuando pones los :: sin referirte a ninguna clase, tomará por defecto la principal o la global, ¿es así?

Así es, efectivamente.

Realmente soy humilde programando y no tengo muchos conocimientos acerca de las clases, y no te cuento si ya nos vamos a herencias, sobrecargas, etc... ;)

Se trata de una capa superior a la programación pura. En un principio, y para problemas sencillos, resulta más complicado programar orientado a objetos que secuencial. Sin embargo es muy bueno ir tomando contacto con ello, porque facilita enormemente la programación de proyectos complicados, el mantenimiento, la reutilización de código, etc. Cuando empieces a dominar la POO llegará un momento en que dediques tanto o más tiempo a la estructuración previa de clases y demás que al propio programa; pero es que unos objetos bien pensados pueden ser de utilidad para muchas cosas futuras. Si dominas la herencia y polimorfismo, ni te cuento, porque ya te permite pensar en clases abstractas, más genéricas, y a las que con dos toques puedes dar apariencia distinta. Y ya el último escalón (habrá más, pero es hasta donde yo he llegado :)) son las plantillas, pensadas para dar un tratamiento similar a distintos tipos de datos. Créeme, que llevo programando un montonazo de años, y me ha costado muchísimo entrar por la POO, porque prefería ir directamente a mi problema concreto; pero una vez hecho el esfuerzo de comprender todo el meollo, te puedo asegurar que merece mucho la pena el trabajo invertido. Saludos.