Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: BlackM4ster en 22 Marzo 2013, 16:54 pm



Título: (SOLUCIONADO) Ayuda con los structs
Publicado por: BlackM4ster en 22 Marzo 2013, 16:54 pm
Estoy creando un juego, necesito un struct que almacene el id del objeto con sus caracteristicas. he creado un header y accediendo solo desde el main funciona bien pero cuando intento acceder a el struct desde otro .cpp falla:

idobjeto.h

Código:
int ObjetosTotales = 0;

struct Objeto{
    
float x, y, z;
GLuint modelo;
float t_x, t_y, t_z;
int ang_x;

   void Nuevo(GLuint vmodelo, float vx,float vy,float vz,int vang_x,float vt_x,float vt_y,float vt_z) {
  modelo = vmodelo;
  ang_x = vang_x;
  x = vx; t_x = vt_x;
  y = vy; t_y = vt_y;
  z = vz; t_z = vt_z;
  ObjetosTotales++;
   }

}Objeto[5000];

Como hago para poder acceder a el desde cualquier .cpp? uso vc++2008
Gracias de antemano porfavor las respuestas lo mas detalladas posibles :)


Título: Re: Ayuda con los structs
Publicado por: naderST en 22 Marzo 2013, 17:33 pm
Declara el arreglo en el otro cpp usando el modificador extern de la siguiente manera y no debería darte problemas.

extern struct Objecto Objeto[5000];


Título: Sigue sin funcionarme
Publicado por: BlackM4ster en 23 Marzo 2013, 13:53 pm
No se como usarlo, porfavor ayuda:

Main.cpp
Código:
#include "header.h"
#include "struct.h"

using namespace std;

int Comprobar();

int main(){

cout << "asdasd" << endl;
Objeto[ObjetosTotales+1].Nuevo(69,1,1,1,1,1,1,1);
getch();
Comprobar();
getch();

return 0;
}

Struct.h
Código:
#ifndef STRUCTOBJETO_H
#define STRUCTOBJETO_H

int ObjetosTotales = 0;

struct Objeto{
   
float x, y, z;
int modelo;
float t_x, t_y, t_z;
int ang_x;

void Nuevo(int vmodelo, float vx,float vy,float vz,int vang_x,float vt_x,float vt_y,float vt_z) {
   modelo = vmodelo;
   ang_x = vang_x;
   x = vx; t_x = vt_x;
   y = vy; t_y = vt_y;
   z = vz; t_z = vt_z;
   ObjetosTotales++;
   }
};

extern Objeto Objeto[5000];

#endif

añadir.cpp
Código:
#include "header.h"
#include "struct.h"

using namespace std;

extern struct Objeto Objeto[5000];

int Comprobar(){
if(Objeto[ObjetosTotales].modelo == 69){
return 1;}

return 0;
}

Resultado:
Código:
Vinculando...
anadir.obj : error LNK2005: ya se definió "int ObjetosTotales" (?ObjetosTotales@@3HA) en main.obj
struct.obj : error LNK2005: ya se definió "int ObjetosTotales" (?ObjetosTotales@@3HA) en main.obj
main.obj : error LNK2001: símbolo externo "struct Objeto * Objeto" (?Objeto@@3PAU0@A) sin resolver
anadir.obj : error LNK2001: símbolo externo "struct Objeto * Objeto" (?Objeto@@3PAU0@A) sin resolver


Título: Re: Ayuda con los structs
Publicado por: 85 en 23 Marzo 2013, 14:02 pm
Borrá esta línea

Citar
#include "header.h"
#include "struct.h"

using namespace std;

extern struct Objeto Objeto[5000];

int Comprobar(){
   if(Objeto[ObjetosTotales].modelo == 69){
      return 1;}

   return 0;
}


Título: Re: Ayuda con los structs
Publicado por: BlackM4ster en 23 Marzo 2013, 14:03 pm
sigue fallando. Msn: blackm4ster@gmail.com
Da el mismo error


Título: Re: Ayuda con los structs
Publicado por: 85 en 23 Marzo 2013, 14:04 pm
dejá la anterior y borrá la otra. No se puede las 2


Título: Re: Ayuda con los structs
Publicado por: BlackM4ster en 23 Marzo 2013, 14:06 pm
mm no te entiendo, de que archivo borro la linea extern struct Objeto Objeto[5000];


Título: Re: Ayuda con los structs
Publicado por: 85 en 23 Marzo 2013, 14:06 pm
dahh le pusiste el mismo nombre que la clase? no se puede eso


Código:
Objeto objeto[5000];

ponelo así, ves la minúscula en el nombre?

tenés que declararlo en algún archivo .cpp y luego en algún archivo de inclusión .h lo ponés como extern.
Esto significa que cuando el objeto se use en un archivo.cpp se hace una referencia al objeto que fue declarado en otro archivo .cpp.



Título: Re: Ayuda con los structs
Publicado por: BlackM4ster en 23 Marzo 2013, 14:09 pm
a ver sigue sin funcionar:
struct.h
Código:
#ifndef STRUCTOBJETO_H
#define STRUCTOBJETO_H

int ObjetosTotales = 0;

struct Objeto{
   
float x, y, z;
int modelo;
float t_x, t_y, t_z;
int ang_x;

void Nuevo(int vmodelo, float vx,float vy,float vz,int vang_x,float vt_x,float vt_y,float vt_z) {
   modelo = vmodelo;
   ang_x = vang_x;
   x = vx; t_x = vt_x;
   y = vy; t_y = vt_y;
   z = vz; t_z = vt_z;
   ObjetosTotales++;
   }
};

