Programación General > Visual C++

 Problema con Lista Enlazada

(1/1)

Daggoth:
Hola a todos :beer:

Tengo un problema con una lista enlazada y os puedo asegurar que no se donde esta el error. Os pongo en situacion:

Estoy haciendo un juego en C++ y SDL tipo estrategia pero con unas unidades fijas, es decir, al principio selecciono cuales quiero y ya no puedo aumentar mi ejercito. Para guardar los datos de las unidades estoy usando listas enlazadas con un estructura como la siguiente:

--- Código: C++ --- struct unidad{    int x;    int y;    int w;    int h;    int color;    int tipoUnidad;    int numeroUnidad;    bool movimiento;}; struct ejercitos{    unidad tropa;    ejercitos *sig;};  Luego en mi codigo inicio mi lista enlazada:

--- Código: C++ --- void Inicializa(ejercitos *&ejercitoaformar){     unidad tropa;        ejercitoaformar = new ejercitos;    tropa.color = 6;    tropa.h = 10;    tropa.w = 10;    tropa.movimiento = true;    tropa.numeroUnidad = 1;    tropa.tipoUnidad = 1;    tropa.x = 600;    tropa.y = 400;    ejercitoaformar->tropa = tropa;    ejercitoaformar->sig = 0;}  y hasta ahi todo bien y sin errores de ningun tipo, pero cuando mas adelante llamo a otra funcion para añadir las nuevas unidades que voy seleccionado a mi lista, esta por arte de magia aparece vacia, es decir, no tiene nada pese a que unas lineas mas arriba la he inicializado con el codigo que os he puesto.

La funcion de inicializacion y la de añadir nueva unidad estan ambas, junto a otras mas, en un fichero diferente desde el que las llamo pero su cabecera si se encuentra incluida en el fichero llamador. No se porque la lista se vuelve vacia de pronto, no se si al bucle principal del programa tendra algo que ver, no lo se, pero ya no puedo mas, he miraado el codigo, lo he cambiado, lo he vuelto a cambiar, lo he cambiado otra vez y no se que hacer mas.

Cualquier tipo de comentario sera de gran ayuda.
Gracias :good:

N3oDoc:
Deberías crear una clase y eso no te pasaría, porque inicializas los valores con el costructor.

Amilius:
En C++ la única diferencia entre una clase y un struct es la visibilidad de los miembros: A menos que espeficiques otra cosa en un struct todo es público y en una clase todo es privado.

Tal vez sería mejor que uses las bibliotecas std, para este caso la clase vector te sirve para almacenar una lista de N elementos del tipo que quieras.
Documentación (en inglés): http://www.cplusplus.com/reference/stl/vector/


--- Código: Text --- #include <stdio.h>#include <vector> struct unidad{    int x;    int y;    int w;    int h;    int color;    int tipoUnidad;    int numeroUnidad;    bool movimiento;     unidad() : x(600), y(400), w(10), h(10), color(6), tipoUnidad(1), numeroUnidad(1), movimiento(true)    {        printf("Creando unidad: 0x%pn", this);    };     ~unidad()    {        printf("Eliminando unidad: 0x%pn", this);    };}; typedef std::vector<unidad*> Ejercito; void main(){    Ejercito v;    v.push_back(new unidad());    v.push_back(new unidad());    v.push_back(new unidad());    v.push_back(new unidad());    // Destruir elementos del vector    Ejercito::iterator it;    for (it = v.begin(); it != v.end(); it++) delete *it;     unidad u;    printf("Color de unidad u: %u n", u.color);}  

N3oDoc:
Al crear una clase, cuando creas una instancia de dicha clase inicializas los atributos de la clase mediante el constructor de dicha clase. De esta manera solo necesitas implementar un método para modificar dichos atributos cada vez que quieras modificar algun atributo.
Un ejemplo de la clase podría ser la siguiente:


--- Código: C++ --- //cabecera de la clase Ejercito, archivo Ejercito.hppclass Ejercito{   public:   struct unidad{     int x;     int y;     int w;     int h;     int color;     int tipoUnidad;     int numeroUnidad;     bool movimiento;   };   typedef unidad TUnidad;      Ejercito();   ~Ejercito();   void InsertarUnidad(const TUnidad unidad);   void EliminarUnidad(const int pos);   TUnidad VisualizarUnidad();   int Longitud();   void CambiarValor(const int pos, const TUnidad unidad);        private:      struct TNodo{         TUnidad unidad;         TNodo *sig;      };      typedef TNodo *TLista;      TLista lista;};  
//Implementación de los métodos de la clase Ejercito, archivo CEjercito.cpp


--- Código: C++ --- #include <stdlib.h>#include "Ejercito.hpp"#include <iostream> using namespace std; Ejercito::Ejercito(){   lista = NULL;} Ejercito::~Ejercito(){   TLista ptr;   while(lista != NULL){      ptr =lista;      lista =lista->sig;      delete ptr;   }} void Ejercito::InsertarUnidad(const TUnidad unidad){   TLista nuevo,ant,ptr;   nuevo = new TNodo;   nuevo->sig = NULL;   nuevo->unidad = unidad;   if(lista == NULL){ //lista vacia, insertar primero      lista = nuevo;   }else{      ptr = lista;      ant = NULL;      while(ptr != NULL && unidad.numeroUnidad > ptr->unidad.numeroUnidad){         ant = ptr;         ptr = ptr->sig;      }      if(ant == NULL){ //primer nodo         nuevo->sig = lista;         lista = nuevo;      }else{         ant->sig = nuevo;         nuevo->sig = ptr;      }   }}  void Ejercito::EliminarUnidad(const int pos){{  TLista ptr,ant;  int posact = 1;  bool borrado = false;  if(lista != NULL){      if(pos <= Longitud()){         ptr = lista;         while(posact != pos){            ant = ptr;            ptr = ptr->sig;            posact++;         }         if( pos == 1){ //primera posicion a borrar            lista = lista->sig;         }else{            if(pos == Longitud()){ //ultima posicion               ant->sig = NULL;            }else{  //posicion intermedia               ant->sig = ptr->sig;            }         }         delete ptr;         borrado = true;      }   }   return borrado;}    Ejercito::TUnidad Ejercito::VisualizarUnidad(const int pos, bool &ok){    TUnidad unidad;   TLista ptr;   int posact = 1;   ok = false;      if(lista != NULL){      if(pos <= Longitud()){         ptr = lista;         while(posact != pos){            posact++;            ptr = ptr->sig;         }         ok = true;         unidad = ptr->unidad;      }   }      return unidad;}  int Ejercito::Longitud(){   int longitud = 0;   TLista ptr;   ptr = lista;   while(ptr != NULL){      ptr = ptr->sig;      longitud++;   }      return longitud; } //y el método para modificar los valores de la Unidad podrían ser: void Ejercito::CambiarValor(const int pos, const TUnidad unidad){   TLista ptr;   int posact = 1;   if(l != NULL){      if(pos > 0 && pos <= Longitud()){         ptr = lista;         while(ptr->sig != lista && posact != pos){            ptr = ptr->sig;            posact++;         }         ptr->unidad= unidad;      }   }    }   

Navegación

[0] Índice de Mensajes

Ir a la versión completa