elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Usando Git para manipular el directorio de trabajo, el índice y commits (segunda parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Extraño problemas con vector
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Extraño problemas con vector  (Leído 2,204 veces)
amchacon


Desconectado Desconectado

Mensajes: 1.211



Ver Perfil
Extraño problemas con vector
« en: 11 Abril 2014, 00:14 am »

Pues resulta que tenía petadas "aleatorias" en mi programa. Estuve mirando y comprobé que pasaba en la destrucción de un objeto.

El objeto tiene pocos atributos, lo unico que puede causar problemas es:
Código
  1. std::vector<std::vector<RGB> > Matriz;

RGB es una clase con 3 enteros. Eso no debería causar problemas.

Probé a depurar el destructor:
Código
  1. ~Image()
  2. {
  3.    for (int i = 0; i < Matriz.size();i++)
  4.        Matriz[i].clear();
  5.    std::cout<<"Destruidas las filas..."<<std::endl;
  6.    Matriz.clear();
  7.    std::cout<<"^^"<<std::endl;
  8. };
  9.  

Falla en el ultimo clear. Pero no entiendo porque. ¿Hay problemas en destruir un vector desde otro vector?

Repito que no pasa siempre, solo pasa en X casos (y con la misma entrada y circunstancias :huh: :huh:).



Vale, esque escribía en posiciones negativas del vector *_*


« Última modificación: 11 Abril 2014, 19:09 pm por Eternal Idol » En línea

Por favor, no me manden MP con dudas. Usen el foro, gracias.

¡Visita mi programa estrella!

Rar File Missing: Esteganografía en un Rar
ivancea96


Desconectado Desconectado

Mensajes: 3.412


ASMático


Ver Perfil WWW
Re: Extraño problemas con vector
« Respuesta #1 en: 12 Abril 2014, 13:18 pm »

Pero el destructor de vector ya destruye sus componentes por ti no? :o


En línea

amchacon


Desconectado Desconectado

Mensajes: 1.211



Ver Perfil
Re: Extraño problemas con vector
« Respuesta #2 en: 12 Abril 2014, 13:51 pm »

Pero el destructor de vector ya destruye sus componentes por ti no? :o
Ya lo sé, pero estaba depurando porque era super extraño.

Para la proxima vez usaré la funcion at en vez de los corchetes [] para adceder al vector. La función at lanza una excepción si adcedo fuera del rango, asi que me libro de estos problemas ^^
En línea

Por favor, no me manden MP con dudas. Usen el foro, gracias.

¡Visita mi programa estrella!

Rar File Missing: Esteganografía en un Rar
eferion


Desconectado Desconectado

Mensajes: 1.248


Ver Perfil
Re: Extraño problemas con vector
« Respuesta #3 en: 14 Abril 2014, 08:57 am »

El problema de los corchetes es que si el índice no existe, el contenedor puede añadirlo automáticamente al hacer la consulta ( en los mapas al menos es así ).

Código
  1. #include <iostream>
  2. #include <map>
  3.  
  4. int main( )
  5. {
  6.  std::map< int, int > datos;
  7.  
  8.  std::cout << datos.size( ) << std::endl;
  9.  
  10.  int numero = datos[ 3 ];
  11.  
  12.  std::cout << datos.size( ) << std::endl;
  13. }

Una opción es usar, como has comentado, el método "at", que es de solo lectura. El problema es que te obliga a controlar las excepciones y en algunos entornos está mal visto.

El segundo método es lanzar un find para saber si posee ese índice ( en el caso de los vectores se puede hacer con size acordándose de controlar números negativos ) y, si el índice existe entonces recuperar el valor asociado.

En línea

amchacon


Desconectado Desconectado

Mensajes: 1.211



Ver Perfil
Re: Extraño problemas con vector
« Respuesta #4 en: 14 Abril 2014, 11:19 am »

El problema de los corchetes es que si el índice no existe, el contenedor puede añadirlo automáticamente al hacer la consulta ( en los mapas al menos es así ).
Bueno los maps es otra liga, en el vector no pasa eso.

Pero tampoco controla el indice que le metes, lo cual puede ser bueno si quieres máxima eficiciencia pero por otro lado...

Después de este error, he perdido mi confianza en los [] ;D

Una opción es usar, como has comentado, el método "at", que es de solo lectura. El problema es que te obliga a controlar las excepciones y en algunos entornos está mal visto.
No sé porque la gente odia tanto las excepciones de verdad, es una magnifica forma de depurar.

Pones throw "mensaje" en potenciales errores (archivo no encontrado, entrada invalida...) y envuelves las llamadas a las funciones con un try/catch. Si cualquiera de esas funciones tienen algún error, lo sabras enseguida, sin tener que comprobar funcion por función.

El segundo método es lanzar un find para saber si posee ese índice ( en el caso de los vectores se puede hacer con size acordándose de controlar números negativos ) y, si el índice existe entonces recuperar el valor asociado.
A ver si te sigo... ¿Algo así?
Código
  1. map<int,int> Ejemplo;
  2. //...
  3.  
  4. auto it = Ejemplo.find(4);
  5.  
  6. if (it != Ejemplo.end()) cout<<it->second<<endl;
  7. else cout<<"No encontrado"<<endl;

No esta mal ^^
En línea

Por favor, no me manden MP con dudas. Usen el foro, gracias.

¡Visita mi programa estrella!

Rar File Missing: Esteganografía en un Rar
eferion


Desconectado Desconectado

Mensajes: 1.248


Ver Perfil
Re: Extraño problemas con vector
« Respuesta #5 en: 14 Abril 2014, 11:52 am »

Bueno los maps es otra liga, en el vector no pasa eso.

Pero tampoco controla el indice que le metes, lo cual puede ser bueno si quieres máxima eficiciencia pero por otro lado...

Cierto, yo a veces hecho de menos contenedores un poco más "inteligentes" en este aspecto integrados en la stl. A veces es necesario reinventar la rueda.

Después de este error, he perdido mi confianza en los [] ;D

Jajajaja. No hace falta ser tan derrotista... el operador [] está muy bien... siempre y cuando no ser pierda de vista las implicaciones que tiene ( lo cual suele ser complicado ) XD

No sé porque la gente odia tanto las excepciones de verdad, es una magnifica forma de depurar.

Pones throw "mensaje" en potenciales errores (archivo no encontrado, entrada invalida...) y envuelves las llamadas a las funciones con un try/catch. Si cualquiera de esas funciones tienen algún error, lo sabras enseguida, sin tener que comprobar funcion por función.

Totalmente de acuerdo, pero también es cierto que es sencillo sentirse tentado a "abusar" del sistema y tirar siempre por el camino de las excepciones aún cuando no vienen a cuento.

Para mí una excepción debe lanzarse cuando la función no es capaz por sí misma de recuperar el error ( la conexión con la base de datos se ha cerrado, no se puede abrir un fichero, no hay privilegios para ejecutar una orden... ). Pero hay otras muchas cosas que no es necesario airear o que, directamente, es mejor diseñarlas de otra forma.

Además, no hay que olvidar que con un buen mecanismo de excepciones se puede extraer muchísima información útil. Pero como todo, es muy importante saber cuándo utilizarlas.

A ver si te sigo... ¿Algo así?
Código
  1. map<int,int> Ejemplo;
  2. //...
  3.  
  4. auto it = Ejemplo.find(4);
  5.  
  6. if (it != Ejemplo.end()) cout<<it->second<<endl;
  7. else cout<<"No encontrado"<<endl;

No esta mal ^^

Es un ejemplo muy gráfico e ilustrativo. Si bien tienes que añadir algo más de código y éste resulta algo más feo tiene algunas ventajas que, dependiendo del entorno, pueden ser bastante importantes:

* Consume menos memoria ( si sustituyes el segundo int del mapa por un objeto, evitas crear una instancia del mismo de forma innecesaria )... por este mismo motivo este mecanismo puede resultar incluso más rápido.

* Evitas llenar el mapa con guarrería ( a veces interesa tener en el mapa únicamente elementos con valor real ).

* Puedes incluir el código en un método "const".

* Puedes realizar acciones alternativas para el caso de que el índice no se encuentre sin añadir código adicional ( ya tienes que poner un if para comprobar el iterador )
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Vector POO (Problemas)
Programación C/C++
NecBalaam 2 3,127 Último mensaje 22 Agosto 2011, 02:49 am
por NecBalaam
vector < vector<int> > ?
Programación C/C++
bemone 3 2,504 Último mensaje 24 Agosto 2012, 05:50 am
por BlackZeroX
Vector i*8+j
Programación C/C++
JohnMcb 1 1,591 Último mensaje 3 Mayo 2013, 17:56 pm
por rir3760
[C++] Uso de <vector> « 1 2 »
Programación C/C++
MeCraniDOS 12 5,726 Último mensaje 26 Junio 2013, 11:09 am
por MeCraniDOS
vector como parametro, problemas
Java
Beginner Web 2 1,955 Último mensaje 20 Agosto 2019, 16:56 pm
por EdePC
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines