Test Foro de elhacker.net SMF 2.1

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

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

#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


#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
Cita de: 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

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 :)