Anuncios Google

Problema con clases y vectores.

Pues eso, haciendo un programa de movimiento de particula, decidi pasarlo todo a vectores, ya que hasta ahora la posicion y velocidad lo controlaba por variables independeintes.

Lo que pasa es que dentro de la Class, en private, al crear un vetor,me da un error, que leugo al intentar usarlo deriva a otros de sobrecarga que no logro entender.

class Particula {
    private:
 
 
	vector<float> posicio();
	vector<float> v(); 
	//float x, y, vx, vy
	float  a, g, r, phi, w;
	int px, py, A;
	bool acceleracio, gravetat, movimentcircular, movimentharmonic;
    public:
 
	Particula();
 
	void entrada();
 
	void moviment();
 
	void imprimir();
 
	bool activat( int i );
 
	float velocitat( int i );
};

Este es el codigo. En si, en vez de vector posicion, tenia 2 floats con x e y. Y en vez del vector v tenia 2 floats con vx y vy.

Al compilar me da este error

particula.cc:147: error: expected identifier before numeric constant
particula.cc:147: error: expected ‘,’ or ‘...’ before numeric constant
particula.cc:148: error: expected identifier before numeric constant
particula.cc:148: error: expected ‘,’ or ‘...’ before numeric constant

Las lineas 147 y 148 corresponden a la declaracion del vector posicio y v respectivamente. Si no asigno un tamaño a los vectores al crearlos, no me da ese error, pero igualmente, mas adelante me sigue saliendo el error de sobrecarga lo ponga o no:

particula.cc:173: error: invalid types ‘<unresolved overloaded function type>[int]for array subscript
particula.cc:174: error: invalid types ‘<unresolved overloaded function type>[int]for array subscript
particula.cc:177: error: invalid types ‘<unresolved overloaded function type>[int]for array subscript
particula.cc:177: error: invalid types ‘<unresolved overloaded function type>[int]for array subscript

Que correspondria en estas lineas por ejemplo

173    posicio[0] = ( PANTALLA_AMPLADA - particula->w )/2;
174    posicio[1] = ( PANTALLA_ALTURA - particula->h )/2;
175    
176    //velcoitat
177    v[0] = v[1] = 0;

Si en vez de usar los vectores uso los float, no me da error, por lo tanto es cosa del vector, pero no logro arreglarlo. Alguna idea de porqué pasa eso?

Gracias!.


Anuncios Google

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.
Imagen de Arkanist

He intenado ir pasando el

He intenado ir pasando el código a vectores estáticos, pero tengo cierto problema que con la libreria vector no me pasaba.

El problema es queno puedo devolver un vector estático en una funcion.  He buscado información y he leido que al declarar la funciona, hay que poner :

funcion nombre (parametros)[ ] {

}

Pero aun y así me da este error 

vector.cc:20: error: ‘DistanciaVectors’ declared as function returning an array

La verdad, no se que tan malo era usar los vectores con la clase vector respecto a los estáticos, pero por los problemas que me da quizas no me valga la pena.
Imagen de joserc87

A ver si te consigo ayudar

funcion nombre (parametros)[ ] {

}

Eso es C? No lo había visto nunca.

No puedes devolver un vector estático (aunque sí dinámico), porque daría error. Lo que tienes que hacer es pasar como parámetro el vector. Por ejemplo, si es una función que inicializa el vector a 0:

void inicializa (int vector []){
  vector [0] = 0;
  vector [1] = 0;
// no tienes que hacer return de nada
}
 
int main (){
  int vector [2];
  inicializa (vector);
  // vector [0] == vector [1] == 0;
}

No es que esté mal utilizar la clase vector, pero si los vectores son siempre de 2 elementos, es matar moscas a cañonazos.

De hecho, mejor todavía. Si solo quieres el vector para almacenar coordenadas (x,y) créate un struct:

struct Pos{
  int x;
  int y;
};

Ya que un struct si se puede devolver, pasar como parámetro etc. De esta forma puedes hacer cosas como:

Pos sumar (Pos a, Pos b){
  Pos suma;
  suma.x = a.x + b.x;
  suma.y = a.y + b.y;
  return (suma);
}

