Cuando trato de ejecutar el siguiente programa en c++ me sale el error:
el programa dejó de funcionar correctamente por un problema. Windows cerrará el programa y le notificará si existe una solución.
el compilador no me da ningún problema el código es el siguiente:
#include <stdio.h>
#include <stdlib.h>
#include <allegro.h>
#include <iostream>
int iniciar();
void realizar_juego();
void terminar();
int iniciar(){
allegro_init();
install_keyboard();
set_color_depth(16);
if (set_gfx_mode(GFX_AUTODETECT,640,480,0,0)<0){
printf("error al iniciar el modo grafico\n");
allegro_exit();
exit(-1);
}
}
void terminar(){
allegro_exit();
}
int main(){
iniciar();
realizar_juego();
terminar();
}
END_OF_MAIN()
void realizar_juego(){
BITMAP *nave;
PALETTE paleta;
int x,y, x_anterior, y_anterior;
BITMAP * buffer;
nave=load_bitmap("C:/Users/DANIEL/Desktop/Programación/C++/Allegro/Naves/recursos/nave.pcx", paleta);
set_palette(paleta);
if (nave==NULL) terminar();
buffer=create_bitmap(nave->w,nave->h);
clear (buffer);
if (buffer==NULL) terminar();
x=SCREEN_W/2;
y=SCREEN_H/2;
while (!key[KEY_ESC]){
if (key[KEY_UP,KEY_W])
y--;
if (key[KEY_DOWN,KEY_S])
y++;
if (key[KEY_LEFT,KEY_A])
x--;
if (key[KEY_RIGHT,KEY_D])
x++;
if (x<0) x=x_anterior;
if (x>SCREEN_W-nave->w) x=x_anterior;
if (y<0) y=y_anterior;
if (y>SCREEN_H-nave->h) y=y_anterior;
if ((x_anterior!=x) || (y_anterior!=y)){
blit (buffer,screen, 0, 0, x_anterior, y_anterior,buffer->w,buffer->h);
blit (screen,buffer,x,y,0,0,buffer->w,buffer->h);
draw_sprite(screen,nave, x, y);
}
x_anterior=x;
y_anterior=y;
}
}
En primer lugar, localiza la línea que da el error. Para ello, coloca pausas o salidas por consola (con "cout", por ejemplo) en distintas zonas hasta ver dónde falla.
cout << 'a' << flush;
linea_A;
cout << 'b' << flush;
linea_B;
cout << 'c' << flush;
linea_C;
Consola:
ab
En ese caso, sabríamos que probablemente el error esté en la línea B.
el programa ni siquiera ejecuta
Para empezar, cuando cierras los { } de la funcion iniciar, al final hay un } de mas (justo encima de terminar() te falta poner en END_OF_MAIN( ) el caracter ";"
Luego cuando indicas el valor de nave si estas en windows tendrias que tener \\ y no / (si se trata de trabajar con directorios en windows)
Y en la ultima linea te sobra un }
Para la proxima, pon las etiquetas Geshi(C++) y te podre indicar la linea exacta
PD: Ademas las librerias que tienes stdio y stdlib tendrian que ser cstdio y cstdlib (de esto no estoy muy seguro, pero creo que es asi)
Saludos
Cita de: Poyoncio en 11 Septiembre 2016, 21:13 PM
Luego cuando indicas el valor de nave si estas en windows tendrias que tener \\ y no / (si se trata de trabajar con directorios en windows)
Y en la ultima linea te sobra un }
Ambos sirven, tanto \ como /.
No sobra. Hay 2, uno para el while y otro para la función.
Y sí, cstdlib y cstdio.
Si dices que el programa te ha compilado bien: Por si acaso, borra el ejecutable y compila de nuevo.
Hecho eso, prueba de nuevo lo de los cout, poniéndo uno al principio, para asegurarte de que al menos comienza el programa.
Cita de: ivancea96 en 11 Septiembre 2016, 21:18 PM
Ambos sirven, tanto \ como /.
No sobra. Hay 2, uno para el while y otro para la función.
Y sí, cstdlib y cstdio.
Si dices que el programa te ha compilado bien: Por si acaso, borra el ejecutable y compila de nuevo.
Hecho eso, prueba de nuevo lo de los cout, poniéndo uno al principio, para asegurarte de que al menos comienza el programa.
Lo he vuelto a mirar y hay 3 fijate:
}
x_anterior=x;
y_anterior=y;
}
}
Me estoy mirando el code de nuevo, tienes un lio tremendo con C y C++ usas stdlib y stdio, ademas de iostream, y luego pones printf.
Podrias especificar en que lenguaje estas programando? Porque alomejor lo que tienes que hacer es quitar el iostream y arreglar los errores de syntaxis y ya estas
Cita de: Poyoncio en 11 Septiembre 2016, 21:20 PM
Lo he vuelto a mirar y hay 3 fijate:
}
x_anterior=x;
y_anterior=y;
}
}
El primero cierra el if, el segundo cierra el while y el tercero cierra la función.
Cita de: ivancea96 en 11 Septiembre 2016, 21:27 PM
El primero cierra el if, el segundo cierra el while y el tercero cierra la función.
Es verdad, no havia visto el if disculpa ;)
he hecho lo de borrar el ejecutable y nada
¿Probaste lo de los cout? De ser así, pon aquí el código que probaste.
no hice lo de los couts, pero no se a que se refieren
Tu problema es que no sabes en que codigo estas. Iostream es una libreria de C++ y stdlib y stdio de C, por tu code parece que estas en C porque pones printf .... asi que crea un archivo y ponle el code en C que te he puesto y lo guardas como fichero.c y lo compilas.
Prueba este codigo si estas en C :
#include <stdio.h>
#include <stdlib.h>
#include <allegro.h>
int iniciar();
void realizar_juego();
void terminar();
int iniciar(){
allegro_init();
install_keyboard();
set_color_depth(16);
if (set_gfx_mode(GFX_AUTODETECT,640,480,0,0)<0){
printf("error al iniciar el modo grafico\n");
allegro_exit();
exit(-1);
}
}
void terminar(){
allegro_exit();
}
int main(){
iniciar();
realizar_juego();
terminar();
}
END_OF_MAIN();
void realizar_juego(){
BITMAP *nave;
PALETTE paleta;
int x,y, x_anterior, y_anterior;
BITMAP * buffer;
nave=load_bitmap("C:/Users/DANIEL/Desktop/Programación/C++/Allegro/Naves/recursos/nave.pcx", paleta);
set_palette(paleta);
if (nave==NULL) terminar();
buffer=create_bitmap(nave->w,nave->h);
clear (buffer);
if (buffer==NULL) terminar();
x=SCREEN_W/2;
y=SCREEN_H/2;
while (!key[KEY_ESC]){
if (key[KEY_UP,KEY_W])
y--;
if (key[KEY_DOWN,KEY_S])
y++;
if (key[KEY_LEFT,KEY_A])
x--;
if (key[KEY_RIGHT,KEY_D])
x++;
if (x<0) x=x_anterior;
if (x>SCREEN_W-nave->w) x=x_anterior;
if (y<0) y=y_anterior;
if (y>SCREEN_H-nave->h) y=y_anterior;
if ((x_anterior!=x) || (y_anterior!=y)){
blit (buffer,screen, 0, 0, x_anterior, y_anterior,buffer->w,buffer->h);
blit (screen,buffer,x,y,0,0,buffer->w,buffer->h);
draw_sprite(screen,nave, x, y);
}
x_anterior=x;
y_anterior=y;
}
}
Y este otro si estas en C++
#include <cstdio.h>
#include <cstdlib.h>
#include <allegro.h>
#include <iostream>
using namespace std;
int iniciar();
void realizar_juego();
void terminar();
int iniciar(){
allegro_init();
install_keyboard();
set_color_depth(16);
if (set_gfx_mode(GFX_AUTODETECT,640,480,0,0)<0){
cout << "Error al iniciar el modo grafico" << endl;
allegro_exit();
exit(-1);
}
}
void terminar(){
allegro_exit();
}
int main(){
iniciar();
realizar_juego();
terminar();
}
END_OF_MAIN();
void realizar_juego(){
BITMAP *nave;
PALETTE paleta;
int x,y, x_anterior, y_anterior;
BITMAP * buffer;
nave=load_bitmap("C:/Users/DANIEL/Desktop/Programación/C++/Allegro/Naves/recursos/nave.pcx", paleta);
set_palette(paleta);
if (nave==NULL) terminar();
buffer=create_bitmap(nave->w,nave->h);
clear (buffer);
if (buffer==NULL) terminar();
x=SCREEN_W/2;
y=SCREEN_H/2;
while (!key[KEY_ESC]){
if (key[KEY_UP,KEY_W])
y--;
if (key[KEY_DOWN,KEY_S])
y++;
if (key[KEY_LEFT,KEY_A])
x--;
if (key[KEY_RIGHT,KEY_D])
x++;
if (x<0) x=x_anterior;
if (x>SCREEN_W-nave->w) x=x_anterior;
if (y<0) y=y_anterior;
if (y>SCREEN_H-nave->h) y=y_anterior;
if ((x_anterior!=x) || (y_anterior!=y)){
blit (buffer,screen, 0, 0, x_anterior, y_anterior,buffer->w,buffer->h);
blit (screen,buffer,x,y,0,0,buffer->w,buffer->h);
draw_sprite(screen,nave, x, y);
}
x_anterior=x;
y_anterior=y;
}
}
Cita de: sanxez1 en 11 Septiembre 2016, 21:42 PM
no hice lo de los couts, pero no se a que se refieren
Tienes que localizar qué línea da el error. Para ello hay muchos métodos, y uno es tan simple como ver hasta donde funciona bien. Por ejemplo, con el main, pondrías:
int main(){
cout << 'a' << endl;
iniciar();
cout << 'b' << endl;
realizar_juego();
cout << 'c' << endl;
terminar();
cout << 'd' << endl;
}
Al ejecutarlo, deberías ver por la consola, letras. Si sale una 'a', el error está en la función "iniciar()". Si sale "ab", el error está en "realizar_juego()", y etc.
estoy en c++ y siempre he utilizado las librerías stdio y stdlib, uso printf porque me resulta más fácil
Cita de: sanxez1 en 11 Septiembre 2016, 21:48 PM
estoy en c++ y siempre he utilizado las librerías stdio y stdlib, uso printf porque me resulta más fácil
Pues nose, si siempre has usado librerias stdio y stdlib nose como te han compilado, como te digo usa cstdio y cstdlib, y lo de printf, precisamente cout es mas facil. No hay que declarar el tipo de dato que vas a mostrar pero eso ya enfuncion de gustos.
Saludos y haznos caso, sino, no se compilara nada
Cita de: Poyoncio en 11 Septiembre 2016, 21:51 PM
Pues nose, si siempre has usado librerias stdio y stdlib nose como te han compilado, como te digo usa cstdio y cstdlib, y lo de printf, precisamente cout es mas facil. No hay que declarar el tipo de dato que vas a mostrar pero eso ya enfuncion de gustos.
Saludos y haznos caso, sino, no se compilara nada
Es recomendable utilizar las de C++, pero normalmente se pueden utilizar también las de C, stdlib.h y etc eh? No hay problema en compilar eso.
Cita de: ivancea96 en 11 Septiembre 2016, 21:56 PM
Es recomendable utilizar las de C++, pero normalmente se pueden utilizar también las de C, stdlib.h y etc eh? No hay problema en compilar eso.
A pues nose, ami me daban errores cuando comence (hace 2 meses o menos) por eso ahora aunque casi nunca las use les tengo un poco de tirria, estuve como 2 dias con el mismo error :laugh: me volvi loco
consegu hacer lo de los couts pero no me sale nngún avso
¿Puedes poner aquí el código con los couts?
#include <stdio.h>
#include <stdlib.h>
#include <allegro.h>
int iniciar();
void realizar_juego();
void terminar();
int iniciar(){
allegro_init();
install_keyboard();
set_color_depth(16);
if (set_gfx_mode(GFX_AUTODETECT,640,480,0,0)<0){
printf("error al iniciar el modo grafico\n");
allegro_exit();
exit(-1);
}
}
void terminar(){
allegro_exit();
}
int main(){
iniciar();
realizar_juego();
terminar();
}
END_OF_MAIN();
void realizar_juego(){
BITMAP *nave;
PALETTE paleta;
int x,y, x_anterior, y_anterior;
BITMAP * buffer;
nave=load_bitmap("C:/Users/DANIEL/Desktop/Programación/C++/Allegro/Naves/recursos/nave.pcx", paleta);
set_palette(paleta);
if (nave==NULL) terminar();
buffer=create_bitmap(nave->w,nave->h);
clear (buffer);
if (buffer==NULL) terminar();
x=SCREEN_W/2;
y=SCREEN_H/2;
while (!key[KEY_ESC]){
if (key[KEY_UP,KEY_W])
y--;
if (key[KEY_DOWN,KEY_S])
y++;
if (key[KEY_LEFT,KEY_A])
x--;
if (key[KEY_RIGHT,KEY_D])
x++;
if (x<0) x=x_anterior;
if (x>SCREEN_W-nave->w) x=x_anterior;
if (y<0) y=y_anterior;
if (y>SCREEN_H-nave->h) y=y_anterior;
if ((x_anterior!=x) || (y_anterior!=y)){
blit (buffer,screen, 0, 0, x_anterior, y_anterior,buffer->w,buffer->h);
blit (screen,buffer,x,y,0,0,buffer->w,buffer->h);
draw_sprite(screen,nave, x, y);
}
x_anterior=x;
y_anterior=y;
}
}
Cita de: ivancea96 en 11 Septiembre 2016, 21:47 PM
Tienes que localizar qué línea da el error. Para ello hay muchos métodos, y uno es tan simple como ver hasta donde funciona bien. Por ejemplo, con el main, pondrías:
int main(){
cout << 'a' << endl;
iniciar();
cout << 'b' << endl;
realizar_juego();
cout << 'c' << endl;
terminar();
cout << 'd' << endl;
}
Al ejecutarlo, deberías ver por la consola, letras. Si sale una 'a', el error está en la función "iniciar()". Si sale "ab", el error está en "realizar_juego()", y etc.
Cita de: ivancea96 en 12 Septiembre 2016, 21:56 PM
¿Puedes poner aquí el código con los couts?
Cita de: sanxez1 en 18 Septiembre 2016, 12:47 PM
#include <stdio.h>
#include <stdlib.h>
#include <allegro.h>
int iniciar();
void realizar_juego();
void terminar();
int iniciar(){
allegro_init();
install_keyboard();
set_color_depth(16);
if (set_gfx_mode(GFX_AUTODETECT,640,480,0,0)<0){
printf("error al iniciar el modo grafico\n");
allegro_exit();
exit(-1);
}
}
void terminar(){
allegro_exit();
}
int main(){
iniciar();
realizar_juego();
terminar();
}
END_OF_MAIN();
void realizar_juego(){
BITMAP *nave;
PALETTE paleta;
int x,y, x_anterior, y_anterior;
BITMAP * buffer;
nave=load_bitmap("C:/Users/DANIEL/Desktop/Programación/C++/Allegro/Naves/recursos/nave.pcx", paleta);
set_palette(paleta);
if (nave==NULL) terminar();
buffer=create_bitmap(nave->w,nave->h);
clear (buffer);
if (buffer==NULL) terminar();
x=SCREEN_W/2;
y=SCREEN_H/2;
while (!key[KEY_ESC]){
if (key[KEY_UP,KEY_W])
y--;
if (key[KEY_DOWN,KEY_S])
y++;
if (key[KEY_LEFT,KEY_A])
x--;
if (key[KEY_RIGHT,KEY_D])
x++;
if (x<0) x=x_anterior;
if (x>SCREEN_W-nave->w) x=x_anterior;
if (y<0) y=y_anterior;
if (y>SCREEN_H-nave->h) y=y_anterior;
if ((x_anterior!=x) || (y_anterior!=y)){
blit (buffer,screen, 0, 0, x_anterior, y_anterior,buffer->w,buffer->h);
blit (screen,buffer,x,y,0,0,buffer->w,buffer->h);
draw_sprite(screen,nave, x, y);
}
x_anterior=x;
y_anterior=y;
}
}
No tiene los couts ._.
Si lo haces, pon la librería iostream. También puedes hacerlo con printf (poniendo justo después de cada printf un
fflush(stdout);
ostias que tonto pensé que poyoncio lo había puesto,
#include <stdio.h>
#include <stdlib.h>
#include <allegro.h>
int iniciar();
void realizar_juego();
void terminar();
int iniciar(){
allegro_init();
install_keyboard();
set_color_depth(16);
if (set_gfx_mode(GFX_AUTODETECT,640,480,0,0)<0){
printf("error al iniciar el modo grafico\n");
allegro_exit();
exit(-1);
}
}
void terminar(){
allegro_exit();
}
int main(){
printf("error a");
iniciar();
printf("error b");
realizar_juego();
printf("error c");
terminar();
}
END_OF_MAIN();
void realizar_juego(){
BITMAP *nave;
PALETTE paleta;
int x,y, x_anterior, y_anterior;
BITMAP * buffer;
nave=load_bitmap("C:/Users/DANIEL/Desktop/Programación/C++/Allegro/Naves/recursos/nave.pcx", paleta);
set_palette(paleta);
if (nave==NULL) terminar();
buffer=create_bitmap(nave->w,nave->h);
clear (buffer);
if (buffer==NULL) terminar();
x=SCREEN_W/2;
y=SCREEN_H/2;
while (!key[KEY_ESC]){
if (key[KEY_UP,KEY_W])
y--;
if (key[KEY_DOWN,KEY_S])
y++;
if (key[KEY_LEFT,KEY_A])
x--;
if (key[KEY_RIGHT,KEY_D])
x++;
if (x<0) x=x_anterior;
if (x>SCREEN_W-nave->w) x=x_anterior;
if (y<0) y=y_anterior;
if (y>SCREEN_H-nave->h) y=y_anterior;
if ((x_anterior!=x) || (y_anterior!=y)){
blit (buffer,screen, 0, 0, x_anterior, y_anterior,buffer->w,buffer->h);
blit (screen,buffer,x,y,0,0,buffer->w,buffer->h);
draw_sprite(screen,nave, x, y);
}
x_anterior=x;
y_anterior=y;
}
}
me salen los errores a y b
Vale. Ahora, sigue con ese método hasta encontrar la línea exacta que da el error. Ve colocando un par de printf, hasta que veas que uno no se muestra.
Ahora sabes que el error está dentro de realizar_juego. pon printf ahí.
Por cierto, por seguridad, pon printf("a"); fflush(stdout);.
fflush hace que se muestre por pantalla al momento (ya que printf, stdout, utiliza un buffer). Es posible que falle y no se llegue a mostrar por pantalla. Con el fflush, haces que se muestre al momento, cosa importante por aquí xd
esta es la linea que me fastidia:
buffer=create_bitmap(nave->w,nave->h);
pero no se como soluconarlo
No estoy seguro, pero si en vez de clear pones "clear_bitmap(...)", sigue igual?
si dices así
clear_bitmap(buffer);
si, sigue igual
Que extraño. Muestra en consola los valores de nave->w y nave->h antes del create_bitmap, a ver si son valores correctos.
EDITO: Wop, cuidado aqui:
nave=load_bitmap("C:/Users/DANIEL/Desktop/Programación/C++/Allegro/Naves/recursos/nave.pcx", paleta);
set_palette(paleta);
if (nave==NULL) terminar();
buffer=create_bitmap(nave->w,nave->h);
clear (buffer);
if (buffer==NULL) terminar();
if(nave == NULL) terminar();
El código va a proseguir, y va a empezar a tirar errores (tal vez). Después del terminar, haz un return:
nave=load_bitmap("C:/Users/DANIEL/Desktop/Programación/C++/Allegro/Naves/recursos/nave.pcx", paleta);
set_palette(paleta);
if (nave==NULL){
terminar();
return;
}
buffer=create_bitmap(nave->w,nave->h);
clear (buffer);
if (buffer==NULL){
terminar();
return;
}
O mejor aun: terminar() lo llamas al final del main, asi que no lo llames ahí, o será llamado 2 veces. Simplemente, pon el return.
nave=load_bitmap("C:/Users/DANIEL/Desktop/Programación/C++/Allegro/Naves/recursos/nave.pcx", paleta);
set_palette(paleta);
if (nave==NULL){
return;
}
buffer=create_bitmap(nave->w,nave->h);
clear (buffer);
if (buffer==NULL){
return;
}
va por ahí, he puesto que me dijese error c al ir a terminar y me ha salido que hago???
Pues nuevamente, encontrar dónde falla.
Intuyo que falla en:
nave=load_bitmap("C:/Users/DANIEL/Desktop/Programación/C++/Allegro/Naves/recursos/nave.pcx", paleta);
Verifícalo.
Si es eso, fíjate que el pcx exista y que la ruta sea correcta.
http://liballeg.org/stabledocs/en/alleg010.html#load_bitmap (http://liballeg.org/stabledocs/en/alleg010.html#load_bitmap)
existe, pero no se que le pasa, llevo dias dandole vueltas y no lo consigo ayudadme, xfa
Prueba con una ruta relativa (que es lo que deberías hacer la mayoría d elas veces)
En vez de poner "C:/Users/DANIEL/Desktop/Programación/C++/Allegro/Naves/recursos/nave.pcx", (supooniendo que tu ejecutable está en la carpeta Naves, pon: "recursos/nave.pcx". Y a ver.
sigue igual
he probado a poner nube.pcx en la ruta y me da el mismo error que si lo pongo bien, he comprobado la ruta original(win+r) y está bien puesta
podríais intentarlo desde vuestros ordenadores por si acaso lo que falla es mi ordenador?
[MOD] No realizar triple post, para añadir comentarios usar el botón "modificar"
¿Tu archivo es un pcx de verdad o has pillado una imagen cualquiera y la has cambiado la extensión?
Si tu imagen era un bmp, y tal vez te iría mejor por esa parte, deberías haber hecho lo siguiente: [del manual online de allegro (deberías pasarte por allí)] http://liballeg.org/stabledocs/en/alleg010.html
PACKFILE *packfile;
BITMAP *bmp;
packfile = pack_fopen("mybitmap.bmp", F_READ);
if (!packfile)
abort_on_error("Couldn't open mybitmap.bmp");
bmp = load_bmp_pf(packfile, pal);
if (!bmp)
abort_on_error("Error loading mybitmap.bmp");