• Sábado 14 de Diciembre de 2024, 13:40

Autor Tema:  Visual C++ 7.1 (mvs .net 2003) Y Clases  (Leído 3539 veces)

JoGalGar

  • Nuevo Miembro
  • *
  • Mensajes: 11
    • Ver Perfil
Visual C++ 7.1 (mvs .net 2003) Y Clases
« en: Sábado 4 de Noviembre de 2006, 21:31 »
0
Hola. La situación es la siguiente ...

Estoy realizando un trabajo referente a redes MPLS empleando el programa OMNeT++. Para esto, instalé Microsoft Visual Studio .NET 2003, ya que el empleo del programa OMNeT++ requiere su instalación. La versión anterior (Visual C++ 6.0) causa errores de compilación y recientemente sacaron compatibilidad para el Studio .NET 2005.

OMNeT++ se basa en el uso de clases para el funcionamiento de módulos simples, los cuales son programados en C++. Tengo el archivo Routingtable.h donde declaro los siguiente:

#ifndef _ROUTINGTABLE_H
#define _ROUTINGTABLE_H

#include <omnetpp.h>
#include <string.h>
using std::string;

struct table
{
  string srcip;
  string mask;
  string interin;
  int hop;
  string destip;
  string interout;
  string type;
};

class Routingtable : public cSimpleModule
{
public:
   void addroute(string, string , string , string , int , string);
   void addinterout(string , string , string);
   void findroute(string);
private:
   int structs;
   int flag;
   string interfaceout;
   table rt[10];
};

#endif

y en el archivo Routingtable.cpp delcaro el cuerpo de cada una de las funciones prototipo declaradas en el Routingtable.h. Luego, cree el archivo IP_R.h y el IP_R.cpp. En el archivo IP_R.cpp necesito llamar a la función "void findroute(string)" del Routingtable.h. He intendado muchas formas y no logro encontrar la forma cómo llamar esa función. Puse el #include "Routingtable.h" en el IP_R.cpp para así llamar la función.

Dentro del IP_R.cpp primero puse: findroute("hola"); como prueba para observar si se lograba llamar a la función; sin embargo, esto generó el siguiente error:
IP_R.cpp(29): error C3861: 'findroute': identifier not found, even with argument-dependent lookup
Entonces busqué en internet y encontré que no se pueden llamar funciones de clases y éstas no son estáticas o no se hace referencia a un "objeto". Por lo cual, en el IP_R.h coloqué lo siguiente:
#ifndef IP_R_H
#define IP_R_H

#include <omnetpp.h>
#include <string.h>
using std::string;

#include "IPDatagram_m.h"

class Routingtable; <-------------------

class IP : public cSimpleModule
{
public:
   Routingtable *rta; <-------------------
   void handlemessage(cMessage *msg);
private:
   int pktsin;
   int pktsout;
protected:
   virtual void initialize();
   virtual void finish();
   void display(char *);
};

#endif
Y en el IP_R.cpp, además de poner el #include "Routingtable.h", puse:
rta = new Routingtable();
rta->findroute("hola");
Lo cual me genera el siguiente error:
IP_R.obj : error LNK2019: unresolved external symbol "public: void __thiscall Routingtable::findroute(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char>>)" (?findroute@Routingtable@@QAEXV?$basic_string@DU?$char_traits@D@std@@@@V?$allocator@D@2@@std@@@Z) referenced in function "public: void __thiscall IP::handlemessage(class cMessage *)" (?handlemessage@IP@@QAEXPAVcMessage@@@Z)
IP.exe : fatal error LNK1120: 1 unresolved externals

No soy muy conocedor de clases en C++, de código simple sí. Alguien me podría ayudar porfavor? Muchas gracias.

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Visual C++ 7.1 (mvs .net 2003) Y Clases
« Respuesta #1 en: Sábado 4 de Noviembre de 2006, 22:29 »
0
Esto esta fallando en el enlazado ... ¿Es tuya o de una biblioteca externa? Si es tuya ¿Esa funcion findroute tiene cuerpo? Si es externa faltara algun .lib para poder resolverla.

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

