Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: minak en 21 Marzo 2018, 22:23 pm



Título: Problema de declaración de funciones externas al fichero cpp
Publicado por: minak en 21 Marzo 2018, 22:23 pm
Bueno mi problema no es en c++ si no en Arduino pero como el lenguaje que más se parece es a c++ lo pongo aquí haber si me podéis ayudar. El problema recae en que mi nivel de programación no es muy alto y que nunca me han llegado enseñado hacer programas estructurados en diferentes ficheros cpp. Ahora quiero aprender y no encuentro muy bien cómo se hace. El caso que quiero que el ino llame a funciones que están en diferentes .cpp y hasta hay bien pero cuando es un cpp el que llama a otra función declarada en otro cpp me da error que el compilador en ese cpp no lo tiene declarado. el caso como puedo hacer que lo que se declare en el programa principal este donde esté se le pueda llamar desde cualquier parte. Muchas gracias.

Pd: Es decir tengo el ino y hay declaro hago el include a wifi.h y datos.h pero claro desde la parte del codigo del cpp de wifi.h no puedo llamar a funciones de datos.h.


Título: Re: Problema de declaración de funciones externas al fichero cpp
Publicado por: Kenji-chan en 21 Marzo 2018, 23:14 pm
en c/c++ cuando creas un programa que incluye otros ficheros lo que haces es declarar su header en el programa principal

main.cpp
Código
  1. #include <iostream>
  2. #include "wifi.h"
  3. #include "datos.h"
  4.  
  5. int main(int argc, char* argv[]){
  6.    ...
  7.    ...
  8.    ...
  9. /*codigo*/
  10. }
  11.  

des ese modo todo lo que este declarado dentro de las cabeceras que incluimos lo podremos usar dentro del fichero main.cpp (main.cpp es el nombre que le he dado a mi programa) pero no podemos llamarlo des de otros ficheros por ejemplo desde datos.cpp no podemos llamar funciones que estén en wifi.cpp  para ello en datos.h tenemos que incluir el header de wifi.h


Título: Re: Problema de declaración de funciones externas al fichero cpp
Publicado por: minak en 22 Marzo 2018, 11:13 am
Que mal eso lo tengo hecho y no hace caso, creo que tiene que ver porque en cada header
Código:
/***********************************************************************************************************************************/
/*                                            Modulo de lectura/escritura en la eeprom                                             */
/*                                                     Soporte EEPROM V_171225.0                                                   */
/*                                                                                                                                 */
/***********************************************************************************************************************************/

#ifndef SoporteEEPROM_H
#define SoporteEEPROM_H

#include <ESP8266WiFi.h>  //Libreria necesaria para el ESP8266
#include <EEPROM.h>       //Libreria para el uso de la EEPROM

#include "Setting.h"

void setupEEPROM ();            // Setup EEPROM
extern void grabarEEPROM(int, String); //ARG int, ADDR String Datos
extern String leerEEPROM(int);         //ARG int, ADDR

#endif //__SoporteEEPROM_H

Y el header del otro implicado es el siguiente

Código:
/***********************************************************************************************************************************/
/*                                  Modulo reposable de la comunicacion Wifi                                                       */
/*                                     ModuloComunicacionWifi V_171214.0                                                           */
/*  Modulo reposable de la comunicacion Wifi, este modulo regula la comunicacion wifi, habilita un modo programacion y el modo  */
/*  OTA para la actualizacion a distancia.                                                                                         
/***********************************************************************************************************************************/

#ifndef ComunicacionWIFI_H
#define ComunicacionWIFI_H

#include <WiFiClient.h>
#include <ESP8266WebServer.h>
#include <ESP8266WiFi.h>
#include <ESP8266mDNS.h>          //Manejo de DNS  Multicast DNS
#include <WiFiUdp.h>              //Manejo de UDP 
#include <ArduinoOTA.h>           //Manejo de OTA

#include "Setting.h"
#include "SoporteEEPROM.h"  //DECLARO EL HEADER DEL IMPLICADO EN EL PROBLEMA


/*******************************************************/
void setupModuloWifi();
void iniciandoWifi();
void modoSoftAP();
void modoConf();
void escanearRedes();
void leerConfSSID(); //DA PROBLEMAS NO ENCUENTRA LAS FUNCIONES
void paginaConf();
void guardarConfWifi(); //DA PROBLEMAS NO ENCUENTRA LAS FUNCIONES
void getUpdateOTA();
void testConexion();

#endif //__ComunicacionWIFI_H
Lo que correspondería en main también incluyo solo la parte implicada en las declaraciones de las partes.
Código:
//#include <Wire.h>                     //Manejo del I2C
//#include <ESP8266WiFi.h>

//#include "ComunicacionWIFI.h"
#include "Globales.h"             //Variables globales
#include "Setting.h"              //Activacion de los diferentes funciones

#ifdef TOOLS-I2C_ENABLE
#include "ToolI2C.h"
#endif //FIN

#ifdef DISPLAY-OLED_ENABLE
#include "PantallaOLED.h"
#endif //FIN

#ifdef SENSOR-HUMD-TEMP_ENABLE
#include "SoporteSHT30.h"
#endif //FIN

#ifdef SUPPORT-EEPROM_ENABLE
#include "SoporteEEPROM.h"
#endif

#ifdef SUPPORT-WIFI
#include "ComunicacionWIFI.h"
#endif

No tengo problemas para usar las funciones sobre el main pero sobre otro fichero no los encuentra


Título: Re: Problema de declaración de funciones externas al fichero cpp
Publicado por: Kenji-chan en 22 Marzo 2018, 19:09 pm
que tipo de error te marca al compilar??
pueda que te marque undefined reference to

las funciones void leerConfSSID() y void guardarConfWifi() las creaste tu? o ya están creadas en SoporteEEPROM??


Título: Re: Problema de declaración de funciones externas al fichero cpp
Publicado por: minak en 23 Marzo 2018, 19:13 pm
Contestándote al mensaje vi el error, que tonto es que cuando fragmente el código por módulos he dejado restos y cambie mucho el funcionamiento de la parte de lectura y escritura para adaptarlo a un futuro implementar SD o otros tipos de almacenamiento y la había liado en la llamada a las funciones. Codigo compilado aunque no se si funciona no dispongo aquí ningún Wemos(Aprox. ARDUINO) para comprobarlo.

Estoy haciendo mi propio programa principalmente para la placa Sonoff y otros dispositivos.

Muchisimas gracias Kenji-chan.