extern Objeto objeto[5000];

#endif

main.cpp
Código:
#include "header.h"
#include "struct.h"

using namespace std;

int Comprobar();

int main(){

cout << "asdasd" << endl;
objeto[ObjetosTotales+1].Nuevo(69,1,1,1,1,1,1,1);
getch();
Comprobar();
getch();

return 0;
}

anadir.cpp
Código:
#include "header.h"
#include "struct.h"

using namespace std;


int Comprobar(){
if(objeto[ObjetosTotales].modelo == 69){
return 1;}

return 0;
}

Errores:
Código:
Vinculando...
anadir.obj : error LNK2005: ya se definió "int ObjetosTotales" (?ObjetosTotales@@3HA) en main.obj
struct.obj : error LNK2005: ya se definió "int ObjetosTotales" (?ObjetosTotales@@3HA) en main.obj
main.obj : error LNK2001: símbolo externo "struct Objeto * objeto" (?objeto@@3PAUObjeto@@A) sin resolver
anadir.obj : error LNK2001: símbolo externo "struct Objeto * objeto" (?objeto@@3PAUObjeto@@A) sin resolver
C:\Documents and Settings\isc\Mis documentos\Visual Studio 2008\Projects\Structs\Debug\Structs.exe : fatal error LNK1120: 1 externos sin resolver


Título: Re: Ayuda con los structs
Publicado por: naderST en 23 Marzo 2013, 14:10 pm
Advertencia - mientras estabas escribiendo, fueron publicadas 3 respuestas. Probablemente desees revisar tu mensaje.
Ejemplo sencillo:

archivo1.cpp
Código
  1. #include <iostream>
  2.  
  3. struct Objeto {
  4.    int a,b,c,d;
  5. } Objeto[5000];
  6.  
  7. int main() {
  8.    cout << "Hello world!" << endl;
  9.    return 0;
  10. }
  11.  

archivo2.cpp
Código
  1. extern struct Objeto {
  2.    int a,b,c,d;
  3. } Objeto[5000];
  4.  
  5. void funcion() {
  6.    // ...
  7. }
  8.  


Título: Re: Ayuda con los structs
Publicado por: 85 en 23 Marzo 2013, 14:12 pm
el objeto debe ser declarado antes de usar 'extern'.
declaralo en algún archivo .cpp que incluya el acceso a la clase o struct.
después podés usar así:

Código:
extern Objeto objeto[5000];

en otros archivos, para referenciar a un objeto existente en otro archivo.

pero en la declaración no se puede hacer esto:
Código:
Objeto Objeto[5000];

tiene el mismo nombre que la clase o struct, por eso ponelo así:
Objeto objeto[5000];


Título: Re: Ayuda con los structs
Publicado por: BlackM4ster en 23 Marzo 2013, 14:19 pm
No consigo que funcione. Solo quiero tener un header con el struct y usar los datos desde cualquier .cpp

Con este code no da error de struct pero si de objetostotales

struct.h
Código:
#ifndef STRUCTOBJETO_H
#define STRUCTOBJETO_H

int ObjetosTotales = 0;

struct Objeto{
    
   float x, y, z;
   int modelo;
   float t_x, t_y, t_z;
   int ang_x;

   void Nuevo(int vmodelo, float vx,float vy,float vz,int vang_x,float vt_x,float vt_y,float vt_z) {
      modelo = vmodelo;
      ang_x = vang_x;
      x = vx;   t_x = vt_x;
      y = vy;   t_y = vt_y;
      z = vz;   t_z = vt_z;
      ObjetosTotales++;
   }
};

extern Objeto objeto[5000];

#endif

main.cpp
Código:
#include "header.h"
#include "struct.h"

using namespace std;

struct Objeto objeto[5000];// Declaración, no va con extern!
int Comprobar();

int main(){

cout << "asdasd" << endl;
objeto[ObjetosTotales+1].Nuevo(69,1,1,1,1,1,1,1);
getch();
Comprobar();
getch();

return 0;
}

anadir.cpp
Código:
#include "header.h"
#include "struct.h"

using namespace std;



int Comprobar(){
   if(objeto[ObjetosTotales].modelo == 69){
      return 1;}

   return 0;
}

Errores:
Código:
Vinculando...
anadir.obj : error LNK2005: ya se definió "int ObjetosTotales" (?ObjetosTotales@@3HA) en main.obj
struct.obj : error LNK2005: ya se definió "int ObjetosTotales" (?ObjetosTotales@@3HA) en main.obj
C:\Documents and Settings\isc\Mis documentos\Visual Studio 2008\Projects\Structs\Debug\Structs.exe : fatal error LNK1169: se encontraron uno o más símbolos definidos simultáneamente


Título: Re: Ayuda con los structs
Publicado por: 85 en 23 Marzo 2013, 14:23 pm
claro el error era el mismo nombre de la clase o struct con el del registro o variable. Ahora deberías usar extern con esa variable que decís también.

struct.h
extern int ObjetosTotales;


main.cpp
int ObjetosTotales = 0;


como ves, la asignación de valor no se incluye cuando se usa 'extern'.


Título: Re: Ayuda con los structs
Publicado por: BlackM4ster en 23 Marzo 2013, 14:29 pm
MUCHISIMAS GRACIAAAS YA LO HE CONSEGUIDO GRACIAS !!!!!
un link a el juego que estoy creando a ver que te parecec jaaja: https://www.dropbox.com/s/0m9mhmrgmhmt7an/Juego%20Isc.rar