Visualizzazione dei risultati da 1 a 4 su 4
  1. #1

    [C++]RubricaTelefonica mediante lista

    Salve a tutti, mi sto esercitando per un esame all'università, e stavo cercando di implementare una rubrica telefonica mediante lista.

    Ecco i file

    Nominativo.h

    codice:
    #ifndef _NOMINATIVO_H_
    #define _NOMINATIVO_H_
    
    class Nominativo
    {
          protected:
                    char* nome;
                    char* cognome;
                    char* numeroTelefono;
                    Nominativo* successivo;
          public:
                 /* COSTRUTTORI */
                 Nominativo();                      // default
                 ~Nominativo();                     // distruttore
                 
                 /* Metodi di Set proprietà */
                 void setNome(char*);
                 void setCognome(char*);
                 void setNumeroTelefono(char*);
                 void setSuccessivo(Nominativo*);
                 
                 /* Metodi di Get proprietà */
                 char* getNome(void);
                 char* getCognome(void);
                 char* getNumeroTelefono(void);
                 Nominativo* getSuccessivo(void);
                 
    };
    #endif

    Nominativo.cpp

    codice:
    #include <iostream>
    #include "Nominativo.h"
    
    Nominativo::Nominativo()
    {
    }
    
    Nominativo::~Nominativo()
    {
        delete nome;
        delete cognome;
        delete numeroTelefono;
        delete successivo;
    }
    
    void Nominativo::setNome(char* pNome)
    {
        nome = pNome;
    }
    
    void Nominativo::setCognome(char* pCognome)
    {
        cognome = pCognome;
    }
    
    void Nominativo::setNumeroTelefono(char* pNumeroTelefono)
    {
        numeroTelefono = pNumeroTelefono;
    }
    
    void Nominativo::setSuccessivo(Nominativo* pSuccessivo)
    {
        successivo = pSuccessivo;
    }
    
    char* Nominativo::getNome(void)
    {
        if(nome != NULL)
            return nome;
    }
    
    char* Nominativo::getCognome(void)
    {
        if(cognome != NULL)
            return cognome;
    }
    
    char* Nominativo::getNumeroTelefono(void)
    {
        if(numeroTelefono != NULL)
            return numeroTelefono;
    }
    
    Nominativo* Nominativo::getSuccessivo(void)
    {
        return successivo;
    }
    RubricaTelefonica.h

    codice:
    #ifndef _RUBRICATELEFONICA_H_
    #define _RUBRICATELEFONICA_H_
    #include "Nominativo.h"
    
    class RubricaTelefonica
    {
          public:
                 /* COSTRUTTORI */
                 RubricaTelefonica();                       // default
                 //RubricaTelefonica(RubricaTelefonica&);   // copia
                 ~RubricaTelefonica();                      // distruttore
                 
                 /* PROPRIETA' */
                 Nominativo* primoNominativo;               // il puntatore al primo elemento della rubrica
                 Nominativo* ultimoNominativo;              // il puntatore all'ultimo elemento della rubrica
                 
                 /* METODI */
                 void Aggiungi_Nominativo(Nominativo);      // aggiunge un nuovo nominativo alla rubrica
                 
                 void StampaaVideo(void);
    };
    
    #endif
    RubricaTelefonica.cpp

    codice:
    #include <iostream>
    #include "RubricaTelefonica.h"
    using namespace std;
    
    /* Default */
    RubricaTelefonica::RubricaTelefonica()
    {
        primoNominativo = NULL;
        ultimoNominativo = NULL;
    }
    
    /* Distruttore */
    RubricaTelefonica::~RubricaTelefonica()
    {
        delete primoNominativo;
        delete ultimoNominativo;
    }
    
    void RubricaTelefonica::Aggiungi_Nominativo(Nominativo nuovoNominativo)
    {
         Nominativo* nuovoNodo = new Nominativo;
         
         nuovoNodo->setNome(nuovoNominativo.getNome());
         nuovoNodo->setCognome(nuovoNominativo.getCognome());
         nuovoNodo->setNumeroTelefono(nuovoNominativo.getNumeroTelefono());
         nuovoNodo->setSuccessivo(primoNominativo); 
         
         primoNominativo = nuovoNodo;
    }
    
    void RubricaTelefonica::StampaaVideo(void)
    {
        Nominativo* Nodo = primoNominativo;
        
        while(Nodo != NULL){
            cout << "COGNOME: " << Nodo->getCognome() << endl;
            cout << "NOME: " << Nodo->getNome() << endl;
            cout << "TELEFONO: " << Nodo->getNumeroTelefono() << endl;
            cout << endl;
        }
    }

    Usando il seguendo main

    codice:
    #include <iostream>
    #include "RubricaTelefonica.h"
    
    using namespace std;
    
    int main(int argc, char *argv[])
    {   
        Nominativo Persona;
        RubricaTelefonica* Rubrika = new RubricaTelefonica;
    
        Persona.setCognome("Baudo");
        Persona.setNome("Giuseppe");
        Persona.setNumeroTelefono("3331234567");
    
        Rubrika->Aggiungi_Nominativo(Persona);
        Rubrika->StampaaVideo();
    
        system("PAUSE");
        return EXIT_SUCCESS;
    }
    quando faccio Compila&Esegui, la schermata appare ed immediatamente scompare, e facendo man mano le opportune cancellazioni ho capito che il problema è legato a

    codice:
    Rubrika->Aggiungi_Nominativo(Persona);
    Qualcuno sa spiegarmi come mai? cosa c'è di sbagliato in questo metodo?
    Valentino a.k.a. Arpyone

    LAUREA? work in progress!

  2. #2
    Ragazzi faccio retrofront, dopo un attenta analisi e diverse prove (ho cancellato riga per riga per vedè quale mi deve il problema) ho visto che il codice buggato del main è

    Codice PHP:
    Persona.setNome("Giuseppe"); 
    Ma perché? Che problema c'è in quel metodo?
    Valentino a.k.a. Arpyone

    LAUREA? work in progress!

  3. #3
    Originariamente inviato da Arpyone
    Ragazzi faccio retrofront, dopo un attenta analisi e diverse prove (ho cancellato riga per riga per vedè quale mi deve il problema) ho visto che il codice buggato del main è

    Codice PHP:
    Persona.setNome("Giuseppe"); 
    Ma perché? Che problema c'è in quel metodo?
    ho modificato il metodo in questo modo

    Codice PHP:
    void Nominativo::setNome(charpNome)
    {
        
    nome = new char[sizeof(pNome)+1];
        
    strcpy(nomepNome);

    ed ora il problema me lo da sulla chiamata al metodo AggiungiNominativo di RubricaTelefonica
    Valentino a.k.a. Arpyone

    LAUREA? work in progress!

  4. #4
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Originariamente inviato da Arpyone
    ho modificato il metodo in questo modo
    ...
    sizeof(pNome) ti restituirà la dimensione del tipo di dato pNome. Dato che pNome è un puntatore a 32 bit, a prescindere dalla lunghezza della stringa puntata, avrai sempre 4 come risultato. Copiando un nome di più di 4 caratteri avrai un buffer overflow (con risultati imprevedibili, nella migliore delle ipotesi, un crash).

    Per ottenere la lunghezza della stringa, devi usare la funzione strlen ... sarà quindi

    codice:
    void Nominativo::setNome(char* pNome)
    {
        nome = new char[strlen(pNome)+1];
        strcpy(nome, pNome);
    }
    No MP tecnici (non rispondo nemmeno!), usa il forum.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.