PDA

Ver la versión completa : [Ayuda] Inicializar vector dentro de estructura en C++



Endher
06/09/2012, 01:55
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!

swapd0
06/09/2012, 02:08
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?

pakoito
06/09/2012, 02:21
std::vector<float> coord (3.0f, 0.0f);


La solución ahora mismo no caigo, pero pon los float como float :p

swapd0
06/09/2012, 02:25
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)
{
}
};

Endher
06/09/2012, 02:36
Gracias! Solucionado :) Ahora tengo una violación del segmento nada más entrar a un for, mi no entender xD

Jurk
06/09/2012, 13:06
seguramente solo hayas inicializado el elemento 3 a 0 y el resto esten vacios...

javu61
06/09/2012, 14:16
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

hardyx
06/09/2012, 16:08
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;

swapd0
06/09/2012, 20:24
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)

Endher
15/09/2012, 14:12
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 :)

swapd0
15/09/2012, 15:37
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

Endher
15/09/2012, 16:48
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);
}

swapd0
15/09/2012, 18:36
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.

Endher
16/09/2012, 01:21
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.

Jurk
16/09/2012, 13:30
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?