Problema con vectores en una función

Iniciado por Orubatosu, 24 Noviembre 2014, 11:00 AM

0 Miembros y 1 Visitante están viendo este tema.

Orubatosu

Probablemente esto sea una tontería, y obviamente algo estoy haciendo mal, pero a ver si podéis iluminarme.


#include <iostream>
#include <vector>
using namespace std;

void Poner_Datos(vector< vector<int> >& v, int Fila[], int row, int cantidad){
   vector<int> Parcial;
   for (int i=0; i<cantidad; i++){
       Parcial.push_back(Fila[i]);
   }
   v[row] = Parcial;
}

int main(){
   vector <vector<int> > Entrada;
   int Fila0[4] = {0, 1, 2, 3};
   int Fila1[2] = {4, 5};
   int Fila2[3] = {6, 7, 8};
   int Fila3[6] = {9, 10, 11, 12, 13, 14};
   Poner_Datos(Entrada, Fila0, 0, 4);
   //Poner_Datos(Entrada, Fila1, 1, 2);

}


Obviamente esto está incompleto, pero lo que quiero hacer, es definir unos arrays (Fila0, Fila1, etc...) cada uno con un tamaño arbitrario.

Y, meter estos datos en las diferentes filas de un vector de 2 dimensiones.

El problema que encuentro, por muchas vueltas que le de, es que aparentemente no puedo utilizar una variable para indicar en la función la fila en la que se deben de introducir los elementos en el vector. El programa compila si, pero "peta" lamentablemente al ejecutarse.

Que algo estoy haciendo mal es obvio, mi problema es que no se exactamente donde estoy metiendo la pata.

He intentado también meter directamente los datos de otro modo, algo como:


v[row].push_back(Fila[i]);


Ni que decir que aunque el compilador traga, el programa también deja de funcionar.

Obviamente tengo otra opción, que es crear unos ficheros con los datos y meterlos "a piñon", eso lo he hecho en alguna ocasión y funciona, pero claro, lo que quiero saber es porque no me funciona.



"When People called me freak, i close my eyes and laughed, because they are blinded to happiness"
Hideto Matsumoto 1964-1998

rir3760

Tu programa revienta porque cuando se crea un vector mediante el constructor por defecto este inicia vació, no hay elementos y no puedes acceder a ellos mediante el operador "[]". La forma mas fácil para que no reviente (sin solucionar el problema) es cambiando la declaración del vector en main a:
Código (cpp) [Seleccionar]
vector <vector<int> > Entrada(4);

Y para que la función realice la operación correctamente debes verificar en ella el numero de elementos del vector (función miembro size) y la posición donde se desea agregar la fila, si esta ultima es mayor debes incrementar el tamaño del vector mediante la función miembro std::vector::resize.

Un saludo
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language

Orubatosu

#2
El problema lo tengo también en que no tengo claro como declarar que el vector tiene "x" filas y "x columnas", y para empeorar la referencia oficial no me aclara mucho al respecto.

Si, se que el vector se crea vacio, por eso uso precisamente push_back, que supuestamente aumenta el tamaño del vector para acomodar nuevos datos de forma automática

Por ejemplo:


vector<string> Concatena (const vector<string>& A, const vector<string>& B){
   vector<string> Salida;
   Salida = A;
   int tam = B.size();
   for (int i=0; i<tam; i++){
       Salida.push_back(B[i]);
   }
   return Salida;
}


El vector Salida lo creo vacío, lo lleno con el contenido del vector A, y luego añado una por una las posiciones del vector B, sin cambiar su tamaño. Teóricamente push_back incluye nuevos datos al final del vector y cambia su tamaño.

Y si, en vectores de una dimensión funciona sin problemas, pero nada, algo se me escapa, probablemente en la notación al pasar a 2 dimensiones.

Entiendo, que :

vector <vector<int> > Entrada(4);

