• Sábado 14 de Diciembre de 2024, 17:40

Autor Tema:  donde está el error?  (Leído 1224 veces)

pacorubio77

  • Miembro MUY activo
  • ***
  • Mensajes: 207
    • Ver Perfil
donde está el error?
« en: Miércoles 28 de Octubre de 2009, 18:06 »
0
Hola, no consigo ver donde está el fallo de segmentacion que me da, me pueden ayudar?

Código: C++
  1.  
  2.  
  3. bool TPoro::EsMayuscula(char c){
  4.  
  5.   bool mayuscula=false;
  6.  
  7.   if ( (c>='A') && (c<='Z') ){
  8.  
  9.       mayuscula=true;
  10.  
  11.   }
  12. return (mayuscula);
  13. }
  14.  
  15. void TPoro::Convertir(char *col){
  16.  
  17.   int i=0;
  18.   int tam=0;
  19.  
  20.       if(col!=NULL){
  21.           cout<<"col es distinto de NULL"<<endl;
  22.           tam=strlen(col);
  23.           cout<<tam<<endl;
  24.           char *cad1;
  25.           while(i<tam){
  26.         cout<<"col[i] "<<col[i]<<endl;
  27.         if( EsMayuscula(col[i]) ){
  28.             cout<<"es mayus"<<endl;
  29.             cad1[i]=col[i]+32;
  30.             cout<<cad1[i]<<endl;
  31.  
  32.         }
  33.         else{
  34.             cout<<"no es mayus"<<endl;
  35.             cad1[i]=col[i];
  36.  
  37.         }
  38.           i++;
  39.           }
  40.           cout<<"fuera del while"<<endl;
  41.           cad1[tam]='';
  42.           strcpy(color,cad1);
  43.           cout<<color<<endl;
  44.    
  45.       }
  46. }
  47.  
  48.  
  49.  
  50.  
  51. TPoro::TPoro(int px,int py,double vol,char *col){
  52.  
  53.     int tam;
  54.  
  55.  
  56.     //cout<<"a la funcion"<<endl;
  57.  
  58.     x=px;
  59.     y=py;
  60.     volumen=vol;
  61.    
  62.     if(col!=NULL){
  63.         color=new char[strlen(col)+1];
  64.    
  65.         //cout<<"COL "<<color<<endl;
  66.  
  67.         if(color==NULL){
  68.             return;
  69.         }
  70.  
  71.     //if(color !=NULL){
  72.         cout<<"llego aqui"<<endl;
  73.         Convertir(col);
  74.         //strcpy(color,col);
  75.         cout<<"salgo?"<<endl;
  76.     //}
  77.     }
  78.     else{
  79.         color=NULL;
  80.         return;
  81.     }
  82.  
  83.     //cout<<"salgo de la funcion"<<endl;
  84.     //cout<<"color "<<color<<endl;
  85.  
  86. }
  87.  
  88.  
  89.  
  90.  

Tengo que decir que las funciones Convertir (pasa de mayusculas a minusculas) y Mayuscula comprueba si es o no mayuscula el caracter.
y dichos metodos me los he implementado en la parte pública.

pero cuando llega fuera de Convertir..pega el cascazo....

Me ayudan?

diego.martinez

  • Miembro MUY activo
  • ***
  • Mensajes: 297
    • Ver Perfil
Re: donde está el error?
« Respuesta #1 en: Miércoles 28 de Octubre de 2009, 19:02 »
0
Código: C++
  1.  
  2. char *cad1;   <--------------- AQUI! lo inicializas apuntando a vaya a saber usted donde
  3.           while(i<tam){
  4.         cout<<"col[i] "<<col[i]<<endl;
  5.         if( EsMayuscula(col[i]) ){
  6.             cout<<"es mayus"<<endl;
  7.             cad1[i]=col[i]+32; <-------------------- y aqui pones un bonito valor en un  offset de cad1 que produce un error de acceso a memoria
  8.  
  9.  

Estas usando un puntero sin inicializar.
Deberias, o bien poner (para inicializar con 100 bytes por ejemplo):

 char cad1[100]; //e inicializar con 100 bytes
o
 char *cad1=(char*)malloc(sizeof(char)*100);
o
char * cad1=new char[100];  

El error se produce al salir de la funcion por que es cuando se "limpia" todo lo que hayas usado en la función, y claro, es entonces cuando detecta que has puesto datos donde no debias.

 :hola:

pacorubio77

  • Miembro MUY activo
  • ***
  • Mensajes: 207
    • Ver Perfil
Re: donde está el error?
« Respuesta #2 en: Miércoles 28 de Octubre de 2009, 19:15 »
0
Hola, quiero que veais como lo he arreglado, y me deis vuestra aceptacion.

Código: C++
  1.  
  2. bool TPoro::EsMayuscula(char c){
  3.  
  4.   bool mayuscula=false;
  5.  
  6.   if ( (c>='A') && (c<='Z') ){
  7.  
  8.       mayuscula=true;
  9.  
  10.   }
  11. return (mayuscula);
  12. }
  13.  
  14. void TPoro::Convertir(char *col,char *color){
  15.  
  16.   int i=0;
  17.   int tam=0;
  18.  
  19.       if(col!=NULL){
  20.           cout<<"col es distinto de NULL"<<endl;
  21.           tam=strlen(col);
  22.           cout<<tam<<endl;
  23.           //char *cad1;
  24.           while(i<tam){
  25.         cout<<"col[i] "<<col[i]<<endl;
  26.         if( EsMayuscula(col[i]) ){
  27.             cout<<"es mayus"<<endl;
  28.             color[i]=col[i]+32;
  29.             cout<<color[i]<<endl;
  30.  
  31.         }
  32.         else{
  33.             cout<<"no es mayus"<<endl;
  34.             color[i]=col[i];
  35.  
  36.         }
  37.           i++;
  38.           }
  39.           cout<<"fuera del while"<<endl;
  40.           color[tam]='';
  41.           //strcpy(color,cad1);
  42.           cout<<color<<endl;
  43.    
  44.       }
  45. }
  46.  
  47.  
  48.  
  49.  
  50. TPoro::TPoro(int px,int py,double vol,char *col){
  51.  
  52.     int tam;
  53.  
  54.  
  55.     //cout<<"a la funcion"<<endl;
  56.  
  57.     x=px;
  58.     y=py;
  59.     volumen=vol;
  60.    
  61.     if(col!=NULL){
  62.         color=new char[strlen(col)+1];
  63.    
  64.         //cout<<"COL "<<color<<endl;
  65.  
  66.         if(color==NULL){
  67.             return;
  68.         }
  69.  
  70.     //if(color !=NULL){
  71.         cout<<"llego aqui"<<endl;
  72.         Convertir(col,color);
  73.         //strcpy(color,col);
  74.         cout<<"salgo?"<<endl;
  75.     //}
  76.     }
  77.     else{
  78.         color=NULL;
  79.         return;
  80.     }
  81.  
  82.     //cout<<"salgo de la funcion"<<endl;
  83.     //cout<<"color "<<color<<endl;
  84.  
  85. }
  86.  
  87.  

Decirme vuestras opiniones