Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: Eskizoide en 30 Octubre 2017, 11:40 am



Título: Undefined reference to (C++) [SOLUCIONADO]
Publicado por: Eskizoide en 30 Octubre 2017, 11:40 am
Buenas,
 
yo había hecho un proyecto con 3 clases, menu.cpp y otras dos clases. Mi error fue escribir todo el código de las otras dos clases en un fichero .h y no separar los ficheros.
 
Bien, fui a separar los ficheros en cabeceras y tal, las declaraciones en .hpp y el codigo en .cpp, y al pasarlo todo, no me da ningún fallo excepto en el menu.cpp donde me salta un "undefined reference" a todas las funciones que he separado en ficheros. Y me estoy volviendo loco porque no se como hacer que funcione. Se que les declaraciones y eso están bien, pero ya no se que más falla. Intenté solucionarlo poniendo #pragma once pero nada sigue igual. A ver si algún alma muy caritativa me ayuda, o al menos me explica que puede estar pasando.
 
Venga, dejo el código fuente aquí en spoiler por si alguien es mu majete y le echa un vistazo
 
Código:
NFA.hpp
 
#pragma once
#include <vector>
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <fstream>
#include "estado.hpp"
#include <set>
#include <string>
 
using namespace std;
 
class nfa
{ vector <ESTADO> vectorestado;
  int numeroestados;
  set <char> alfabeto;
  set <int> importantes;
  int estadoinicial;
 
 
public:
 
void llenar_datos(char nombrefichero[], bool& errorapertura);
void mostrar();
void crearalfabeto(int numeroenlaces);
void analizarmuerte ();
void mostraralfabeto();
void estadosimportantes();
bool comprobacionestadodfa();
bool analizarletra (string cadena, int estado, int &camino,
                    vector<int> &estadoactual,vector <char> &simbolo, vector <int> &estadosiguiente);
  void analizarcadena();
 
};

ESTADO.hpp
 
Código:
#pragma once
#include <vector>
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <fstream>
 
using namespace std;
 

class ESTADO
{struct siguienteestado_t
     {char simbolotransicion;
      int siguienteestado;
     };
 
      bool aceptacion;
      bool estadomuerto;
      vector <siguienteestado_t> transicion;
 
public:
 
void crearenlace (int numeroenlaces);
    void   set_sigestado (int estado, char simbolo, int pos);
int    get_sigestado(int pos) const;
    char   get_simbolo(int pos) const;
    bool   get_aceptacion(void) const;
    void   set_aceptacion(bool aceptado);
    bool   get_muerto(void) const;
    bool   nodomuerto(int identificador);
    int get_numeroenlaces(void) const;
};

MENU.cpp
 
 
Código:
#include "nfa.hpp"
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
 
int main()
{ int opcion;
  char fichero[85];
  bool errorapertura; // 0 si se abrio el fichero, en otro caso, no se abrio
  nfa automata;
 
  do{ cout << endl;
  cout << "SELECCIONE UNA OPCION :" << endl;
  cout << "[1] Leer un archivo .nfa." << endl;
  cout << "[2] Mostrar NFA." << endl;
  cout << "[3] Señalizar estados de muerte." << endl;
  cout << "[4] Mostrar estados importantes." << endl;
  cout << "[5] Analizar cadena." << endl;
  cout << "[6] Comprobacion DFA." << endl;
  cout << "[0] Salir." << endl;
  cout << "OPCION: ";
  cin >> opcion;
  switch(opcion)
    {case 1:
      {cout << "Nombre del fichero: ";
       cin >> fichero;
       automata.llenar_datos(fichero, errorapertura);
       break;
      }
     case 2:
      {if(errorapertura != 0) cout << "ERROR: NO SE ABRIO ANTERIORMENTE EL ARCHIVO CORRECTAMENTE." << endl;
       else automata.mostrar();
       break;
      }
     case 3:
      {if(errorapertura != 0) cout << "ERROR: NO SE ABRIO ANTERIORMENTE EL ARCHIVO CORRECTAMENTE." << endl;
      else automata.analizarmuerte();
       break;
      }
      case 4:
      {if(errorapertura != 0) cout << "ERROR: NO SE ABRIO ANTERIORMENTE EL ARCHIVO CORRECTAMENTE." << endl;
       else automata.estadosimportantes();
       break;
      }
     case 5:
      {if(errorapertura != 0) cout << "ERROR: NO SE ABRIO ANTERIORMENTE EL ARCHIVO CORRECTAMENTE." << endl;
       else automata.analizarcadena();
       break;
      }
     case 6:
      {if(errorapertura != 0) cout << "ERROR: NO SE ABRIO ANTERIORMENTE EL ARCHIVO CORRECTAMENTE." << endl;
       else
        {if(automata.comprobacionestadodfa()) cout << "Este fichero es un DFA." << endl;
         else cout <<"Este fichero NO es un DFA." << endl;
        }
       break;
      }
     case 0:
      {return 0;
       break;
      }
    }
  }while(opcion != 0);
}
 

 
 
 
 
Mil gracias a quien pueda ayudarme!


Título: Re: Undefined reference to (C++)
Publicado por: Gallu en 30 Octubre 2017, 12:29 pm
Hola, seguro que no se están linkando bien las fuentes, qué ide estás usando  ?? , has probado en incluir el cpp en lugar del hpp ??

Saludos


Título: Re: Undefined reference to (C++)
Publicado por: Eskizoide en 30 Octubre 2017, 12:31 pm
Estoy usando devc++, y no me manejo muy bien osea que igual algo del linker está fallando que no entiendo. Y no he probado eso que dices, no se me había ocurrido, probaré a ver, gracias.


Título: Re: Undefined reference to (C++)
Publicado por: Eskizoide en 30 Octubre 2017, 12:58 pm
Hola, seguro que no se están linkando bien las fuentes, qué ide estás usando  ?? , has probado en incluir el cpp en lugar del hpp ??

Saludos

Hola, nada, eso no funciona, como imaginaba, ya que no accede a los .hpp y pierde variables y tal. He probado a compilarlo por línea de comandos y me sale el mismo error, undefined reference to, así que no creo que sea problema del IDE.


Título: Re: Undefined reference to (C++)
Publicado por: Gallu en 30 Octubre 2017, 13:14 pm
Las fuentes (cpp) de los que dependes están compiladas  ???


Título: Re: Undefined reference to (C++)
Publicado por: Eskizoide en 30 Octubre 2017, 13:47 pm
Nada, ya está arreglado, ese era el problema se me olvidó compilar uno de los ficheros, pensaba que cuando compilaba menu.cpp se compilaban el resto. Gracias :)