elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Entrar al Canal Oficial Telegram de elhacker.net


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Dibujador de BMP -Error con chkstk_ms()...
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Dibujador de BMP -Error con chkstk_ms()...  (Leído 1,772 veces)
harry_the_blogger

Desconectado Desconectado

Mensajes: 105


Visita mi blog es enriquemesa.blogspot.com


Ver Perfil WWW
Dibujador de BMP -Error con chkstk_ms()...
« en: 14 Enero 2016, 21:06 pm »

Hola, estoy haciendo un programa que crea archivos bmp de las dimensiones que yo quiera, y lo rellene en gris, y listo. El programa para las dimensiones 100x100 funciona, pero más allá falla algunas veces, principalmente si es más de 1000;

¿Pueden decirme como eliminar ese error que dice SIGSEV en chkstk_ms()??
¿Es mi codigo o sólo el compilador?

Si uso valores en WIDTH Y HEIGHT de 100, todo normal. Si me paso a 10000, se tranca y devuelve en depuracion SIGSEV en un chkstk_ms(), y ni muestra el primer printf. ¿Debo reinstalar el compilador o algo así? Al menos el error debería ser puntual, y no general.

Gracias de antemano.

Código
  1. #include <iostream>
  2. #include <strings.h>
  3. #include <stdlib.h>
  4. #include <stdio.h>
  5.  
  6. #define WIDTH 10000
  7. #define HEIGHT 10000
  8.  
  9. ///DONE:
  10. ///     Mas o menos crea la imagen.
  11. ///     Cuando se pasa de 1000 ambos, ocurre una falla.
  12. ///     del tipo Violacion de Segmento.
  13.  
  14. ///Error oculto solucionado: No consideraba las iniciales BM (2 bytes) al tamaño
  15. ///del archivo, muy importantes.
  16.  
  17. ///TO-DO:
  18. ///     -Fill the image with interesting data.
  19.  
  20. ///     -El programa lo unico que debe hacer es soportar colorear de azul,
  21. ///     un cuadro de 1000, pixeles.
  22.  
  23. ///     -Hay un problema con lo que significa el manejo del formato, en si mismo
  24. ///     -No puedo exceder los 1000px, debe ser algo relacionado con el padding.
  25.  
  26. ///     -Si grabó tal cual se le asignaron los valores a la matriz,
  27. ///      por tanto el error es de interpretacion. La escritura está bien.
  28. ///      aprender como manejar los bytes y dibujar un cuadrado, o algo así.
  29. ///     -Si soportó el array de bmp_pixeles, pero grabó basura
  30. ///     -Sin embargo, el formato quedó intacto.
  31.  
  32. using namespace std;
  33.  
  34. char bmp_sign[2] = {'B', 'M'}; /// = "BM";
  35.  
  36. struct bmp_format{
  37.  
  38.    unsigned int filesize; /// = filesize
  39.    unsigned short reserved_a; /// = 0;
  40.    unsigned short reserved_b; /// = 0;
  41.    unsigned int start_of_data_image; /// = 54
  42.    unsigned int bitmap_header_size;
  43.  
  44.    unsigned int width;
  45.    unsigned int height;
  46.    unsigned short number_of_planes;
  47.    unsigned short bits_per_pixel;// = 1;
  48.  
  49.    unsigned int compression; /// = 0;
  50.    unsigned int size_of_image; /// = 0;
  51.    unsigned int horizontal_resolution; /// = 0
  52.    unsigned int vertical_resolution; /// = 0;
  53.    unsigned int size_of_color_palette;
  54.    unsigned int counter_of_interesting_colors;
  55. };
  56.  
  57. struct bmp_pixel{
  58.    unsigned char red;
  59.    unsigned char green;
  60.    unsigned char blue;
  61. };
  62.  
  63. int main()
  64. {
  65.    FILE *bmp_file;
  66.    FILE *debug_image;
  67.    FILE *debug_binary;
  68.  
  69.    printf("Abriendo archivos bmp y debug respectivos\n");
  70.    bmp_file = fopen("C:\\output.bmp", "w+b");
  71.    //debug_image = fopen("C:\\image_in_bin.hex", "w+b");
  72.    //debug_binary = fopen("C:\\memory_in_bin.hex", "w+b");
  73.  
  74.    bmp_format bmp_format;
  75.    memset(&bmp_format, 0, sizeof(bmp_format));
  76.    printf("Estableciendo bmp format a NULL para mantenerlo limpio\n");
  77.  
  78.    unsigned int number_of_data_bytes;
  79.  
  80.    ///Initializing data
  81.    ///TO-DO: Design a better method to adjust values than
  82.    ///hard-code it.
  83.  
  84.    bmp_format.start_of_data_image = 54;
  85.    bmp_format.bitmap_header_size = 40;
  86.    bmp_format.width = WIDTH;
  87.    bmp_format.height = HEIGHT;
  88.    bmp_format.number_of_planes = 1;
  89.    bmp_format.bits_per_pixel = 24;
  90.    bmp_format.compression = 0;
  91.    bmp_format.size_of_image = number_of_data_bytes;
  92.    bmp_format.horizontal_resolution = 0;
  93.    bmp_format.vertical_resolution = 0;
  94.    bmp_format.size_of_color_palette = 0;
  95.    bmp_format.counter_of_interesting_colors = 0;
  96.  
  97.    ///TODO: This value must have a formule:
  98.    ///     -bmp_header + ([width * height] * 3 bytes of rgb)
  99.    ///TODO: Use it over hardcoded values.
  100.    number_of_data_bytes = (WIDTH * HEIGHT) * 3;
  101.    bmp_format.filesize = 2 + sizeof(bmp_format) + number_of_data_bytes;
  102.  
  103.    printf("Ya fueron rellenados todos los campos de bmp format!!\n");
  104.  
  105.    fwrite((char *) &bmp_sign, 2, 1, bmp_file);
  106.    fwrite((char *) &bmp_format, sizeof(bmp_format), 1, bmp_file);
  107.  
  108.    printf("Grabando bmp format + la señal de BM\n");
  109.  
  110.    /*struct bmp_pixel pixeles[WIDTH][HEIGHT];
  111. */
  112.  
  113.    char pixeles[WIDTH * HEIGHT * 3];
  114.    for(int i = 0; i < number_of_data_bytes; i++){
  115.        pixeles[i] = 0x50;
  116.    }
  117.  
  118. /*
  119.     ///Clear pixeles and zero it to avoid filter my
  120.     ///system data on memory swap.
  121.     memset(pixeles, 0, sizeof(pixeles));
  122.  
  123.     for(int e = 0; e < WIDTH; e = e + 5){
  124.         for(int i = 0; i < HEIGHT; i++){
  125.             pixeles[i][e].blue = 0xDE;
  126.             pixeles[i][e].red = 0xAD;
  127.             pixeles[i][e].green = 0xff;
  128.         }
  129.     }*/
  130.  
  131.    ///fwrite((char *) pixeles, number_of_data_bytes, 1, debug_image);
  132.    ///fwrite((char *) pixeles, number_of_data_bytes, 1, debug_binary);
  133.    ///fwrite((char *) pixeles, (WIDTH * HEIGHT * 3), 1, bmp_file);
  134.  
  135.    fclose(bmp_file);
  136.    cout << "Dibujador de BMP. En progreso y con futuro." << endl;
  137.    return 0;
  138. }
  139.  


