TODOPIC

Otros Microcontroladores / Dispositivos programables => Arduino => Mensaje iniciado por: estepian en 10 de Febrero de 2015, 07:55:52

Título: Mis primeras librerias en arduino
Publicado por: estepian en 10 de Febrero de 2015, 07:55:52
Hola, mi nombre es Germán Esteban, estudiante de ing. Electrónica y estoy empezando a crear mis propias librerías.
Sin embargo tengo una gran duda la cual explico a continuación.

Estoy tratando de crear una librería que cuando la llame le envié dos datos, haga los cálculos correspondientes y me regrese el valor calculado
pero no se como hacer para que me regrese dicho valor.

He tratado de hacerlo de forma similar a cuando se crea una función en el mismo sketch pero no funciona.

Les agradezco mucho algún consejo.

Saludos.
 :)
Título: Re: Mis primeras librerias en arduino
Publicado por: KILLERJC en 10 de Febrero de 2015, 11:53:50
Citar
int max(int num1, int num2)
{
   /* local variable declaration */
   int result;
 
   if (num1 > num2)
      result = num1;
   else
      result = num2;
 
   return result;
}

Eso retorna el maximo de 2 numeros. Lo que retorna es un int
El uso:

int Variable = max(17,5);

en Variable el resultado es 17.


Y la otra es pasarle el puntero asi lo mdifica...

Citar
void max(int num1, int num2, int* Variable)
{
 
   if (num1 > num2)
      *Variable = num1;
   else
      *Variable = num2;

}

Se usaria:

int Variable;
max(17,5,&Variable);

Para multiples valores o con punteros o con estructuras.
Título: Re: Mis primeras librerias en arduino
Publicado por: estepian en 11 de Febrero de 2015, 07:08:57
Citar
int max(int num1, int num2)
{
   /* local variable declaration */
   int result;
 
   if (num1 > num2)
      result = num1;
   else
      result = num2;
 
   return result;
}

Eso retorna el maximo de 2 numeros. Lo que retorna es un int
El uso:

int Variable = max(17,5);

en Variable el resultado es 17.


Y la otra es pasarle el puntero asi lo mdifica...

Citar
void max(int num1, int num2, int* Variable)
{
 
   if (num1 > num2)
      *Variable = num1;
   else
      *Variable = num2;

}

Se usaria:

int Variable;
max(17,5,&Variable);

Para multiples valores o con punteros o con estructuras.

Gracias por tu atencion KILLERJC, pero te agradeceria mil veces mas si me mostraras el primer ejemplo implementado en los archivos .h y .cpp
Título: Re: Mis primeras librerias en arduino
Publicado por: KILLERJC en 11 de Febrero de 2015, 10:50:52
en el .h pones el prototipo

int max(int num1, int num2);

y en .cpp la funcion completa. y agregas el .h a este

Asi cuando queres agregar esta funcion a tu programa principal agregas unicamente el .h
El .cpp debe estar en una ubicacion valida para los includes, sino vas a tener que agregar el archivo o la direccion donde se encuentra asi el linker lo busca.

Es C creo que basico y temas del compilador que estes usando.
Título: Re: Mis primeras librerias en arduino
Publicado por: estepian en 13 de Febrero de 2015, 08:55:57
en el .h pones el prototipo

int max(int num1, int num2);

y en .cpp la funcion completa. y agregas el .h a este

Asi cuando queres agregar esta funcion a tu programa principal agregas unicamente el .h
El .cpp debe estar en una ubicacion valida para los includes, sino vas a tener que agregar el archivo o la direccion donde se encuentra asi el linker lo busca.

Es C creo que basico y temas del compilador que estes usando.


De nuevo gracias! Tengo otra duda que se que puedes resolverme  :oops: !!!
La variable que retorna ¿se debe de declarar como publica?
¿Se escribe sin guion bajo en los 2 archivos de la libreria?
Título: Re: Mis primeras librerias en arduino
Publicado por: KILLERJC en 13 de Febrero de 2015, 09:34:47
En el caso que te di las variables que tenes son num1,num2 y result, estas son variables con scope en la funcion nomas
la que yo llame "Variable" puede ser global o no. Como puede ser algo que declaraste dentro del main asi el scope queda dentro de la funcion main, o puede ser global.
Título: Re: Mis primeras librerias en arduino
Publicado por: bigluis en 09 de Junio de 2015, 17:02:18
Creo que aqui estan confundiendo un poco los conceptos. Arduino generalemente se programa en c++ no en c. Podriamos decir q c++ es una extension de c. Por lo tanto cualquier cosa que hagas en c puede ser leida o compilada por c++. KILLERJC te dio una explicacion de como crear una libreria utilizando c no c++. Es decir, el sugiere lo siguiente:

max.h:

Código: C
  1. #ifndef max_h
  2. #define max_h
  3.  
  4. int max(int num1, int num2);
  5.  
  6. #endif

max.c (si no me equivoco deberia ser max.cpp):

Código: C
  1. int max(int num1, int num2)
  2. {
  3.    /* local variable declaration */
  4.    int result;
  5.  
  6.    if (num1 > num2)
  7.       result = num1;
  8.    else
  9.       result = num2;
  10.  
  11.    return result;
  12. }

ahora para convertir max.c a max.cpp lo unico que tienes que hacer es cambiar la extension y el compilador la leera igual. No estoy seguro si Arduino IDE compilara archivos *.c como si fuesen *.cpp.

La variable que retorna ¿se debe de declarar como publica?

Desde el punto de vista de c no existen variables publicas o privadas. En este caso la funcion esta siendo declarada como global por ende puede ser accedida desde cualquier lugar (metodo, funcion o clase). En c solo existen 2 tipos de varialbes: locales y globales.

En c++ si existen variables privadas y publicas:

¿Se escribe sin guion bajo en los 2 archivos de la libreria?
No, el guion bajo se usa generalmente para declarar variables privadas. Esto es opcional. Es decir, el guion bajo es meramente documentativo para decirle a otros desarrolladores cuando lean tu codigo que la variable es privada sin necesidad de q tengan que ir a ver el archivo *.h.

Si quieres crear una libreria en c++ mira este link:
http://www.arduino.cc/en/Hacking/LibraryTutorialhttp://www.arduino.cc/en/Hacking/LibraryTutorial (http://www.arduino.cc/en/Hacking/LibraryTutorialhttp://www.arduino.cc/en/Hacking/LibraryTutorial)