Identificarte

Versión Completa : que significa este error


Sponsored links
.




shadow sonic
junio 15, 2004, 10:27
hola
que significa este error y como puedo arreglar el programa para sacar ese error
gracias
este es el error
"constant expression required in function main"



#include<iostream.h>
#include<conio.h>
#include<stdio.h>
#include<stdlib.h>
#define max 3
int ventana,terminar,i,*arreglo[max];
class Cventana
{
public:
int fila;
int columna;
int alto;
int largo;
void dibuja(char t);
void arriba();
void izquierda();
void derecha();
void abajo();
void construye(int f,int c, int l, int a);
};
void Cventana::dibuja(char t)
{
int i;
gotoxy(columna,fila);
for(i=0;i<=largo;i++)
cout << t;
gotoxy(columna,fila+alto);
for(i=0;i<=largo;i++)
cout << t;
gotoxy(columna,fila+i);
for(i=0;i<= alto;i++)
{
gotoxy(columna,fila+i);
cout << t;
gotoxy(columna +largo,fila+i);
cout << t;
}}

void Cventana::arriba()
{
dibuja(' ');
fila--;
dibuja('*');
}
void Cventana::abajo()
{
dibuja(' ');
fila++;
dibuja('*');
}
void Cventana::izquierda()
{
dibuja(' ');
columna++;
dibuja('*');
}
void Cventana::derecha()
{
dibuja(' ');
columna--;
dibuja('*');
}

void Cventana::construye(int f,int c,int a,int l)
{
if(f<1 || f>35)
fila=1;
else
fila=f;
if(c<1 || c>35)
columna=1;
else
columna=c;
alto=a;
largo=l;
}
mover(Cventana *m,char movimiento);

main()
{
for(i=0;i<max;i++)
{
*arreglo[i];
}
new Cventana;
Cventana *arreglo[i] ;/*=new Cventana;*/
arreglo[i]->construye(5,5,5,10);
Cventana *p;
arreglo[i]->dibuja('*');

do{
gotoxy(20,20);
cout << "elegir ventana(1-2-3) : ";
ventana = getche();
switch(ventana)
{
case '1': p = arreglo[i]; break;
case '2': p = arreglo[i]; break;
case '3': p = arreglo[i]; break;
}
do{
if(ventana!='1' && ventana!='2' && ventana!='3')
arreglo[i]->dibuja('*');

gotoxy(20,19);cout << "(8)arriba|(4)izquierda | (6)derecha | (2)abajo";
gotoxy(20,21);cout<<"cambiar ventana letra (C)";
gotoxy(20,22);cout<<"para salir tecla escape";
terminar = getch();
if(terminar != 67)
mover(p,terminar);

}while(terminar != 27 && terminar != 67);
}while(terminar != 27); abort();
delete arreglo[i];
return 0;
}
mover(Cventana *m,char movimiento)
{
switch(movimiento)
{
case '8' : m->arriba(); break;
case '2' : m->abajo();break;
case '4' : m->derecha(); break;
case '6' : m->izquierda();break;
}return 0;
}

ZeN<CyBeRKiLLeR>
junio 16, 2004, 02:25
El error en simple, pero basicamente encontre 2 y 1 raro

Primero no se donde diablos hiciste la funcion gotoxy, asi que NPI de que hace el programa

Ahora el error de compilacion es este

"constant expression required in function main"

Lo que quiere decir que en algun lugar donde deberias haber usado una expresion constante usaste una variable.

Ahora analizando el codigo como te digo encontre 2 errores, 1 este



main()
{
for(i=0;i<max;i++)
{
*arreglo[i];
}


Ahi cerraste la funcion main!! y mas adelante escribiste



new Cventana;
Cventana *arreglo[i] ;/*=new Cventana;*/
arreglo[i]->construye(5,5,5,10);
Cventana *p;
arreglo[i]->dibuja('*');


Estas instrucciones quedaron totalmente FUERA de funcion!

Pues para mi esas instrucciones estan llevadas, no se que quiciste hacer, pero definitivamente con eso no lo logras :).

Pero ahi está prescisamente donde usaste la variable en vez de constante.


Cventana *arreglo[i] ;/*=new Cventana;*/


Ahi tu intencion era la de crear un arreglo de tamaño dinamico ya que no vas a dejar que el sistema operativo defina su tamaño, sino que tu mismo se lo daras segun la conficion de la variable i

En C++ eso no esta permitido, en los objetos arreglos se deben usar unica y exclusivamente expresiones constantes, por ejemplo

int a[5]; //Esto es mas valido que un berraco

int i=5;
int a[i];// Esto no se puede ni por el chiras.

So, soluciones, usar acceso dinamico a memoria de esta manera

int i=5;
int *a=new int[i]; //SUper valido! ahi explicitamente estas separando lo que necesitas

Pero explicitamente debes destruirlo despues usando delete[](a); para que la memoria separada por new regrese como libre al OS, mientras en el caso de int a[5]; el sistema operativo se encarga de la creacion y destruccion del objeto arreglo.