Debería teóricamente de crearme un vector de vectores enteros, inicializando un valor inicial de 4 filas. ¿Es así?... porque incluso intentando entonces introducir datos de las columnas, por ejemplo así


   vector <vector<double> > Datos(4);
   Datos[0].push_back(0.1);
   Datos[0].push_back(0.2);
   Datos[0].push_back(0.3);
   Datos[0].push_back(0.4);
   Datos[1].push_back(2.2);
   Datos[1].push_back(1.1);
   Datos[1].push_back(0.0);
   Datos[3].push_back(-15.0);
   Datos[3].push_back(-14.0);
   Datos[3].push_back(-13.0);


También "casca", a no ser claro está, que el 4 sea el valor de las columnas (lo cual explicaría porque casca), pero entonces me quedo sin tener claro como declaro las filas.

Esta es la parte que mas me está costando del tema de vectores, el resto lo llevo bastante "sueltito" y progreso sin problemas, pero esa cuestión de vectores en 2D me lleva por la calle de la amargura

PDD. Una solución que me han sugerido... habilitar el standar C++11 en el compilador


int main(){
vector< vector<int> > v ( 3, vector<int> (3) );
v = {
{1,2,3},
{4,5,6},
{7,8,9}
};

cout << v[0].size() << endl;
cout << v[1].size() << endl;
cout << v[2].size() << endl;
}


Y... de momento no explota y parece que funciona.

Actualización

Parece que si... pero no.

Aparentemente mi problema real, es que a la hora de pasar a una función por referencia el vector, no lo hago correctamente, y en el mismo momento en que intente, no ya modificar algo del mismo, sino incluso leer sus propiedades el programa "casca"

Os pongo al corriente...


#include <iostream>
#include <vector>
using namespace std;


vector<int> aplana(const vector< vector<int> >& v , int filas){
      vector<int> Salida;
      for (int i=0; i<filas; i++){
       cout << v[i].size();
      }
}


int main(){
   vector< vector<int> > v ( 3, vector<int> (4) );
   v = {
   {1,2,3},
   {4,5},
   {6,7,8,9}
   };
   int filas = v.size();
   cout << filas << endl;
   //aplana(v, 3);
   for (int i=0; i<filas; i++){
       cout << v[i].size() << endl;
      }
}


Como podéis ver, el constructor es "diferente", pero funciona, al menos en C++11 funciona.

Mi duda es si estoy pasando el vector a la función correctamente

const vector< vector<int> >& v

Algo estoy obviamente haciendo mal ahi, porque si paso el vector, e intento leer su longitud dentro de la función el programa se cuelga, ya sea intentando leer el número de filas, como intentando leer el número de columnas de cada una.

No obstante, si intento exactamente lo mismo dentro del "main", entonces el problema no aparece y funciona correctamente.

Tengo la impresión (no confirmada) de que cuando paso un vector por referencia a una función, en realidad estoy pasando un puntero (o algo así) y dentro de una función no se comporta como espero (bueno, eso es obvio) y aunque el programa compile, se cuelga.

Supongo que al no haber pasado bien por referencia (o eso creo) el vector, al intentar leerlo es posible que se intenten leer zonas de memoria incorrectas.

Claro, podría hacer las cosas dentro del main, donde ese problema no lo tengo, pero la intención es que la función sea capaz de "desmontar" un vector de vectores y devolverme un solo vector con los contenidos consecutivos, no un caso aislado

Nueva actualización.

Estimados compañeros de foro... quiero matar a alguien, o suicidar a alguien... o pegarle fuego a algo, pero me contendré

Tras días de darle vueltas, tras dolores de cabeza y desesperación, resulta que aparentemente, mi problema es (era) el compilador GNU.

Con el mismo código, me he instalado el compilador MinGw64, y... funciona.

No me da errores, no explota el programa y el resultado es el esperado.

A falta de que alguien con mas conocimientos que yo (lo cual no es dificil) me diga que "es posible, pero estabas haciendo tal o tal cosa mal", la verdad es que me he quedado bastante "a cuadros" al ver que aparentemente la fuente de mis problemas era esa.

De momento voy a mantener este compilador como "por defecto" y continuaré haciendo experimentos, pero ahora parece que las cosas empiezan a tener sentido.

"When People called me freak, i close my eyes and laughed, because they are blinded to happiness"
Hideto Matsumoto 1964-1998