« Última modificación: 14 Enero 2016, 21:12 pm por harry_the_blogger » En línea

Vista mi blog es enriquemesa.blogspot.com
Eternal Idol
Kernel coder
Moderador
***
Desconectado Desconectado

Mensajes: 5.937


Israel nunca torturó niños, ni lo volverá a hacer.


Ver Perfil WWW
Re: Dibujador de BMP -Error con chkstk_ms()...
« Respuesta #1 en: 14 Enero 2016, 21:20 pm »

La pila es finita, usa memoria dinamica (o una variable global, que ira a la sección de datos)/


En línea

La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón
harry_the_blogger

Desconectado Desconectado

Mensajes: 105


Visita mi blog es enriquemesa.blogspot.com


Ver Perfil WWW
Re: Dibujador de BMP -Error con chkstk_ms()...
« Respuesta #2 en: 14 Enero 2016, 21:53 pm »

Ah, no entiendo bien eso. Gracias por responderme. Que me aconsejas exactamente?? Colocó el bmp header como un puntero??? y de allí lo grabó?? Es eso lo que me dices??

Disculpa por las molestias, no tengo mucho conocimiento sobre la pila y los punteros, el problema entonces no está en mi lógica de código?? Pregunto por si acaso.

EDIT: 1

Ya hice algo, cambie el array a dinamico y me compilo sin problemas. Eso es lo que entendí. Gracias



Una ultima ayuda. ¿Como traduzco esto

Código
  1. struct bmp_pixel pixeles[WIDTH][HEIGHT];
  2.  

a un array dinámico pero de estructura?? Por favor, ayuda que es lo único que me faltta para empezar a dibujar sobre el Bitmap con total seguridad.

Gracias de antemano
« Última modificación: 14 Enero 2016, 22:57 pm por Eternal Idol » En línea

Vista mi blog es enriquemesa.blogspot.com
T. Collins

Desconectado Desconectado

Mensajes: 206


Ver Perfil
Re: Dibujador de BMP -Error con chkstk_ms()...
« Respuesta #3 en: 14 Enero 2016, 23:00 pm »

yo lo haría así:
Código
  1. array = malloc(sizeof(bmp_pixel)*WIDTH*HEIGHT);

pero así tendrías que accederlo de esta forma:
Código
  1. pixelXY = array[X*WIDTH+Y];

para accederlo de forma bidimensional, busca bidimensional dynamic array c en google
En línea

furciorifa

Desconectado Desconectado

Mensajes: 94


Ver Perfil
Re: Dibujador de BMP -Error con chkstk_ms()...
« Respuesta #4 en: 3 Febrero 2016, 05:09 am »

No entiendo porque mezclas C++ con C se me hace innecesario usar printf y cout en un programa además , si lo que estás usando es C++, deberías usar cstdio,cstdlib.... etc como debe ser pero en fin ... yendo a lo que es tú duda debes usar una pila dinamica o quizá una lista para que tú programa mejore. ;)
En línea

ivancea96


Desconectado Desconectado

Mensajes: 3.412


ASMático


Ver Perfil WWW
Re: Dibujador de BMP -Error con chkstk_ms()...
« Respuesta #5 en: 3 Febrero 2016, 15:58 pm »

Un detalle para cuando leas o escribas BMP, a parte de lo que te comenten por aquí.

Cuando comienzas a escribir los bytes, cada fila ha de ocupar un número de bytes divisible entre 4. Es decir, si hay 2 columnas, serían 6 bytes. Para ocupar los bytes que faltan, se añaden dos bytes de relleno o padding.

Para una idea menos abstracta, aquí tienes un ejemplo: https://en.wikipedia.org/wiki/BMP_file_format#Example_1
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines