|
1002
|
Programación / Programación C/C++ / Re: el programa dejó de funconar correctamente por un problema.
|
en: 18 Septiembre 2016, 21:13 pm
|
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; }
|
|
|
1004
|
Programación / Programación C/C++ / Re: char16_t, char32_t y wchar_t. ¿Para que estan?
|
en: 18 Septiembre 2016, 20:33 pm
|
Igual que uint8_t, int16_t, int32_t... Te aseguran el tamaño de la variable, en bits.
El caso de esos tipos essimplementa para ser usados con toras codificaciones. Cada caracter de UTF-16, por ejemplo, utiliza hasta 2 bytes,16 bits. Para ello, podrías usar char16_t.
Si no necesitas los tipos, o los uses. Rara vez los utilizarás explícitamente. Pero están ahí para cuando se necesiten.
No se muestran como caracter, sino como número. Eso es porque realmente lo que son es eso, números. La única excepción es el entero de 8 bits (char8_t, char, int8_t), que se muestra como caracter.
|
|
|
1006
|
Programación / Programación C/C++ / Re: el programa dejó de funconar correctamente por un problema.
|
en: 18 Septiembre 2016, 16:09 pm
|
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
|
|
|
1007
|
Programación / Programación C/C++ / Re: el programa dejó de funconar correctamente por un problema.
|
en: 18 Septiembre 2016, 13:14 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. ¿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; } } 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);
|
|
|
1008
|
Programación / Programación C/C++ / Re: [C++] Sobrecarga de Operadores
|
en: 17 Septiembre 2016, 23:04 pm
|
Cuidado con eso. El problema era: Array& operator +(const Array &a1,const Array &a2) { Array b; for ( int i = 0; i < b.tamanio; i++ ) { b.ptr[i] = a1.ptr[i] + a2.ptr[i]; } return b; }
El retorno es Array&. Es decir, una referencia a un objeto. Estás retornando un objeto del ámbito de la función, es decir, va a desaparecer terminada la función. Estás retornando una referencia a un objeto que será destruido. La solución, es poner que retorne un Array, sin el operador &.
|
|
|
1010
|
Programación / Programación C/C++ / Re: Mejor forma de procesar una cadena de formato [Cantidad de memoria]
|
en: 16 Septiembre 2016, 22:31 pm
|
Utiliza los datos que te da la propia función. La función retorna la cantidad de caracteres que necesita. #include <stdlib.h> #include <stdio.h> #include <stdarg.h> void temp(char* format, ...){ va_list list; int n = vsnprintf(0, 0, format, list); vsnprintf(t, n+1, format, list); } int main(){ temp("%i%i%i", 123,456,789); }
|
|
|
|
|
|
|