Ver la versión completa : [Ayuda] Inicializar vector dentro de estructura en C++
Buenas.
Estoy liado con una cosilla de C++ que me tiene sin avanzar. Tengo definido un vector de estructuras tal que:
typedef struct
{
std::vector<float> coord;
int n_cluster;
} Punto;
std::vector<Punto> puntostotal;
Y quiero que el vector coord esté definido de inicio por 3 posiciones que valgan 0. Supongo que será algo muy evidente, pero si uso el clásico:
std::vector<float> coord (3, 0);
Me dice que dentro de una estructura no se puede hacer... a ver si podéis echarme una mano, porque es una tontería y no me deja avanzar...
Gracias! Y un saludo!
Posibles soluciones:
usar las boost::assign http://www.boost.org/doc/libs/1_51_0/libs/assign/doc/index.html
Crea una clase que herede de std::vector<float> y le añades un constructor con dos enteros el primero para el numero de posiciones, y el segundo para el valor.
PD: ¿necesitas coordenadas de N dimensiones?
std::vector<float> coord (3.0f, 0.0f);
La solución ahora mismo no caigo, pero pon los float como float :p
Ups, es verdad se me paso:
http://www.sgi.com/tech/stl/Vector.html
Puedes hacer:
std::vector<float> coord(3, 0.0f); // primero va el numero de elementos y despues el valor
Si quieres que tengan este valor por defecto:
struct punto
{
std::vector<float> coord;
int n_cluster;
punto() : coord(3, 0.0f), n_cluster(0)
{
}
};
Gracias! Solucionado :) Ahora tengo una violación del segmento nada más entrar a un for, mi no entender xD
seguramente solo hayas inicializado el elemento 3 a 0 y el resto esten vacios...
Hola:
Mejor que un vector, que en una estructura debes tener definido en diseño para evitar problemas, usa un objeto, ese objeto lo puedes definir luego como quieras, pues en la estructura solo tienes el puntero al objeto. si no quieres muchas complicaciones, una colección no es mala idea nunca, no es tan eficiente como un array, pero te ahorras muchos problemas.
Saludos
No puedes inicializar estructuras dinámicas en un campo, tienes que usar el constructor para eso.
struct Punto
{
Punto(): coord(3,0) {}
std::vector coord;
int n_cluster;
};
std::vector<Punto> puntostotal;
Gracias! Solucionado :) Ahora tengo una violación del segmento nada más entrar a un for, mi no entender xD
Diria que estas leyendo mas de la cuenta, pero si dices que pasa al principio del for (se supone que seria el primer elemento)
No me había vuelto a pasar por este tema porque ando bastante pillado de tiempo... pero gracias a todos :) este tema ya lo solucioné, pero ahora tengo una pequeña duda con la herencia , que me da violación de segmento. Creo que una vez solucionado esto, tendré el proyecto avanzadísimo :D. Os pego el main que es donde creo que está el problema.
int main ()
{
int puntostotal, k=3;
std::stringstream ss;
ss << "nube_7.pcd";
//Seccionar* s = new Seccionar ();
AnalisisImagen* a = new AnalisisImagen ();
a->Seccionar::seccionar_nube(ss);
Cluster* cl = new Cluster ();
puntostotal=cl->Color::color();
cl->Cluster::cluster_kmeans(puntostotal, k);
cl->Cluster::gauss(puntostotal, k);
cl->Cluster::nuevas_nubes(puntostotal, k);
a->AnalisisImagen::extraer_pixel();
a->AnalisisImagen::analisis_imagen(puntostotal, k);
a->Cluster::cluster_kmeans(puntostotal, k);
a->Cluster::gauss(puntostotal, k);
return (0);
}
El problema me lo da en a->Cluster::cluster_kmeans(puntostotal, k); así que supongo que será algún problema con herencia ya que uso la misma función antes. ¿Alguna idea?
Gracias :)
puntostotal no esta inicializado, ups si... ¿Seguro que puntos total se inicializa con cl->Color::color()?
Si te da violacion de segmento lo mas normal es que estes machacando memoria. Mira que valores tienen las variables antes de llamar a cluster_kmeans
He hecho algunos cambios que creo que tienen más lógica.
La idea es la siguiente: "Color" extrae los parámetros de color de una fuente de datos, mientras que AnalisisImagen::analisis_imagen(puntostotal, k) lo hace desde otra. En ambos casos lo guardo en un vector de estructura con exactamente los mismos nombres, solo cambia el tamaño del vector ya que es dinámico. Para eso sirve la variable puntostotal y una nueva que he introducido nueva. El problema ahora me viene al compilar me da 44 errores, todos derivados de lo mismo, de la declaración ambigua de la variable donde almaceno el color. ¿De ahí deduzco que no se puede hacer o que lo hago mal?
El nuevo main es:
int main ()
{
int puntostotal, k=3, cont_pixel;
std::stringstream ss;
ss << "nube_7.pcd";
AnalisisImagen* a = new AnalisisImagen ();
a->Seccionar::seccionar_nube(ss);
Cluster* cl = new Cluster ();
puntostotal=cl->Color::color();
cl->Cluster::cluster_kmeans(puntostotal, k);
cl->Cluster::gauss(puntostotal, k);
cl->Cluster::nuevas_nubes(puntostotal, k);
cont_pixel=cl->AnalisisImagen::extraer_pixel();
cl->AnalisisImagen::analisis_imagen();
cl->Cluster::cluster_kmeans(cont_pixel, k);
cl->Cluster::gauss(cont_pixel, k);
return (0);
}
como no pongas los mensajes de error...
De todas formas no tiene sentido que el metodo color devuelva el numero de puntos. No mezcles churras con merinas.
A nivel de programación me quedan aún cosas por mejorar. Eso, por ejemplo, lo puedo devolver por otro sitio (tengo en mente donde hacerlo) pero de momento lo dejo así. El mensaje de error es el siguiente:
la referencia a 'puntos' es ambigua
Esto me lo da en cada línea que uso el vector 'puntos' dentro de la función cluster_kmeans. Ese vector es el que tengo declarado con el mismo nombre tanto en color como en analisis_imagen.
Eso significa que hay mas de un metodo/ funcion disponible que recibe esos parametros... El linker no sabe a q funciom llamar exactamente. Suele ocurrir porquehhas creado dos funciones con el mismo nombre, lps mismos parametros y tipo de valor devuelto disinto, y eso es un error grave, porque las funciones se distinguen por nombre y parametros(cantidad, tipo, orden) pero nunca por el tipo de dato devuelto
Cambia el nombre de la funcion, o la cantidad deparametros devueltos, un int al final al que siempre pasas cero vale perfectamente
-----Actualizado-----
Vaya, puntos es un vector, seguro que es la unica variable de ese nombre? Estas pasando los parametros correctamente?
Powered by vBulletin® Version 4.2.5 Copyright © 2025 vBulletin Solutions Inc. All rights reserved.