JoGalGar

  • Nuevo Miembro
  • *
  • Mensajes: 11
    • Ver Perfil
Re: Visual C++ 7.1 (mvs .net 2003) Y Clases
« Respuesta #2 en: Sábado 4 de Noviembre de 2006, 22:44 »
0
Antes que nada gracias por contestar.

Tanto el IP_R.h y el Routingtable.h, al igual que sus respectivos .cpp son míos. Lo único que incluyo es el #include <omnetpp.h> en cada archivo que realizo. El cuerpo de la función findroute está declarado en el cpp y es el siguiente:

void Routingtable::findroute(string srcip)
{
   for(int i = 0 ; i <= structs ; i++)
      if(rt.srcip == srcip)
         interfaceout = rt.interout;
}

Estuve viendo algunos ejemplos de simulación de omnet y, según yo, estoy haciendo lo mismo que hacen ellos para llamar funciones de calses que son de otros archivos ... pero igual y me hace falta algo que aun no he visto. Acabo de declarar void findroute(string); como virtual void findroute(string); ... Aun así sigue marcando el mismo error.

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Visual C++ 7.1 (mvs .net 2003) Y Clases
« Respuesta #3 en: Sábado 4 de Noviembre de 2006, 22:50 »
0
Cita de: "JoGalGar"
Antes que nada gracias por contestar.
Mmm ¿Podrias reducir el problema a la minima expresion de codigo? De esa manera si lo aislas completamente intentaria compilarlo y enlazarlo ...

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

JoGalGar

  • Nuevo Miembro
  • *
  • Mensajes: 11
    • Ver Perfil
Re: Visual C++ 7.1 (mvs .net 2003) Y Clases
« Respuesta #4 en: Domingo 5 de Noviembre de 2006, 02:36 »
0
Otra vez ... gracias por responder.

Adunto los cuarto archivos que estoy utilizando. No están largos ... apenas los estaba haciendo cuando me surgió este problema. Ya lo modifiqué para compilarlos sin problemas en el C++ ... perdón de antemano si se me fue por ahí algun errorcillo. Si me pudieras safar de este problema te lo agradecería. Gracias!!!
El mensaje contiene 1 archivo adjunto. Debes ingresar o registrarte para poder verlo y descargarlo.

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Visual C++ 7.1 (mvs .net 2003) Y Clases
« Respuesta #5 en: Domingo 5 de Noviembre de 2006, 05:30 »
0
Cita de: "JoGalGar"
Otra vez ... gracias por responder.

Adunto los cuarto archivos que estoy utilizando. No están largos ... apenas los estaba haciendo cuando me surgió este problema. Ya lo modifiqué para compilarlos sin problemas en el C++ ... perdón de antemano si se me fue por ahí algun errorcillo. Si me pudieras safar de este problema te lo agradecería. Gracias!!!
Mmm proba a compilar tu proyecto desde la linea de comandos ...

En VC++ seria:
cl archivo.cpp archivo2.cpp archivo3.cpp etc

Para reproducir tu problema tuve que hacer cl ip.cpp (despues de un par de cambios para incluir string y no string.h y comentar dos lineas que comienzan con WATC). Pega la linea de comandos que estes usando sino ...

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

JoGalGar

  • Nuevo Miembro
  • *
  • Mensajes: 11
    • Ver Perfil