Es una solución mucho más elegante incluso que la de los vectores estáticos. Y si quieres la mejor solución, indiscutiblemente, si te manejas con las clases, créate una clase Pos, que además de tener los miembros x e y, tengan funciones para calcular el módulo, el ángulo, para rotar la coordenada, y todo lo que se te ocurra.


Be pointer my friend...

Dennis Ritchie. Padre de C y cocreador de UNIX.

R.I.P.

 

Imagen de Arkanist

Perfecto! Creo que esta es la

Perfecto! Creo que esta es la mejor solución. Y más que una estructura de "Posicion" Haré ya una estructura propia para manejar yo mismo los vectores en si, para usar la misma estructura en la posición, velocidad, fuerza etc.

Si puedo hacer esto de los vectores en clases, pues mejor aun, aunque probaré con las struct y luego iré avanzando. 

Yo hice una librería en Java

Yo hice una librería en Java para Android y funciona a la perfección, pero en vez de usar vectores al inicializar la partícula le doy ángulo aleatorio y almaceno el sinus y el cosinus de dicho ángulo es una variable y así posteriormente incrementarlo en las coordenadas, si quieres te paso el código.

 

EDITO: Aquí dejo el código por si a alguien le sirve...:http://pastebin.com/hbtn9Wq1

Imagen de adriel0000

Es

Es C++?

Imagen de Arkanist

Imagen de adriel0000

jajaja

Pues aun me queda :D

Imagen de joserc87

Es un fallo tonto.

Has declarado los vectores con paréntesis, como si fuese una función:

vector<float> posicio();
vector<float> v(); 

Tendrías que declararlo como

vector<float> posicio;
vector<float> v;


Be pointer my friend...

Dennis Ritchie. Padre de C y cocreador de UNIX.

R.I.P.

 

Imagen de recoco

Eso

Eso mismo iba a decir, pues esta semana nos han explicado matrices y vectores y al menos hasta donde yo sé:

#include <vector>
 
int n_veces (vector <int> t, int e)
{
 int i, count;
 
 i = 0;
 
 count = 0;
 
 while(i<t.size())
 
    {
 
      if (t[i] == e) count++;
 
      i++;
 
     }
 
      return count;
 
 }

vector <char> inter (vector <char> a, vector <char> b)
{
 
int ia, ib;
 
vector <char> resultado;
 
ia = ib = 0;
 
while ( ia<a.size() && ib<b.size())
{
 
if (a[ia]==b[ib])
{
 
resultado.push_back(a[ia]);
 
ia++; ib++;
 
} else if (a[ia]<b[ib])
ia++
else
i++;
}
return resultado;
}


Image Hosted by ImageShack.us 

Imagen de Arkanist

Ups no esperad, el codigo

Ups no esperad, el codigo està mal, copie lo que no era. Dónde se ve entre paréntesis, va un 2, para darle tamaño 2. Con eso me da los errores. 

Imagen de joserc87

Peeeeroo

Si quieres que el vector tenga siempre longitud 2, por qué no haces simplemente:

float posicion [2];
float v [2];

Que es más sencillo y eficiente????

La clase vector se suele usar cuando no sabes el tamaño que tendrá el vector, o el tamaño va variando en el programa. En tu caso creo que no tiene sentido si siempre va a ser 2.


Be pointer my friend...

Dennis Ritchie. Padre de C y cocreador de UNIX.

R.I.P.

 

Imagen de Arkanist

Vaya, es que yo con cosas así

Vaya, es que yo con cosas así nunca he trabajado, cuando hice un cursillo, usamos bastante los vectores, y entonces pues ya lo usaba aqui xD. Voy a probar como tu dices.

Imagen de joserc87

En serio?

Me sorprende muchísimo que hayas dado funciones hasta clases y no hayas dado los vectores estáticos, cuando los vectores estáticos son de lo más simple xD. Lo normal es dar los vectores estáticos mucho antes que la clase "vector" incluso.

 


Be pointer my friend...

Dennis Ritchie. Padre de C y cocreador de UNIX.

R.I.P.

 

Imagen de Arkanist

No se, fue un curso intensivo

No se, fue un curso intensivo de 5 días, de 8 a 16:00. Hicimos cosas como ejercicios de vectores, ordenacion y demás. También con matrices y demás. Los vectores estaticos estos sólo los  he visto con los char[] .

Las clases las vi yo para hacer un programa con particulas

Voy adaptando el código y mas o menos me salgo. 

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.