C++: Image[i], Image(i)...??

KeRNeL

En un proyecto de la uni de reserva de entradas, tenemos 64 asientos y un string de 64 caracteres. Lo que queremos es que si el asiento 3 esta ocupado, la imagen 3 aparezca:

Image3->Visible = true;

Lo que pasa es que tenemos que hacer eso con los 64 asientos y estabamos buscando una manera de ponerlo mas corto, algo tipo:

Image->Visible = true;

Para asi no usar un Switch/Case con los 64 casos..

LOc0

Un array de tipo entero con 64 elementos. Cuando la silla esté ocupada que valga 1 y 0 en caso contrario.

Después con un bucle recorres las imágenes e igualas el valor visible a 0 ó 1 (si necesitas true/false mete un if/else o usas un array de tipo bool)

Ejemplo:

n=0;
while(n<64)
imagen[n++]->visible=ocupado[n];

ó

n=0;
while(n<64)
{

if(ocupado[n])
imagen[n++]->visible=true;
else
imagen[n++]->visible=false;

}

Salu2 ;)

KeRNeL

no si el problema no era ese, eso ya esta hecho, pero gracias por currartelo asi.

lo que pasa es que cuando ya sabemos si hay que poner la imagen visible a true o false, y tenemos la posicion, si queremos poner que se vea la imagen de la posicion n=20 no sabemos como ponerlo, porque la sentencia

imagen[n]->visible=true;

da error. hemos probado con:

image(n)...
image[n]...
image+n...

y nada de nada jajaj

gracias de antemano ;)

maRc

Imagen[n].visible = true;

KeRNeL

que va maRc asi no va tampoco. :(

cabron

¿Qué error te da?

¿En qué sentencia te da el error?

¿Cómo tienes declarado el vector?

PeLoTaSo

Edito después de leer todo bien:

si utilizas imagen->visible=true, estás dando a entender que imagen es un objeto. Para empezar visible debe ser una variable declarada en la parte pública de la clase y de tipo booleano. Segundo, para crear un vector de objetos, y suponiendo que el número de objetos sea estático (sino haría falta doble puntero) tendrás que crear algo así: nombreclase *imagen[Knum], luego crear los objetos, y luego ya llamar a imagen->visible. Aunque lo lógico es crearte una función como por ejemplo, isVisible y poner la variable en el private pero eso ya es secundario.

guner

Con una simple estructura / casilla:

struct Imagen {
bool Visible;
// Otras propiedades
};

Imagen imagenes[64];

imagenes[33].Visible = true;
imagenes[33].Visible = false;

std::cout << imagenes[33].Visible << std::endl; // Sale 1
std::cout << imagenes[12].Visible << std::endl; // Sale 0

KeRNeL

Tengo una clase llamada evento, que tiene una funcion que devuelve "0" (libre) o "1" (ocupado) cuando le pasas como parametro la posicion del asiento, (1..64).

string ocup;
evento ev; //objeto de la clase evento


for (int i=0;i<64;i++)
{
ocup = ev.getAsientosBinario(i); //devuelve "0" o "1"
if (ocup == "0")
{
FAsientos-> Image ->Visible=false;
FAsientos->Shape->Enabled = false;
}
else
{
FAsientos->Image->Visible = false;
FAsientos-> Shape->Enabled = false;
}
}


El problema que da es que las sentencias

FAsientos-> Image ->Visible=false;

dan error. lo que quiero conseguir es que la maquina entienda eso como si fuera por ejemplo:

  FAsientos-> Image23 ->Visible=false;

si no se entiende algo bien, preguntar. gracias por la ayuda!

guner

Pero nos tienes que decir qué son FAsientos Image23, si son objetos, o punteros a estrucuturas, o que se yo.

Ponnos las definiciones.

PeLoTaSo

Exacto, has puesto lo que menos interesa.

#8 Yo he entendido que utiliza C++ y que quiere hacerlo en C++ puro, por lo que las estructuras sobran. Para hacerlo con estructuras lo mejor es crearse un array booleano y tirando.

Lo que has puesto ahí, y para que todo funcione bien. Fasientos tiene que ser un objeto cuya clase tenga dentro declarado un vector de objetos cuya clase tenga una variable de tipo booleano.

KeRNeL

FAsientos es el Form en el que hay una imagen de un teatro visto desde arriba, con 64 de asientos sin ocupar:

http://jotapeges.greenshines.com/show.php?img=126994_teatroarribaCHANGEORD.jpg.html

Luego he puesto encima de cada asiento un Shape, con forma de circulo, y que cuando haces click en el aparece encima de ese asiento una Imagen de Ocupado (la X roja):

http://jotapeges.greenshines.com/show.php?img=126997_ocupados.JPG.html

Pues bien, el asiento 23 por ejemplo, tiene encima del circulo que lo representa en la imagen de fondo del teatro un Shape23 y un Image23, lo que quiero es que suponiendo que el asiento 23 esta reservado, el Shape23 no este disponible para clickearlo (Enabled = false) y la Image23 no se vea (Visible = false)

Pero eso solo suponiendo que es el asiento 23 el unico que esta ocupado. Pero si cuando se activa ese Form que tiene todos los asientos, hago un for de 1 a 64 y con una funcion me va diciendo si el asiento 1, 2, 3.. estan ocupados y en los ocupados hago lo que hemos hecho antes al asiento 23 para que no se pueda volver a reservar, surge el problema de que no puedo poner:

for (i=0; i<64; i++)
{
...
//si el asiento esta ocupado:
Image->Visible = true;
Shape->Enabled = false;
}



No se si se entendera..

LOc0

¿A qué esperas para poner una captura del error del compilador?

Por cierto, ¿estás usando Visual C++ ó C++ "a pelo"?

Salu2 ;)

KeRNeL

Utilizo Borland C++ Builder 5

Ahi va la imagen del error:
http://jotapeges.greenshines.com/show.php?img=127023_error.JPG.html

Gracias!!

PeLoTaSo

¿Es mi imaginación o entre Image y -> hay un espacio?. ¿O es así?.

La verdad es que sin ver el código entero es muy difícil saber cual es el problema.

KeRNeL

Da lo mismo que haya espacio, funciona igual.

PeLoTaSo

La verdad es que el Borland no lo he llegado a utilizar pero el C++ es igual en todos los entornos. Intenta hacerlo con una imagen sóla a ver si es problema del vector o es problema de que no lo has definido.

KeRNeL

es solo eso, en resumen es como tener 10 imagenes que cuando empieza el programa no se ven (visible = false)

Image1
Image2
...
Image10

lo que quiero es hacer un for que coja de 1 a 10 y ponga todas las imagenes visible = true;

El problema es que yo lo hago asi:

for (i=0; i<10; i++)
Image -> visible = false;


Y resulta que no es lo mismo poner Image[1] que Image1.
Image[1] -> Visible = false; NO FUNCIONA
Image1 -> Visible = false; SI FUNCIONA


Lo que necesito es la manera de poner Imagei

maRc

Pega todo (todo) el código aquí: http://pastebin.com/ , y pon el enlace.

KeRNeL

el problema se reduce a lo que e posteado antes (#18), como seria la sintaxis correcta para hacer un for asi.

de todos modos, gracias a todos los que habeis respondido, no esperaba tanta gente

gF

Lo que quieres hacer para acceder directamente a la imagen "i" no es posible según creo, ya que cada una de las 64 imagenes es un objeto independiente del formulario y para referirte a él tienes que usar su nombre completo, haz tu una función que a partir de una imagen "i", ponga su campo visible a falso, para ello como has dicho antes necesitas un switch con 64 cases.

gF

Una alternativa que se me ocurre que quizá funcionaría sería la siguiente:

Declaras:

bool *Image[64]

e inicializas de la siguiente manera:

Image[0] = &Fasientos->Image1->Visible;
Image[1] = &Fasientos->Image2->Visible;
...
Image[63] = &Fasientos->Image64->Visible;

ahora tienes en un array las direcciones de los campos Visible de cada imagen y para cambiarlos:

*Image = true o false;

Esto realmente no se si funcionaria...

KeRNeL

si lo hago como tu dices:

bool * Image[64];
Image[1] = &FAsientos->Image1->Visible;

me da un Error por el "&":
Must take address of a memory location.

Voy a probar poniendo:

bool Image[64];
Image[1] = FAsientos->Image1->Visible;

Gracias.

gF

No no, eso no te molestes en probarlo pq asi lo unico que haces es darle valores booleanos al array pero lo que interesaría es que el array contuviera las direcciones de los campos "visible" de cada imagen.

LOc0

Y resulta que no es lo mismo poner Image[1] que Image1.
Image[1] -> Visible = false; NO FUNCIONA
Image1 -> Visible = false; SI FUNCIONA


Lo que necesito es la manera de poner Imagei

¿Por qué no declaras un array de imágenes en vez de 64 imágenes sueltas?

salu2 ;)

gF

#25 Eso no tiene sentido... cuando añades una imagen como objeto del formulario, cada una tiene su identificador, que por defecto son image1, image2... y si colocas 64 imagenes pues son eso 64 imagenes, no hay forma de hacer eso que dices.

PeLoTaSo

A ver nunca he usado el borland, pero si es como el visual puedes crear un vector de objetos del tipo que sea. Igual lo que tú has hecho es crear 64 objetos llamados: Image1, Image2, Image3... En este caso lo tienes jodido. Búscate algún manual de borland a ver como se crea un array de objetos y como se maneja.

maRc

Bueno, parece que ya entiendo lo que quieres hacer.

Si declaras las imágenes cada una por su lado, por ejemplo:
Imagen_t Imagen1;
Imagen_t Imagen2;
Imagen_t Imagen3;
...
Imagen_t Imagen64;

No te queda más remedio que usar if/else, o switch, para cambiar acceder a ellas mediante un entero.
Ejemplo:
if (Cual == 1)
Imagen1.loquesea;
else if (Cual == 2)
Imagen2.loquesea;

En cambio, si lo tienes así:
Imagen_t Imagen[64];
Si que vas a poder acceder a cada una usando un índice, tipo:
Imagen[Cual].loquesea;

Y no le des más vueltas :P.

PD: Como parece que lo tienes de la primera forma, ya tardas en hacerlo de la segunda (bastante más sencillo y fácil de entender).

SeiYa

Joder, estaba leyendo el hilo y digo ... ¿no será que ha declarado 64 imágenes de la manera image1 ... image64 y quiere ir a cada una con image? pero pensé, supongo que no será tan obvio el fallo, pero no xD

¿Seguro que no se puede declarar un array de imágenes? si puedes declarar arrays hasta de sillas hombre!

Usuarios habituales

  • maRc
  • PeLoTaSo
  • gF
  • LOc0
  • KeRNeL
  • guner
  • cabron