Re: Visual C++ 7.1 (mvs .net 2003) Y Clases
« Respuesta #6 en: Domingo 5 de Noviembre de 2006, 06:45 »
0
Hola. Perdón por los "WATCH" que dejé ... se me olvidó quitarlos. Se me olvidó que la compilación que realizo para el OMNeT la hago en el Command Prompt. Primero tengo que poner el comando "nmake" en la ruta. Para esto es necesario correr el vcvars32.bat localizado en C:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\bin\vcvars32.bat, con esto se pone el comando "nmake" en la ruta. Primero tengo que hacer un archivo Make.vc tecleando en el cmd:
opp_nmakemake
Posteriormente, lo compilo con el comando:
nmake -f Makefile.vc
No sé si puedas compilarlo de esta forma sin tener instalado el OMNeT++. Gracias por tu tiempo y por contestar.

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Visual C++ 7.1 (mvs .net 2003) Y Clases
« Respuesta #7 en: Domingo 5 de Noviembre de 2006, 10:14 »
0
No suelo usar jamas makefiles, salvo con el DDK, pero lo primero que deberias hacer es comprobar que dentro del Makefile.vc haya una referencia a Routingtable.cpp ... seguramente no la haya.

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

JoGalGar

  • Nuevo Miembro
  • *
  • Mensajes: 11
    • Ver Perfil
Re: Visual C++ 7.1 (mvs .net 2003) Y Clases
« Respuesta #8 en: Domingo 5 de Noviembre de 2006, 13:33 »
0
Hola. Para mí es  nuevo el Makefile.vc, ya que siempre hacía proyectos en el Visual C++ y los compilaba de ahí. Ya chequé el Makefile.vc y como dices, no hay ninguna referencia a Routingtable.h en él ... qué me recomiendas que haga?

P.D. Gracias por seguir respondiendo y ayudándome.

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Visual C++ 7.1 (mvs .net 2003) Y Clases
« Respuesta #9 en: Domingo 5 de Noviembre de 2006, 14:14 »
0
Cita de: "JoGalGar"
qué me recomiendas que haga?
Hacer referencia al fuente (Routingtable.cpp) si podes y sino publicar aca el Makefile, asi tal vez te podamos ayudar mejor.

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

JoGalGar

  • Nuevo Miembro
  • *
  • Mensajes: 11
    • Ver Perfil
Re: Visual C++ 7.1 (mvs .net 2003) Y Clases
« Respuesta #10 en: Domingo 5 de Noviembre de 2006, 14:39 »
0
Hola. Como dije antes, nunca había utilizado el Makefile.vc y nunca se me había ocurrido abrir este archivo. Al abrir un Makefile.vc de una simulación del OMNeT++ ya compilada observé un cambio al inicio del archivo y creo es el problema. El archivo que abrí es el Makefile.vc del módulo PPP. En el PPP.cpp, así como en el PPP.h, se incluyen encabezados (.h) de otros archivos que incluso están en otros folders. Las líneas que difieren de mi Makefile.vc son las siguientes:

#
#  Makefile for PPP
#
#  ** This file was automatically generated by the command:
#  opp_nmakemake -f -N -b C:\oppsim\INET\ -c C:\oppsim\INET\/inetconfig.vc -I. -n -IC:\oppsim\INET\/Transport/Contract -IC:\oppsim\INET\/Network/Contract -IC:\oppsim\INET\/NetworkInterfaces/Contract -IC:\oppsim\INET\/Base -IC:\oppsim\INET\/Util -I../../Network/Queue
#
#  By the Perl version of opp_makemake for MSVC
#

Y el Makefile.vc para el IP que hice es el siguiente:

#
#  Makefile for IP
#
#  ** This file was automatically generated by the command:
#  opp_nmakemake
#
#  By the Perl version of opp_makemake for MSVC
#

Al parecer la forma en que compilo mi código es diferente a la que utilizaron para el módulo PPP ... o almenos eso es lo que observo en estas primeras líneas. Te mando los archivos Makefile.vc para que corrobores lo que digo. De nuez ... gracias!!!
El mensaje contiene 1 archivo adjunto. Debes ingresar o registrarte para poder verlo y descargarlo.

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Visual C++ 7.1 (mvs .net 2003) Y Clases
« Respuesta #11 en: Domingo 5 de Noviembre de 2006, 15:01 »
0
Yo haria algo asi:

de
OBJS= IPDatagram_m.obj IP.obj
a
OBJS= IPDatagram_m.obj IP.obj Routingtable.obj

