• Jueves 2 de Mayo de 2024, 02:18

Autor Tema:  Problema con "Segmentation Fault" en la libreria "Allegro"  (Leído 1673 veces)

javili

  • Nuevo Miembro
  • *
  • Mensajes: 3
    • Ver Perfil
Problema con "Segmentation Fault" en la libreria "Allegro"
« en: Viernes 4 de Mayo de 2012, 20:34 »
0
Hola, tengo un problema de lo que creo que es desbordamiento de memoria, con error "Segmentation Fault" de la libreria Allegro.

El fallo se produce en la función "CalcularZonas", creo que el problema esta en el "buffer", pero no estoy seguro. La verdad no creo que se pueda encontrar el por qué, pero si alguien se lo quiere tomar como un reto y quiere ayudarme, le estaria muy gratamente agradecido.

El codigo del programa es el seguiente:

Código: C++
  1. #include <iostream>
  2. #include "EasyBMP.h"
  3. #include "allegro.h"
  4.  
  5. #define X 740
  6. #define Y 570
  7. #define F 10000
  8.  
  9. using namespace std;
  10.  
  11. class Pixel
  12. {
  13.     public:
  14.     short int red;
  15.     short int green;
  16.     short int blue;
  17.     short int alfa;
  18.     unsigned int zona;
  19.     bool pas,prepas;
  20. };
  21.  
  22. class Relieve{
  23.     public:
  24.     bool frontera;
  25. };
  26.  
  27. void CargarImagen (Pixel CCD[X][Y])
  28. {
  29.     int i,j;
  30.  
  31.     BMP imagen;
  32.     imagen.ReadFromFile("m64.bmp");
  33.  
  34.     for(i=0;i<X;i++){
  35.         for(j=0;j<Y;j++){
  36.             CCD[i][j].red=(int) imagen(i,j)->Red;
  37.             CCD[i][j].green=(int) imagen(i,j)->Green;
  38.             CCD[i][j].blue=(int) imagen(i,j)->Blue;
  39.             CCD[i][j].alfa=(int) imagen(i,j) ->Alpha;
  40.             CCD[i][j].pas=false;
  41.             CCD[i][j].prepas=false;
  42.             CCD[i][j].zona=0;
  43.         }
  44.     }
  45. }
  46.  
  47. void GraficarCCD(Pixel array[X][Y])
  48. {
  49.     int i,j;
  50.  
  51.     for(i=0;i<X;i++){
  52.         for(j=0;j<Y;j++){
  53.             putpixel(screen,i,j,makeacol(array[i][j].red,array[i][j].green,array[i][j].blue,array[i][j].alfa));
  54.         }
  55.     }
  56. }
  57.  
  58.  
  59.  
  60. void GraficarMascara(Relieve Mascara[X][Y])
  61. {
  62.     int i,j;
  63.  
  64.     for(i=0;i<X;i++){
  65.         for(j=0;j<Y;j++){
  66.             if(Mascara[i][j].frontera)
  67.             putpixel(screen,i,j,makeacol(255,255,255,255));
  68.             else putpixel(screen,i,j,makeacol(0,0,0,0));
  69.         }
  70.     }
  71. }
  72.  
  73. void GraficarCCDMascara(Pixel CCD[X][Y],Relieve Mascara[X][Y])
  74. {
  75.     int i,j;
  76.  
  77.     for(i=0;i<X;i++){
  78.         for(j=0;j<Y;j++){
  79.             if(Mascara[i][j].frontera) putpixel(screen,i,j,makeacol(255,255,255,255));
  80.             else
  81.             {
  82.                 putpixel(screen,i,j,makeacol(CCD[i][j].red,CCD[i][j].green,CCD[i][j].blue,CCD[i][j].alfa));
  83.             }
  84.         }
  85.     }
  86.  
  87. }
  88.  
  89. int CalcularFrontera (Pixel CCD[X][Y],Relieve Mascara[X][Y])
  90. {
  91.     int i,j, corte, indice;
  92.  
  93.     cout<<"Por favor, escriba el valor de corte para calcular la frontera de luminosidad."<<endl<<endl;
  94.     do{
  95.         cout<<"Numero entre 0 y 255:  "<<endl;
  96.         cin>>corte;
  97.     }while(corte<-1 || corte>255);
  98.  
  99.     for(i=1;i<X-1;i++){
  100.         for(j=1;j<Y-1;j++){
  101.  
  102.             if(CCD[i][j].red>corte){
  103.                 if(CCD[i+1][j].red<corte || CCD[i-1][j].red<corte || CCD[i][j+1].red<corte || CCD[i][j-1].red<corte)
  104.                 {
  105.                     Mascara[i][j].frontera=true;
  106.                 }
  107.                 else Mascara[i][j].frontera=false;
  108.             }
  109.         }
  110.     }
  111.     GraficarMascara(Mascara);
  112.  
  113.     do{
  114.         cout<<"Pulse 1 para refrescar la pantalla"<<endl;
  115.         cout<<"Pulse 2 para superponer el filtro de saturacion a la imagen"<<endl;
  116.         cout<<"Pulse 3 para cambiar el limite de saturacion"<<endl;
  117.         cout<<"Pulse 4 para aceptar el limite de saturacion"<<endl;
  118.         cin>>indice;
  119.  
  120.         if(indice==1)
  121.         {
  122.             GraficarCCD(CCD);
  123.             GraficarMascara(Mascara);
  124.         }
  125.  
  126.         if(indice==2)
  127.         {
  128.             GraficarCCDMascara(CCD,Mascara);
  129.         }
  130.  
  131.         if(indice==3)
  132.         {
  133.             cout<<"Por favor, escriba el valor de corte para calcular la frontera de luminosidad."<<endl<<endl;
  134.             do{
  135.                 cout<<"Numero entre 0 y 255:  "<<endl;
  136.                 cin>>corte;
  137.             }while(corte<-1 || corte>255);
  138.  
  139.             for(i=0;i<X;i++){
  140.                 for(j=0;j<Y;j++){
  141.                     Mascara[i][j].frontera=false;
  142.                 }
  143.             }
  144.  
  145.             for(i=1;i<X-1;i++){
  146.                 for(j=1;j<Y-1;j++){
  147.  
  148.                     if(CCD[i][j].blue>corte){
  149.                         if(CCD[i+1][j].blue<corte || CCD[i-1][j].blue<corte || CCD[i][j+1].blue<corte || CCD[i][j-1].blue<corte)
  150.                         {
  151.                             Mascara[i][j].frontera=true;
  152.                         }
  153.                         else Mascara[i][j].frontera=false;
  154.                     }
  155.                 }
  156.             }
  157.             GraficarCCD(CCD);
  158.             GraficarMascara(Mascara);
  159.         }
  160.     }while(indice!=4);
  161.     return corte;
  162. }
  163.  
  164.  
  165. void CalcularZonas (Pixel CCD[X][Y],int corte_sat)
  166. {
  167.     class buf
  168.     {
  169.         public:
  170.         int k;
  171.         int l;
  172.     };
  173.  
  174.     int i,j,z,b,p,m;
  175.     int zonas=0;
  176.     z=0;
  177.     b=0;
  178.     buf buffer[F];
  179.     for(m=0;m<F;m++)
  180.     {
  181.         buffer[m].k=-1;
  182.         buffer[m].l=-1;
  183.     }
  184.  
  185.  
  186.  
  187.     for(i=0;i<X;i++)
  188.     {
  189.         for(j=0;j<Y;j++)
  190.         {
  191.  
  192.  
  193.             if(CCD[i][j].red>corte_sat && CCD[i][j].pas==false && CCD[i][j].prepas==false)
  194.             {
  195.                 z++;
  196.                 b=0;
  197.  
  198.                 CCD[i][j].zona=z;
  199.                 CCD[i][j].prepas=true;
  200.                 CCD[i][j].pas=true;
  201.  
  202.  
  203.                 if(CCD[i+1][j].red>corte_sat && CCD[i+1][j].prepas==false && CCD[i+1][j].pas==false)
  204.                 {
  205.                     buffer[b].k=i+1;
  206.                     buffer[b].l=j;
  207.                     b++;
  208.                     CCD[i+1][j].prepas=true;
  209.                 }
  210.                 if(CCD[i][j+1].red>corte_sat && CCD[i][j+1].prepas==false && CCD[i][j+1].pas==false)
  211.                 {
  212.                     buffer[b].k=i;
  213.                     buffer[b].l=j+1;
  214.                     b++;
  215.                     CCD[i][j+1].prepas=true;
  216.                 }
  217.                 if(CCD[i-1][j].red>corte_sat && CCD[i-1][j].prepas==false && CCD[i-1][j].pas==false)
  218.                 {
  219.                     buffer[b].k=i-1;
  220.                     buffer[b].l=j;
  221.                     b++;
  222.                     CCD[i-1][j].prepas=true;
  223.                 }
  224.                 if(CCD[i][j-1].red>corte_sat && CCD[i][j-1].prepas==false && CCD[i][j-1].pas==false)
  225.                 {
  226.                     buffer[b].k=i;
  227.                     buffer[b].l=j-1;
  228.                     b++;
  229.                     CCD[i][j-1].prepas=true;
  230.                 }
  231.                 if(CCD[i+1][j+1].red>corte_sat && CCD[i+1][j+1].prepas==false && CCD[i+1][j+1].pas==false)
  232.                 {
  233.                     buffer[b].k=i+1;
  234.                     buffer[b].l=j+1;
  235.                     b++;
  236.                     CCD[i+1][j+1].prepas=true;
  237.                 }
  238.                 if(CCD[i+1][j-1].red>corte_sat && CCD[i+1][j-1].prepas==false && CCD[i+1][j-1].pas==false)
  239.                 {
  240.                     buffer[b].k=i+1;
  241.                     buffer[b].l=j-1;
  242.                     b++;
  243.                     CCD[i+1][j-1].prepas=true;
  244.                 }
  245.                 if(CCD[i-1][j+1].red>corte_sat && CCD[i-1][j+1].prepas==false && CCD[i-1][j+1].pas==false)
  246.                 {
  247.                     buffer[b].k=i-1;
  248.                     buffer[b].l=j+1;
  249.                     b++;
  250.                     CCD[i-1][j+1].prepas=true;
  251.                 }
  252.                 if(CCD[i-1][j-1].red>corte_sat && CCD[i-1][j-1].prepas==false && CCD[i-1][j-1].pas==false)
  253.                 {
  254.                     buffer[b].k=i-1;
  255.                     buffer[b].l=j-1;
  256.                     b++;
  257.                     CCD[i-1][j-1].prepas=true;
  258.                 }
  259.  
  260.                 p=-1;
  261.  
  262.  
  263.                 do {
  264.                     p++;
  265.                     CCD[buffer[p].k][buffer[p].l].pas=true;
  266.                     CCD[buffer[p].k][buffer[p].l].zona=z;
  267.  
  268.                     buffer[p].k=-1;
  269.                     buffer[p].l=-1;
  270.  
  271.  
  272.                     if((CCD[(buffer[1+p].k)+1][buffer[1+p].l].red>corte_sat) && (CCD[(buffer[1+p].k+1)][buffer[1+p].l].prepas==false) && (CCD[(buffer[1+p].k+1)][buffer[1+p].l].pas==false))
  273.                     {
  274.                         buffer[b].k=buffer[1+p].k+1;
  275.                         buffer[b].l=buffer[1+p].l;
  276.                         b++;
  277.                     }
  278.                     if((CCD[(buffer[1+p].k)][buffer[1+p].l+1].red>corte_sat) && (CCD[(buffer[1+p].k)][buffer[1+p].l+1].prepas==false) && (CCD[(buffer[1+p].k)][buffer[1+p].l+1].pas==false))
  279.                     {
  280.                         buffer[b].k=buffer[1+p].k;
  281.                         buffer[b].l=buffer[1+p].l+1;
  282.                         b++;
  283.                     }
  284.                     if((CCD[(buffer[1+p].k)-1][buffer[1+p].l].red>corte_sat) && (CCD[(buffer[1+p].k)-1][buffer[1+p].l].prepas==false) && (CCD[(buffer[1+p].k)-1][buffer[1+p].l].pas==false))
  285.                     {
  286.                         buffer[b].k=buffer[1+p].k-1;
  287.                         buffer[b].l=buffer[1+p].l;
  288.                         b++;
  289.                     }
  290.                     if((CCD[buffer[1+p].k][(buffer[1+p].l)-1].red>corte_sat) && (CCD[buffer[1+p].k][(buffer[1+p].l)-1].prepas==false) && (CCD[(buffer[1+p].k)][(buffer[1+p].l)-1].pas==false))
  291.                     {
  292.                         buffer[b].k=buffer[1+p].k;
  293.                         buffer[b].l=buffer[1+p].l-1;
  294.                         b++;
  295.                     }
  296.                     if((CCD[(buffer[1+p].k)+1][(buffer[1+p].l)+1].red>corte_sat) && (CCD[(buffer[1+p].k)+1][(buffer[1+p].l)+1].prepas==false) && (CCD[(buffer[1+p].k)+1][(buffer[1+p].l)+1].pas==false))
  297.                     {
  298.                         buffer[b].k=buffer[1+p].k+1;
  299.                         buffer[b].l=buffer[1+p].l+1;
  300.                         b++;
  301.                     }
  302.                     if((CCD[(buffer[1+p].k)+1][(buffer[1+p].l)-1].red>corte_sat) && (CCD[(buffer[1+p].k)+1][(buffer[1+p].l)-1].prepas==false) && (CCD[(buffer[1+p].k)+1][(buffer[1+p].l)-1].pas==false))
  303.                     {
  304.                         buffer[b].k=buffer[1+p].k+1;
  305.                         buffer[b].l=buffer[1+p].l-1;
  306.                         b++;
  307.                     }
  308.                     if((CCD[(buffer[1+p].k)-1][(buffer[1+p].l)+1].red>corte_sat) && (CCD[(buffer[1+p].k)-1][(buffer[1+p].l)+1].prepas==false) && (CCD[(buffer[1+p].k)-1][(buffer[1+p].l)+1].pas==false))
  309.                     {
  310.                         buffer[b].k=buffer[1+p].k-1;
  311.                         buffer[b].l=buffer[1+p].l+1;
  312.                         b++;
  313.                     }
  314.                     if((CCD[(buffer[1+p].k)-1][(buffer[1+p].l)-1].red>corte_sat) && (CCD[(buffer[1+p].k)-1][(buffer[1+p].l)-1].prepas==false) && (CCD[(buffer[1+p].k)-1][(buffer[1+p].l)-1].pas==false))
  315.                     {
  316.                         buffer[b].k=buffer[1+p].k-1;
  317.                         buffer[b].l=buffer[1+p].l-1;
  318.                         b++;
  319.                     }
  320.  
  321.                 } while((buffer[1+p].k)!=-1);
  322.  
  323.             }
  324.             else
  325.             {
  326.                CCD[i][j].pas=true;
  327.             }
  328.  
  329.         }
  330.     }
  331.  
  332.  
  333.  
  334. cout<<z<<endl;
  335.  
  336. }
  337.  
  338. void GraficarCCDZona(Pixel array[X][Y])
  339. {
  340.     int i,j;
  341.  
  342.     for(i=0;i<X;i++){
  343.         for(j=0;j<Y;j++){
  344.             if(array[i][j].zona!=0)
  345.             {
  346.             putpixel(screen,i,j,makeacol(array[i][j].red,array[i][j].green,array[i][j].blue,array[i][j].alfa));
  347.             }
  348.             else{
  349.                 putpixel(screen,i,j,makeacol(0,0,0,0));
  350.             }
  351.         }
  352.     }
  353. }
  354.  
  355.  
  356. int main()
  357. {
  358.     string pausa;
  359.     int corte_sat;
  360.  
  361.     Pixel CCD[X][Y];
  362.     Relieve Mascara[X][Y];
  363.  
  364.     allegro_init();
  365.     set_color_depth(16);
  366.     set_write_alpha_blender();
  367.  
  368.     set_gfx_mode(GFX_AUTODETECT_WINDOWED,740,570,0,0);
  369.  
  370.     CargarImagen(CCD);
  371.     GraficarCCD(CCD);
  372.  
  373.     corte_sat=CalcularFrontera(CCD,Mascara);
  374.  
  375.     cin>>pausa;
  376.  
  377.     CalcularZonas(CCD,corte_sat);
  378.  
  379.     GraficarCCDZona(CCD);
  380.  
  381.     cin>>pausa;
  382.  
  383.  
  384.     allegro_exit();
  385.     return 0;
  386. }
  387.  
  388.