Bueno en tu caso vendria pues a ser algo como esto


Cventana *arreglo[i];


Esto es un error, me explico

Yo lo veria de esta manera, estas creando un arreglo de i punteros del tipo Cventana

If that´s the case, yo haria esto

Cventana **arreglo=new Cventana*[i];

Esto deberia hacer el trabajo, ya seria cuestion de inicializar cada uno de los punteros creados y obviamente al finaliza con el trabajo hacer un ciclo FOR que libere la memoria pedida.


Bueno no se como tu codigo se verá en el IDE, pero aca se ve espantoso, pero me atrevi a medio ayudarte con algunos tips del lenguaje porque a mi me hubieran servido esos consejos cuando estaba embalado y duraba horas y horas en encontrar la solucion a un problema similar.

Espero te sirva de algo

Bye bye bye

P.D: Me tenes aun cabezon pensando de donde salio esa tan gotoxy!

Krieg
junio 16, 2004, 04:26
Ponga ese codigo entre tags CODE para que quede identado a ver si puedo entenderlo.

Sh4dow
junio 16, 2004, 02:14
main()
{
for(i=0;i<max;i++)
{
*arreglo[i];
}

CIBERKILLER , no se de donde sacaste que ahi estaba cerrando el main, pero no es asi

Grissom.
junio 16, 2004, 03:45
Es que? ... que hace hay? declara?, asigna? eso le falta complementar.

shadow sonic
junio 16, 2004, 10:07
gracias cL-CyBeRKiLLeR y a los demas
ese gotoxy que esta en el metodo dibuja lo ocupo para dibujar el cuadrado
la finalidad del programa es que si yo deseo crear un nuevo cuadrado solo deba modificar el define y nada mas en el main
y el programa ya lo pude solucionar aqui dejo el codigo para que se entienda mejor la intencion del programa lo unico que modifico en el main es el case pero solo para darle seleccion a un nuevo cuadrado ,todos los cuadrados comienzan en la misma posicion pero al moverlos quedan en la ultima posicion que visitaron
ojala se entienda


#include<iostream.h>
#include<conio.h>
#include<stdio.h>
#include<stdlib.h>
#define max 3
int ventana,terminar,i;
class Cventana
{
public:
int fila;
int columna;
int alto;
int largo;
void dibuja(char t);
void arriba();
void izquierda();
void derecha();
void abajo();
void construye(int f,int c, int l, int a);
};
void Cventana::dibuja(char t)
{
int i;
gotoxy(columna,fila);
for(i=0;i<=largo;i++)
cout << t;
gotoxy(columna,fila+alto);
for(i=0;i<=largo;i++)
cout << t;
gotoxy(columna,fila+i);
for(i=0;i<= alto;i++)
{
gotoxy(columna,fila+i);
cout << t;
gotoxy(columna +largo,fila+i);
cout << t;
}}

void Cventana::arriba()
{
dibuja(' ');
fila--;
dibuja('*');
}
void Cventana::abajo()
{
dibuja(' ');
fila++;
dibuja('*');
}
void Cventana::izquierda()
{
dibuja(' ');
columna++;
dibuja('*');
}
void Cventana::derecha()
{
dibuja(' ');
columna--;
dibuja('*');
}

void Cventana::construye(int f,int c,int a,int l)
{
if(f<1 || f>35)
fila=1;
else
fila=f;
if(c<1 || c>35)
columna=1;
else
columna=c;
alto=a;
largo=l;
}
mover(Cventana *m,char movimiento);
redibuja(Cventana *q);
main()
{
Cventana *p,*q;
Cventana *arreglo = new Cventana;

for( i=1; i<=max;i++)
{
arreglo[i].construye(5,5,5,10);
arreglo[i].dibuja('*');
}
do{
gotoxy(20,20);
cout << "elegir ventana(1-2-3) : ";
ventana = getche();
switch(ventana)
{
case '1': p = &arreglo[1]; break;
case '2': p = &arreglo[2]; break;
case '3': p = &arreglo[3]; break;
}
do{
gotoxy(20,19);cout << "(8)arriba|(4)izquierda | (6)derecha | (2)abajo";
gotoxy(20,21);cout<<"cambiar ventana letra (C)";
gotoxy(20,22);cout<<"para salir tecla escape";
terminar = getch();
if(terminar != 67)
mover(p,terminar);

for(i=1;i<=max;i++)
{
q=&arreglo[i];
redibuja(q);
}
}while(terminar != 27 && terminar != 67);
}while(terminar != 27); abort();

delete []arreglo;
return 0;
}
redibuja(Cventana *q)
{
q->dibuja('*');
return 0;
}

mover(Cventana *m,char movimiento)
{
switch(movimiento)
{
case '8' : m->arriba(); break;
case '2' : m->abajo();break;
case '4' : m->derecha(); break;
case '6' : m->izquierda();break;
}return 0;
}