y despues de pondria mas o menos lo mismo
IP.obj: IP.cpp
   $(CXX) -c $(COPTS) /Tp IP.cpp

Routingtable.obj: Routingtable.cpp
   $(CXX) -c $(COPTS) /Tp Routingtable.cpp

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

JoGalGar

  • Nuevo Miembro
  • *
  • Mensajes: 11
    • Ver Perfil
Re: Visual C++ 7.1 (mvs .net 2003) Y Clases
« Respuesta #12 en: Domingo 5 de Noviembre de 2006, 18:41 »
0
Hola de nuez. Emm ... cómo decirlo? ... Tenía los archivos IP.cpp/IP.h en una carpeta y los Routingtable.h/Routingtable.cpp en otra carpeta. Antes había puesto todos los archivos en una misma carpeta, compilé y me generó un error. Ahora iba a hacer lo que me dijiste que hiciera pero con todos los archivos otra vez en una misma carpeta y extrañamente ... compiló sin errores!!! No sé qué pasa o porqué anteriormente me causó problemas. Gracias por el apoyo!! Voy a checar bien la compilaclión otra vez para ver si no fue simplemente suerte.

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Visual C++ 7.1 (mvs .net 2003) Y Clases
« Respuesta #13 en: Domingo 5 de Noviembre de 2006, 18:43 »
0
Cita de: "JoGalGar"
Hola de nuez. Emm ... cómo decirlo? ... Tenía los archivos IP.cpp/IP.h en una carpeta y los Routingtable.h/Routingtable.cpp en otra carpeta. Antes había puesto todos los archivos en una misma carpeta, compilé y me generó un error. Ahora iba a hacer lo que me dijiste que hiciera pero con todos los archivos otra vez en una misma carpeta y extrañamente ... compiló sin errores!!! No sé qué pasa o porqué anteriormente me causó problemas. Gracias por el apoyo!! Voy a checar bien la compilaclión otra vez para ver si no fue simplemente suerte.
Probablemente compile todos los .cpp del directorio, creo recordar habia un *.cpp por ese archivo  :smartass:

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

JoGalGar

  • Nuevo Miembro
  • *
  • Mensajes: 11
    • Ver Perfil
Re: Visual C++ 7.1 (mvs .net 2003) Y Clases
« Respuesta #14 en: Domingo 5 de Noviembre de 2006, 18:54 »
0
Pues sí compila ya sin errores  :o  No sé que hacía antes o qué carambas pero ya jala ahorita. Intenté ver si compila haciendo referencia al Routingtable.h que está en otra carpeta pero generó el error. Regresé todo a la misma carpeta y lo compiló sin problemas. Realmente no sé qué pasó. Muchísimas gracias por tu tiempo!!! Arigatou!!!!

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Visual C++ 7.1 (mvs .net 2003) Y Clases
« Respuesta #15 en: Domingo 5 de Noviembre de 2006, 18:57 »
0
Cita de: "JoGalGar"
Muchísimas gracias por tu tiempo!!! Arigatou!!!!
De nadas  :ph34r:

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

JoGalGar

  • Nuevo Miembro
  • *
  • Mensajes: 11
    • Ver Perfil
Re: Visual C++ 7.1 (mvs .net 2003) Y Clases
« Respuesta #16 en: Martes 7 de Noviembre de 2006, 04:15 »
0
Hola de nuevo. Tengo otro problema. Cree un mensaje en OMNeT++ llamado IPDatagram.msg. El compilador de OMNeT++ lo cambia a IPDatagram_m.h e IPDatagram_m.cpp. Con estos archivos se genera, digamos, una clase tipo IPDatagram donde por medio del "get" y el "set" se adquieren o establecen, respectivamente, valores dentro del mensaje .msg. En este caso, necesito que tanto srcip como destip cambien a tipo string. Ya realzié lo siguiente (el código está al final):
string a = srcip;
Y me marcó el siguiente error:
... cannot convert from 'IPDatagram *' to 'std::basic_string<_Elem,_Traits,_Ax>'
with
        [
            _Elem=char,
            _Traits=std::char_traits<char>,
            _Ax=std::allocator<char>
        ]
        No constructor could take the source type, or constructor overload resolution was ambiguous
