El último post el que esta abajo. ->

Iniciado por anonimo12121, 12 Marzo 2011, 00:51 AM

0 Miembros y 1 Visitante están viendo este tema.

anonimo12121

al introducir nombre se me cierra el programa y no lo entiendo.


#include <iostream>
using namespace std;
class base {
   private:
       char *nombre;
       char *tlf;
   public:
       base();
       void delname();
       void deltlf();
       void dnuevo();
       void view();
};
base::base(){
   nombre="\0";
   tlf="\0";
};
void base::delname(){
   
};
void base::deltlf(){
   
};
void base::dnuevo(){
   cout << "\nIntroduce un nombre: " ;
   cin >> nombre;
   cout << "\nIntroduce un telefono: ";
   cin >> tlf;
};
void base::view(){
   cout << "---------------------------------------------------------" << endl;
   cout << "Nombre: " << nombre << endl;
   cout << "Tlfn: " << tlf << endl;
   cout << "---------------------------------------------------------" << endl;
   cout << "1-Nuevo\t2-Eliminar 3-Salir" << endl;
};

int main(int argc,char *argv[]){
   base b[10];
   int pag=0;
   int evento=0;
   int pagmax=0;
   while(1){
       b[pag].view();
       cout << "Opcion: ";
       cin >> evento;
       if(evento==1){
           pagmax=pagmax+1;
           b[pagmax].dnuevo();
       }
       else if(evento==2);
       else if(evento==3)break;
       evento=0;
   }
   cin.get();
   return 0;
}
Página para ganar Bitcoins y Dinero: http://earnbit.hol.es/
Video de YouTube con Hack para el LoL: http://adf.ly/5033746/youtube-lolemuhack
Si quieres ganar dinero con adfly entra y registrate aquí -> http://adf.ly/?id=5033746

Akai

Seguramente te esté dando una violación de segmento por lo siguiente:
Código (cpp) [Seleccionar]
       
char *nombre;
char *tlf


constructor:
Código (cpp) [Seleccionar]

nombre="\0";
tlf="\0";


No les das tamaño.

anonimo12121

Cita de: Akai en 12 Marzo 2011, 01:22 AM
Seguramente te esté dando una violación de segmento por lo siguiente:
Código (cpp) [Seleccionar]
       
char *nombre;
char *tlf


constructor:
Código (cpp) [Seleccionar]

nombre="\0";
tlf="\0";


No les das tamaño.
Por favor akai dime que se supone que debo de poner.
Página para ganar Bitcoins y Dinero: http://earnbit.hol.es/
Video de YouTube con Hack para el LoL: http://adf.ly/5033746/youtube-lolemuhack
Si quieres ganar dinero con adfly entra y registrate aquí -> http://adf.ly/?id=5033746

Akai

o bien declaras nombre y tlf como

Código (cpp) [Seleccionar]

char nombre[20]
char tlf[10]


o algo así, y en el constructor no haces nada, o bien, dejas la declaración como puntero y en el constructor haces lo siguiente:
Código (cpp) [Seleccionar]

nombre=new char[20] //o tu tamaño
tlf=new char[10]//o tu tamaño


En principio, si luego vas a leer una cadena, no necesitas asignarles el \0.

Por otro lado, en C++, a menos que trabajes con la clase string, que no es lo mismo que trabajar con char[] o char* no puedes hacer que nombre="\0" o tlf="\0". Sino que has de asignar caracter a caracter o copiar con funciones. Además, la cadena vacía es "" no "\0".

anonimo12121

#4
ok gracias.

EDITO: Para no crear un post tonto...
Díganme si el uso que le he dado a un puntero que apunta a una clase en la función bubble está bien hecho o no se debería de hacer así por favor.
Código (cpp) [Seleccionar]

#include <iostream>
using namespace std;
class base {
    private:
        bool rellena;//0 no tiene contenido . 1 tiene contenido
        char *nombre;
        char *tlf;
    public:
        base();
        void del();
        void dnuevo();
        void editar();
        void view(int n);
        void freeram();
};
base::base(){
    rellena = false;
    nombre = new char[20];
    tlf = new char[20];
};
void base::del(){
};
void base::dnuevo(){
    cout << "\nIntroduce un nombre: " ;
    cin >> nombre;
    cout << "\nIntroduce un telefono: ";
    cin >> tlf;
    rellena=true;
};
void base::freeram(){
    delete[] nombre;
    delete[] tlf;
};
void base::editar(){
    dnuevo();
};
void base::view(int n){
    cout << "---------------------------------------------------------" << endl;
    cout << "Nombre: ";
    if(rellena==true)cout << nombre;
    cout << endl;
    cout << "Tlfn: ";
    if(rellena==true)cout << tlf ;
    cout << endl;
    cout << "---------------------------------------------------------" << endl;
    cout << "1-Nuevo\t2-Eliminar 3-Salir 4-Editar 8-Pagback 9-Pagnext\t Pag: " << n << endl;
};
void bubble(int n1,int n2,base b[]){
    base *p;
    for(int i=n1;i<n2;i++){
        p=&b[i+1];
        b[i]=*p;
    }
};
   
