Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





problemas con librería c++ <list>

Iniciado por bruno, 29 de Julio de 2008, 01:57:21 AM

« anterior - próximo »

bruno

hola a todos

les comento un error que me produce el visual studio 8. intento hacer una matriz de listas (<list>) y a la hora de hacer push_back el visual me lanza un mensaje de error como que la cabeza de la lista vale nulo o no tiene valor.

acá les paso el código de la inicialización:


m_Elements = (list<Actor*>**) malloc(sizeof(list<Actor*>*)*m_Height);

for (int i=0; i<m_Height; i++)
      m_Elements[i] = (list<Actor*>*) malloc(sizeof(list<Actor*>)*m_Width);


y aquí el código de la añadidura:



m_Elements.push_back(new_actor);


y el error es:

Unhandled exception at 0x0041831d in test2.exe: 0xC0000005: Access violation reading location 0xcdcdcdd5.


entonces me muestra el archivo list, esta parte:


#if _HAS_ITERATOR_DEBUGGING
void _Orphan_ptr(_Myt& _Cont, _Nodeptr _Ptr) const
{ // orphan iterators with specified node pointers
_Lockit _Lock(_LOCK_DEBUG);
const_iterator **_Pnext = (const_iterator **)&_Cont._Myfirstiter;
while (*_Pnext != 0)
if ((*_Pnext)->_Ptr == _Myhead
|| _Ptr != 0 && (*_Pnext)->_Ptr != _Ptr) <<<<<<<<<<<<<<<<<<<<<error
_Pnext = (const_iterator **)&(*_Pnext)->_Mynextiter;
else
{ // orphan the iterator
(*_Pnext)->_Mycont = 0;
*_Pnext = (const_iterator *)(*_Pnext)->_Mynextiter;
}
}
#endif /* _HAS_ITERATOR_DEBUGGING */

y cuando examino mas detenidamente veo que _Myhead no vale nada supongo que será por eso.

muy agradecido por la ayuda de antemano :D

Pogacha

No estas inicializando las listas. Al usar malloc, no se esta llamando al constructor de las listas.

Puedes simplemente hacer:
m_Elements = new list<Actor*>[m_Width];

AK47

Aaarrg mis ojos!

Por que no haces algo asi como

std::vector< std::list<Actor> > m_Elements; // Ojo con el espacio entre los signos de mayor y menor

y luego lo rellenas como quieres?

LC0

Lo que yo me pregunto es que razón te lleva a usar estructuras de la STL y mezclarlas con los mecanismos de reserva de memoria de ANSI C. Como te dice Pogacha una de las consecuencias es que no se llama al constructor de la lista, por lo que no estará inicializada. En esa zona de memoria solo habrá mierda (con perdón de la expresión) y claro, el proceso de casting es escrupuloso, no le gusta tocar cosas que él no conoce.

Insisto, ¿cuál es tu razón para usar malloc? Si conoces std::list, por huevos tienes que conocer el operador new.

bruno

gracias por las respuestas.

yo lo que pretendo es tener una matriz del tipo list, los ejemplos que me ponen es de vectores de listas. por comodidad me gustaría una matriz, se puede hacer algo?? pq yo no he podido aun buscando por google, sino recurriré a las template que seguro me dan buenos resultados

Pogacha

El camino mas facil es hacer una matriz a mano con un vector.

typedef list<Actor*> mylist;
typedef mylist* mylistptr;

class Matrix {
  vector<mylistptr> mMatrix;
  int mN, mM;

  public:
  Matrix(int n, int m) : mN(n), mM(m) { mMatrix.resize(mN*mM); }

struct SubIndex {
    int mM;
    mylistptr* mMyList;
  public:
    SubIndex(int m, mylistptr* ml) : mM(m), mMyList(ml) { }
    mylistptr& operator[](int i) { assert(i>=0 && i<mM); return mMyLyst[i]; }
 };  

  SubIndex operator[](int i) { assert(i>=0 && i<mN); return SubIndex(mN, &mMatrix[i*mM]); }
};

//puedes acceder haciendo
Matrix m(10,20);

m[4][5] = 0;
m[6][15] = new mylist;


Pero esto es algo *tricky* y va a compilar bien dependiendo de tu compilador.

tamat

o puedes hacer un std:vector< std::vector< std::list< Actor*> > > Matrix;

Que acojona, sí, pero así es el mundo de la programación.
Por un stratos menos tenso

AK47

Yo estoy con pogacha, lo mejor es hacerse una clase que tire de std::vector y listos :)

Buffon

que pena que haya llegado tan tarde a este post, tmb quería vengarme por tal hazaña de hacer mis ojos llorar !!!!

me ha hecho gracia el malloc haha

davur

Si quieres una solución estándar, genérica y eficiente, te recomiendo boost::numeric::ublas::matrix<>.

bruno

ante todo gracias por contestar :D

Pogacha gracias por la aportación probaré a ver qué tal funciona en los dos compiladores en que quiero que funcione la aplicación.

Cita de: "Buffon"que pena que haya llegado tan tarde a este post, tmb quería vengarme por tal hazaña de hacer mis ojos llorar !!!!

me ha hecho gracia el malloc haha

si te lloran los ojos... un buen colirio

Cita de: "davur"Si quieres una solución estándar, genérica y eficiente, te recomiendo boost::numeric::ublas::matrix<>.

muchas gracias por la aportación, lo probaré que parece rápido de implementar

Cita de: "tamat"o puedes hacer un std:vector< std::vector< std::list< Actor*> > > Matrix;

Que acojona, sí, pero así es el mundo de la programación.

llevo trabajando un tiempecito con shell script en unix modificando kernels usando C y assembler, te aseguro que poner std::vector no me acojona para nada en absoluto, probaré a ver qué tal, gracias :D

Buffon

Cita de: "bruno"ante todo gracias por contestar :D

Pogacha gracias por la aportación probaré a ver qué tal funciona en los dos compiladores en que quiero que funcione la aplicación.

Cita de: "Buffon"que pena que haya llegado tan tarde a este post, tmb quería vengarme por tal hazaña de hacer mis ojos llorar !!!!

me ha hecho gracia el malloc haha

si te lloran los ojos... un buen colirio

no te lo tomes a mal tio, pero si quieres usar C++ deber mirarte un manual de como se maneja la memoria y no hacerlo a la antigua usanza.

Cita de: "bruno"
llevo trabajando un tiempecito con shell script en unix modificando kernels usando C y assembler, te aseguro que poner std::vector no me acojona para nada en absoluto, probaré a ver qué tal, gracias :D

poner std::vector no te puede acojonar cuando haces vector = (...) malloc(...) y si llevas taaanto tiempo trabajando a máquina con assembler y C que menos que buscar como se maneja la memoria con clases en C++.

O por lo menos, mirar antes como está estructurado por dentro un vector<Template> para intentar emularlo y no hacerlo a piñón con un malloc, que trabajar en assembler te tendría que haber metido muchas ostias como para hacerlo a la ligera ^^

AK47

Estoy con Buffon, por tu código se nota que le has dado al C, pero para C++ usa new, si es que lo necesitas realmente. new hace mas cosas, por ejemplo llama al constructor de la clase, mientras que malloc no. Mirate ejemplos de las STL, que ya verás que quizás ni siquiera necesites reservar memoria dinámicamente.






Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.