Podrías ayudarme a cambiar de IPDatagram * a un entero? Gracias.

void IP::handlemessage(cMessage *msg)
{
   pktsin++;
   IPDatagram *srcip = new IPDatagram();
   srcip -> getSrcAddress();
   IPDatagram *destip = new IPDatagram();
   destip -> getDestAddress();
   IPDatagram *ttl = new IPDatagram();
   ttl -> setTtl(ttl -> getTtl()-1);
   rta = new Routingtable();
   rta->findroute(srcip);
}

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Visual C++ 7.1 (mvs .net 2003) Y Clases
« Respuesta #17 en: Martes 7 de Noviembre de 2006, 08:19 »
0
Estoy viendo la documentacion en:

http://www.omnetpp.org/doc/INET/doxy/class_i_p_datagram.html

tanto srcAddress como destAddress son del tipo IPAddress que tiene un metodo llamado str ... entonces supongo que con esto te funcionara:

Código: Text
  1.  
  2. string a = srcip-&#62;srcAddress.str();
  3.  
  4.  

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

JoGalGar

  • Nuevo Miembro
  • *
  • Mensajes: 11
    • Ver Perfil
Re: Visual C++ 7.1 (mvs .net 2003) Y Clases
« Respuesta #18 en: Martes 7 de Noviembre de 2006, 20:21 »
0
Muchas gracias. No funcionó bien, me dice el siguiente error:

IP.cpp(31) : error C2228: left of '.str' must have class/st
        type is 'IPDatagram *'
        did you intend to use '->' instead?

Intenté lo siguiente:

   ostringstream sA;
   IPDatagram *srcip = new IPDatagram();
   srcip -> getSrcAddress();
   sA<<srcip;
   string A = sA.str();
   rta = new Routingtable();
   rta->findroute(A);

Y ya no me marcó error la compilación ... en teoría sí lo hice bien. Ahora, no sé como hacer un proceso similar pero para cambiarlo a int. Gracias por tu tiempo.

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Visual C++ 7.1 (mvs .net 2003) Y Clases
« Respuesta #19 en: Martes 7 de Noviembre de 2006, 21:08 »
0
Cita de: "JoGalGar"
Muchas gracias. No funcionó bien, me dice el siguiente error:

IP.cpp(31) : error C2228: left of '.str' must have class/st
        type is 'IPDatagram *'
        did you intend to use '->' instead?
Bueno, la documentacion no es muy exacta entonces ya que dice IPAddress y no *IPAddress, tendrias que haber puesto lo mismo pero con ->str(). El int lo tenes ahi igual de facil:

Código: Text
  1.  
  2. int ip = srcip-&#62;srcAddress-&#62;getInt();
  3.  
  4.  

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

JoGalGar

  • Nuevo Miembro
  • *
  • Mensajes: 11
    • Ver Perfil
Re: Visual C++ 7.1 (mvs .net 2003) Y Clases
« Respuesta #20 en: Miércoles 8 de Noviembre de 2006, 14:48 »
0
Hola. Gracias por responder. Ya intenté lo que me dijiste, pero aun así muestra el error, sólo que un poco diferente:

IP.cpp(31) : error C2228: left of '->str' must have class/st
type is 'const char *'

Creo que ya pude obtener un int y un string. Hice lo siguiente:

                ostringstream sA;
   IPDatagram *srcip = new IPDatagram();
   srcip -> getSrcAddress();
   sA<<srcip;
   string A = sA.str();
   rta = new Routingtable();
   rta->findroute(A);
   ev<<parentModule()->name()<<endl;
   const char *str = A.c_str();
   int h = atoi(str);

De esta forma "pude" tener tanto el int como el string, almenos el compilador no marca error. Muchas gracias por todo. Nos vemos!!