int main(int argc,char *argv[]){
    base b[10];
    int pag=1;
    int evento=0;
    int pagmax=0;
    while(1){
        b[pag].view(pag);
        cout << "Opcion: ";
        cin >> evento;
        if(evento==1){
            pagmax=pagmax+1;
            pag=pagmax;
            b[pag].dnuevo();
        }
        else if(evento==2){
            if(pag!=1){
                bubble(pag,pagmax,b);
                pagmax--;
            }
        }
        else if(evento==3)break;
        else if(evento==4)b[pag].editar();
        else if(evento==8 && pag>1)pag--;
        else if(evento==9 && pag < pagmax)pag++;
        evento=0;
        cout << "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n" ;
    }
    for(int i=0;i<10;i++)b[i].freeram();
    cout << "El programa se cerrara" << endl;
    cin.get();
    return 0;
}


Saludos
Página para ganar Bitcoins y Dinero: http://earnbit.hol.es/
Video de YouTube con Hack para el LoL: http://adf.ly/5033746/youtube-lolemuhack
Si quieres ganar dinero con adfly entra y registrate aquí -> http://adf.ly/?id=5033746

satu

Hola

Para lo que quieres hacer debes sobrecargar el operador =

Código (cpp) [Seleccionar]

base operator = (const base &b);


Código (cpp) [Seleccionar]

base base::operator = (const base &b)
{
    rellena = b.rellena;
    strcpy(nombre, b.nombre);
    strcpy(tlf, b.tlf);
}


De esta forma en la función bubble te quedaría

Código (cpp) [Seleccionar]

void bubble(int n1,int n2,base b[]){
    for(int i=n1;i<n2;i++)
        b[i]=b[i+1];
}


Saludos
Breakbeat como forma de vida

anonimo12121

Cita de: satu en 12 Marzo 2011, 18:20 PM
Hola

Para lo que quieres hacer debes sobrecargar el operador =

Código (cpp) [Seleccionar]

base operator = (const base &b);


Código (cpp) [Seleccionar]

base base::operator = (const base &b)
{
    rellena = b.rellena;
    strcpy(nombre, b.nombre);
    strcpy(tlf, b.tlf);
}


De esta forma en la función bubble te quedaría

Código (cpp) [Seleccionar]

void bubble(int n1,int n2,base b[]){
    for(int i=n1;i<n2;i++)
        b[i]=b[i+1];
}


Saludos
y a que se debe que me de buen resultado?
Página para ganar Bitcoins y Dinero: http://earnbit.hol.es/
Video de YouTube con Hack para el LoL: http://adf.ly/5033746/youtube-lolemuhack
Si quieres ganar dinero con adfly entra y registrate aquí -> http://adf.ly/?id=5033746

satu

Hola

Pues se debe a que le estás diciendo al compilador cómo asignar los objetos de esa clase. Date cuenta que cuando asignas enteros el compilador sabe qué tiene que hacer, pero cuando se encuentra con objetos de la clase "base" o de cualquier clase tienes que decírselo tú.

Saludos
Breakbeat como forma de vida

anonimo12121

Ose lo que debo de hacer es darle a cada miembro su valor uno a uno.
Esque pensaba que lo que hacia al hacerlo con la clase directa lo hacia todo.
Página para ganar Bitcoins y Dinero: http://earnbit.hol.es/
Video de YouTube con Hack para el LoL: http://adf.ly/5033746/youtube-lolemuhack
Si quieres ganar dinero con adfly entra y registrate aquí -> http://adf.ly/?id=5033746

satu

Eso es lo primero que se piensa por la costumbre de la asignación de enteros y otros tipos simples pero con objetos "no funciona" porque no sabes qué va a hacer el compilador.

El problema de la forma en que tú lo has hecho es que no has reservado memoria para p entonces te peta, aparte de que el operador = no lo has definido.

Lee sobre la sobrecarga de operadores porque es muy útil, entre otras cosas para ordenar los elementos o compararlos con <, >, ==, != o imprimir con cout, etc

Saludos
Breakbeat como forma de vida