SoloCodigo

Programación General => C/C++ => Mensaje iniciado por: pacorubio77 en Miércoles 21 de Octubre de 2009, 12:28

Título: no consigo entender este error, por favor
Publicado por: pacorubio77 en Miércoles 21 de Octubre de 2009, 12:28
Hola, estoy programando el operador salida de un programa, pero no se como expresar una parte, y es por una causa, porque no entiendo bien el parametro de entrada.

Por ese motivo os haré una serie de preguntas.

&po->nos indica la direccion de memoria del objeto, no?
si yo tengo un metodo declarado en la parte publica que se llama EsVacio, que devuelve un bool si el objeto está vacio, me pueden decir porque me da error esto? y sobre todo como lo tengo que expresar, pero no decirme la solucion y ya está..sino que quiero entender el porqué...

Agradeceria ayuda, este es el código de mi funcion.(hay más código pero ahi está el fallo, en que no se como expresar para saber si el objeto está vacio...



Citar
ostream &operator<<(ostream &os,const TPoro &po){

   
   if(po.EsVacio()==true){
      os<<"()"<<endl;
   }   
Título: Re: no consigo entender este error, por favor
Publicado por: Eternal Idol en Miércoles 21 de Octubre de 2009, 12:51
¿Cual es el error exacto? Cuanto mas informacion (como una minima expresion compilable del codigo) des mas posibilidades habra de que te ayudemos.
Título: Re: no consigo entender este error, por favor
Publicado por: r0d en Miércoles 21 de Octubre de 2009, 12:52
Hola,

Cita de: "pacorubio77"
&po->nos indica la direccion de memoria del objeto, no?
Eso es. Eso se llama un parametro por referencia. Para empezar, puedes considerar que es igual que un puntero (pero veras que no es exactamente igual).

Cita de: "pacorubio77"
si yo tengo un metodo declarado en la parte publica que se llama EsVacio, que devuelve un bool si el objeto está vacio, me pueden decir porque me da error esto? y sobre todo como lo tengo que expresar, pero no decirme la solucion y ya está..sino que quiero entender el porqué...
Tienes que hacer el metodo const:
Código: C++
  1. bool TPoro::EsVacio() const
  2. {
  3. //...
  4. }
  5.  
Esta palabra clave const, aplicada a un metodo, significa que este metodo puede ser llamado a partir de un objeto constante. Y mira en tu operador, el objeto de tipo TPoro es pasado por referencia constante, asi que podras solo llamar a sus metodos constantes.

Hoep it helps.
Título: Re: no consigo entender este error, por favor
Publicado por: pacorubio77 en Miércoles 21 de Octubre de 2009, 13:34
Ok , lo he entendido, como el parametro le estamos pasando una referencia constante, y declarando el metodo como constante lo que hacemos es que el objeto utilizado no modificará ninguna de sus propiedades.

Una ultima cuestion

yo para probar mi programa mi estoy haciendo mi propio main, es decir yo tengo un constructor por defecto que le meto estos parametros

TPoro (int, int, double, char *);

y yo en mi main, pongo para hacerme un ejemplo

TPoro c1(5,6,20,3,"red");

pero como le meto yo en el cuarto parámetro NULL, si se lo meto asi directamente me da error, como le tengo que meter NULL, eso es para hacer comprobaciones.

Error de compilacion no me daria, pero seria correcto meterle el parametro asi?, lo digo porque luego me da fallo de segmentacion.



Espero respuesta.
Gracias.
Título: Re: no consigo entender este error, por favor
Publicado por: r0d en Miércoles 21 de Octubre de 2009, 14:03
lo siento, no entiendo tu pregunta  :(
Título: Re: no consigo entender este error, por favor
Publicado por: Eternal Idol en Miércoles 21 de Octubre de 2009, 14:53
Si en el constructor estas haciendo simplemente una asignacion a un puntero a char entonces esta claro, tendras un puntero nulo y si lo desreferencias dara una excepcion ... podes pasale una cadena vacia "" en lugar de NULL ... o tener un buffer estatico ... hay varias formas de solucionarlo digamos.
Título: Re: no consigo entender este error, por favor
Publicado por: pacorubio77 en Miércoles 21 de Octubre de 2009, 17:08
Cita de: "Eternal Idol"
Si en el constructor estas haciendo simplemente una asignacion a un puntero a char entonces esta claro, tendras un puntero nulo y si lo desreferencias dara una excepcion ... podes pasale una cadena vacia "" en lugar de NULL ... o tener un buffer estatico ... hay varias formas de solucionarlo digamos.

Hola, no consigo entender lo que usted me dice, pero el constructor por defecto que tengo es

TPoro::TPoro(int px,int py,double vol,char *col){

   int tam=strlen(col)+1;

   x=px;
   y=py;
   volumen=vol;

   color=new char[tam];
   
   if(color !=NULL){

      strcpy(color,col);
   }
   //else{
   //   return;
   //}

}

y el constructor copia

TPoro::TPoro(const TPoro &po){

   int tam=strlen(po.color)+1;//saco el tamaño de la cadena de caracteres

   x=po.x;
   y=po.y;
   volumen=po.volumen;

   color=new char[tam];

   if(color !=NULL){
      strcpy(color,po.color);
   }
   //else{
   //   return;
   //}

}


como ven hay la ultima parte comentada en los dos metodos es que dudo cuando le meto NULL.
lo estoy haciendo bien?
Título: Re: no consigo entender este error, por favor
Publicado por: Eternal Idol en Miércoles 21 de Octubre de 2009, 17:27
Esto ya esta mal:

int tam=strlen(col)+1;

Ahi si le pasas NULL hay una excepcion como te dije, no es una cadena es un puntero nulo ...
Título: Re: no consigo entender este error, por favor
Publicado por: pacorubio77 en Miércoles 21 de Octubre de 2009, 17:52
correcto, es uno de los fallos, pero es que me sigue dando errores con la siguiente correcion, he modificado los constructores

Citar

TPoro::TPoro(int px,int py,double vol,char *col){

   int tam;


      

   x=px;
   y=py;
   volumen=vol;

   color=new char[strlen(col)+1];
   
   if(color==NULL){
      return;
   }

   //if(color !=NULL){

      strcpy(color,col);
   //}

   //else{
   //   return;
   //}

}


TPoro::TPoro(const TPoro &po){

   //int tam=strlen(po.color)+1;//saco el tamaño de la cadena de caracteres

   x=po.x;
   y=po.y;
   volumen=po.volumen;

   color=new char[strlen(po.color)+1];

   if(color ==NULL){
      return;
      //strcpy(color,po.color);
   }
      strcpy(color,po.color);
   //else{
   //   return;
   //}
}



y pasando el gdb me dice lo siguiente

Program received signal SIGSEGV, Segmentation fault.
0x08048fe1 in TPoro (this=0xbfa81a0c, px=4, py=5, vol=20.353000000000002,
    col=0x0) at lib/TPoro.cpp:41
41              color=new char[strlen(col)+1];

ese es el error que me da
Título: Re: no consigo entender este error, por favor
Publicado por: Eternal Idol en Miércoles 21 de Octubre de 2009, 17:56
col sigue siendo un puntero nulo ............................. lo primero que hara strlen es *col para ver donde termina la cadena .....
Título: Re: no consigo entender este error, por favor
Publicado por: pacorubio77 en Miércoles 21 de Octubre de 2009, 18:00
podria poner una condicion antes, es decir

if (po.color !=NULL){


}
else{

}

no?
Título: Re: no consigo entender este error, por favor
Publicado por: Eternal Idol en Miércoles 21 de Octubre de 2009, 18:31
Si, deberias hacerlo.
Título: Re: no consigo entender este error, por favor
Publicado por: r0d en Miércoles 21 de Octubre de 2009, 19:53
o utilisar la classe standard string en vez de char*