creación de librería sencilla

Hola

Tengo un programa que se me ha hecho muy largo, sobre 1000 líneas, quiero separar las funciones en varias librerías.

A modo de ejemplo, he creado dos ficheros, mates.h y mates.c

mates.h

int sumar(int,int);

mates.c

int sumar(int a, int b)
{
  return a+b;
}

pero a la hora de compilar no compila.

¿qué hago mal? ¿cómo se hace?

los ejemplos que encuentro por internet hacen uso de clases, pero yo no tengo clases.

gracias

Faltan la directiva #include "mates.h" en mates.c. Además, supongo que también has puesto la misma directiva en tu archivo.ino. Es recomendable en el archivo mates.h, además, incluir una directiva condicional para evitar la inclusión múltiple de la cabecera:

#ifndef mates_h
#define mates_h
int sumar(int,int); // aquí van las definiciones de la cabecera
#endif

Si así no te compila, pon la salida de error que te da el compilador.

teniendo mates.h así:

#ifndef mates_h
#define mates_h

int sumar(int,int);

#endif

mates.c

#include "mates.h"

int sumar(int a, int b)
{
  return a+b;
}

y el fichero .ino

#include "mates.h"


void setup()
{
    Serial.begin(115200);
}


void loop()
{
  delay(2000);

  int s = sumar(100,200);

  Serial.println(s);
}

se obtiene esto al compilar:

C:\...\AppData\Local\Temp\cczt2I92.ltrans0.ltrans.o: In function `loop':

C:\src_arduino\ejemplo/ejemplo.ino:15: undefined reference to `sumar(int, int)'

collect2.exe: error: ld returned 1 exit status

exit status 1
Error compilando para la tarjeta Arduino/Genuino Uno.

si lo que tienes es un conjunto de funciones que pueden no tener relacion unas con otras quizas no sea correcto usar una clase ,aunque si las puedes agrupar en ficheros y luego incluirlas en el sketch como si fuera una libreria con #include Por cierto ,supongo que te falta el nombre de los parametros en el fichero de cabecera,solo has puesto el tipo de variable:

int sumar(int,int);//int sumar(int a,int b);

En los prototipos de función creo que se pueden dejar los parámetros sin nombre, sólo con el tipo tal y como lo ha puesto forumisto. Prueba a renombrar el mates.c a mates.cpp. ¿Los archivos .ino, .cpp y .h están todos en la misma ubicación?

Cuando abro con el IDE (1.8.5) el fichero ejemplo.ino, automáticamente abre en dos pestañas los ficheros mates.h y mates.c, luego no creo que da igual .c que .cpp Y los ficheros están en el mismo directorio.

El código a mi me compila perfectamente y se ejecuta perfectamente en un wemos d1 mini el IDE ARDUNO 1.8.1 Yo para esto no creo que sea necesario hacer una clase. Es cierto que aun no comprendo muy bien cuando hacer las separion de codigo mediante clases o no.

Esto un poco como tu intento separa el código en partes y me esta costando. Yo lo hago como el ejemplo que has puesto el problema que encuentro es que a veces no detecta cosas declaradas en otras pestañas. Y tienes que hacer multiples declaraciones a los fichero según los necesitas recuerda que las librerías externas también tiene que declararlas en todo los sitios que se usen

Prueba a renombrar a .cpp de todas formas. A mí en sublime+deviot tampoco me compiló hasta que no lo hice.

renombrando a .cpp no sirve

no usando el fichero.c y metiendo la implementación en el .h funciona:

#ifndef _MATES_H_
#define _MATES_H_



int sumar(int a, int b)
{
  return a+b;
}


#endif

Pues eso es lo que te decia arriba ,si son un conjunto de funciones matematicas ,metelas en un archivo con extension .h que tendras en la misma carpeta donde tengas el sketch y en la primera linea del sketch .ino lo incluyes con #include "fichero.h"