• Martes 12 de Noviembre de 2024, 21:27

Autor Tema:  no consigo entender este error, por favor  (Leído 2199 veces)

pacorubio77

  • Miembro MUY activo
  • ***
  • Mensajes: 207
    • Ver Perfil
no consigo entender este error, por favor
« en: Miércoles 21 de Octubre de 2009, 12:28 »
0
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;
   }   

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: no consigo entender este error, por favor
« Respuesta #1 en: Miércoles 21 de Octubre de 2009, 12:51 »
0
¿Cual es el error exacto? Cuanto mas informacion (como una minima expresion compilable del codigo) des mas posibilidades habra de que te ayudemos.

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

r0d

  • Miembro activo
  • **
  • Mensajes: 37
  • Nacionalidad: fr
    • Ver Perfil
    • http://r0d.developpez.com/index-es.php
Re: no consigo entender este error, por favor
« Respuesta #2 en: Miércoles 21 de Octubre de 2009, 12:52 »
0
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.

pacorubio77

  • Miembro MUY activo
  • ***
  • Mensajes: 207
    • Ver Perfil
Re: no consigo entender este error, por favor
« Respuesta #3 en: Miércoles 21 de Octubre de 2009, 13:34 »
0
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.

r0d

  • Miembro activo
  • **
  • Mensajes: 37
  • Nacionalidad: fr
    • Ver Perfil
    • http://r0d.developpez.com/index-es.php
Re: no consigo entender este error, por favor
« Respuesta #4 en: Miércoles 21 de Octubre de 2009, 14:03 »
0
lo siento, no entiendo tu pregunta  :(

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: no consigo entender este error, por favor
« Respuesta #5 en: Miércoles 21 de Octubre de 2009, 14:53 »
0
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.

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

pacorubio77

  • Miembro MUY activo
  • ***
  • Mensajes: 207
    • Ver Perfil
Re: no consigo entender este error, por favor
« Respuesta #6 en: Miércoles 21 de Octubre de 2009, 17:08 »
0
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?

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: no consigo entender este error, por favor
« Respuesta #7 en: Miércoles 21 de Octubre de 2009, 17:27 »
0
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 ...

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

pacorubio77

  • Miembro MUY activo
  • ***
  • Mensajes: 207
    • Ver Perfil
Re: no consigo entender este error, por favor
« Respuesta #8 en: Miércoles 21 de Octubre de 2009, 17:52 »
0
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

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: no consigo entender este error, por favor
« Respuesta #9 en: Miércoles 21 de Octubre de 2009, 17:56 »
0
col sigue siendo un puntero nulo ............................. lo primero que hara strlen es *col para ver donde termina la cadena .....

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

pacorubio77

  • Miembro MUY activo
  • ***
  • Mensajes: 207
    • Ver Perfil
Re: no consigo entender este error, por favor
« Respuesta #10 en: Miércoles 21 de Octubre de 2009, 18:00 »
0
podria poner una condicion antes, es decir

if (po.color !=NULL){


}
else{

}

no?

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: no consigo entender este error, por favor
« Respuesta #11 en: Miércoles 21 de Octubre de 2009, 18:31 »
0
Si, deberias hacerlo.

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

r0d

  • Miembro activo
  • **
  • Mensajes: 37
  • Nacionalidad: fr
    • Ver Perfil
    • http://r0d.developpez.com/index-es.php
Re: no consigo entender este error, por favor
« Respuesta #12 en: Miércoles 21 de Octubre de 2009, 19:53 »
0
o utilisar la classe standard string en vez de char*