Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 16
  1. #1

    [c++]problemi con delete

    puntualmente ogni volta che uso il comando delete il compilatore mi da un messaggio di access violation ad un indirizzo strano...
    tolgo il comando delete e tutto funziona???? :master: :master:
    adesso se uso due o tre volte il mio bel programma diventa na skifezza...ora nn capisco se sn io che nn so usare sto comando oppure
    ci potrebbe essere qlke problema cn il mio sistema operativo oppure un problema di memoria ...nn riesco a capire...

    compiltaore: dev c++ 4
    sistema operativo:windows 98;
    ram:64mb;
    processore: pentium II 350 Mhz
    lo so sn la vergogna di tutti gli informatici
    cn un catorcio così nn vado lontano
    però se kiedo un altro pc a mio padre
    sarà lui a spedirmi lontano
    detto ciò chi si accontenta gode (così e così)
    vabbè adesso vado fuori tema...
    please un aiutino

  2. #2
    Utente di HTML.it L'avatar di anx721
    Registrato dal
    Apr 2003
    Messaggi
    2,352
    Sicuramente sbagli a gestire la memoria...probabilmente chiami delete su riferimenti gia deallocati...prova a postare un framento di codice, possibilmente indipendente da altro codice, che ti da il problema, che ci diamo uno sguardo...

    PS: io fino a un anno fa stavo con un pentium 200 :rollo:


  3. #3
    codice:
    /* dichiarazione delle funzione membro merge */
    void lista::merge(lista *pLista1, lista *pLista2)
    {
     lista *unione;
    
     unione=new lista;
     if ((pLista1)&&(pLista2))
        {
         if (pLista1->valore<pLista2->valore)
            unione->succ=pLista1;
         else
             unione->succ=pLista2;
         }
      else if (!pLista1)
            while (pLista2)
            unione->succ=pLista2;
      else
          while (pLista1)
          unione->succ=pLista1;
       while ((pLista1)&&(pLista2))
                    {
                     delete pLista1;
                     delete pLista2;
                    }
              if (pLista1)
                 delete pLista1;
              else
                  delete pLista2;
    };
    naturalmente vanno inseriti gli elementi...
    il programma parte ma nel momento in cui scelgo attraverso uno switch questa funzione mi da l'errore e questa è l'unica in cui uso il delete...ho provato anche su altri programmi:tolto il delete tutto funziona a meraviglia!!!

  4. #4
    Utente di HTML.it L'avatar di anx721
    Registrato dal
    Apr 2003
    Messaggi
    2,352
    Originariamente inviato da anx721
    prova a postare un framento di codice, possibilmente indipendente da altro codice



    Comuqnue quella funzione non ha solo il problema del delete...

    Innanzitutto dichiari una funzione void che non ritorna nulla, ti calcoli il merge (almenno queste sono le tue intenzioni...) in una lista unione di cui poi non te ne fai nulla... Se non ritorni niente il risultato deve essere memoriazzato o in una variabile globale o in uno degli argomenti... Io costruirei una nuova lista e la ritornerei come risultato; inoltre il metodo lo dichiarerei static se deve prendere 2 liste e restituire una nuova lista.


    Poi sbagli ad appendere una lista:

    while (pLista2)
    unione->succ=pLista2;

    qui non fai altro che continuare ad assegnare a unione -> succ pLista2..all'infinito...basta eseguire l'operazione una sola volta per concatenare pLista2 ad unione !


    Inoltre unione non deve essere creato, perche gli elementi da inserire in unione gia esistono e sono quelli delle due liste iniziali.

    Infine non devi chiamare il delete perche gli elementi delle liste non devono essere distrutti, devono semplicemente essere fusi insieme, concatenandoli opportunamente nella nuova lista...


  5. #5
    si..hai ragione, l'ho fatto teri notte e mi sn sfuggite parecchie cose...cmq anche se l'ho modificato il problema persiste...ho tolto i delete e nn mi da + l'errore "access violation"...adesso addirittura mi da un errore di operazione nn valida solo perchè faccio
    cout << pLista1->valore;
    :master:

  6. #6
    Utente di HTML.it L'avatar di anx721
    Registrato dal
    Apr 2003
    Messaggi
    2,352
    se non posti il codice non ti si puo rispondere; e inserisci anche la definizione della classe o del tipo lista.

  7. #7
    codice:
    class lista {
                 private :
                         lista *succ;
                         int valore;
                 public:
                         lista(void); // costruttore
                         ~lista(void); // distruttore
                        void crea(lista *pLista, int numero);
                        void inserimento (lista *pLista);
                        void elimina(lista *pLista);
                        void stampa(lista *pLista);
                        void merge(lista *pLista1, lista *pLista2);
                  };
    void lista::merge(lista *pLista1, lista *pLista2)
    {
    
     lista *unione,*temp1,*temp2;
    
     temp1=pLista1;
     temp2=pLista2;
     while ((temp1)&&(temp2))
           {
           
            if ((temp2->valore)>(temp1->valore))
               {
                unione=temp1;
                
                temp1=temp1->succ;
                
    
               }
             else
                 {
                 
                  unione=temp2;
                  temp2=temp2->succ;
                 }
              }
      if (!temp1)
         {
         while (temp2)
               {
                unione=temp2;
                temp2=temp2->succ;
               }
          }
       else
       {
        while (temp1)
                {
                 unione=temp1;
                 temp1=temp1->succ;
                }
        }
    };

  8. #8
    mi sto esaurendo ogni vota che tento di accedere ad una variabile membro rincoglionisce il compilatore....scusate il termine ma nn è normale stare trent'anni sullo stesso problema...

    se tento di inserire all'interno del codice prima postato

    cout << temp1->valore;

    mi da errore

    se provo a mettere a confronto temp1->valore<temp2->valore
    mi da errore uffaaaaaa...

  9. #9
    taglio la testa al toro (poverino posto tutto il codice così potete farlo partire...

    il programma parte ma se accedo alla funzione merge impazzisce...boh???

    codice:
    #include <iostream.h>
    #include <stdlib.h>
    
    class lista {
    
                         lista *succ;
                         int valore;
                 public:
                         lista(void); // costruttore
                         ~lista(void); // distruttore
                        void crea(lista *pLista, int numero);
                        void inserimento (lista *pLista);
                        void elimina(lista *pLista);
                        void stampa(lista *pLista);
                        void merge(lista *pLista1, lista *pLista2);
                  };
    /*Dichiarazione funzione leggi*/
    int Leggi(void)
    {
     int numero;
     cout << "numero :  " ;
     cin >> numero;
     return numero;
    };
    
    /* controlla se si tratta del primo elemento */
    bool ListaVuota(lista *pLista)
    {
     return pLista==NULL;
    };
    
    /* Dichiarazione costruttore */
    lista::lista(void)
    {
     succ=NULL;
    };
    
    /* Dichiarazione distruttore */
    
    lista::~lista(void)
    {
     succ=NULL;
    };
    
    /* Dichiarazione della funzione membro crea */
    void lista::crea(lista *pLista, int numero)
    {
     pLista=new lista;
     while (numero=Leggi())
           {
            pLista->valore=numero;
            pLista->succ=NULL;
           }
    
    };
    
    /* Dichiarazione della funzone membro inserimento */
    void lista::inserimento (lista *pLista)
    {
    int numero;
     lista *nuovo, *temp,*prec;
    
     crea(nuovo,numero);
     if (&ListaVuota)
          pLista=nuovo;
     else
         {
          temp=pLista;
     while ((temp != NULL)&&(nuovo->valore > temp->valore))
           {
            prec=temp;
            temp=temp->succ;
           }
     nuovo->succ=temp;
     prec->succ=nuovo;
         }
    };
    
    /* Dichiarazione della funzione elimina */
    void lista:: elimina(lista *pLista)
    {
     lista *temp, *prec;
     int dato;
     bool trovato;
    
     cout << "Inserire il dato da cancellare: ";
     cin >> dato;
     if (&ListaVuota)
      cout << "Errore: la lista è vuota!!!" << endl << endl;
     else
         {
          trovato=false;
          prec=NULL;
          temp=pLista;
          if (pLista->valore=dato)
             {
              pLista=pLista->succ;
              delete temp;
              trovato=true;
              }
           else
               while ((!trovato)&&(temp!=NULL))
                     {
                      if (temp->valore=dato)
                         {
                          trovato=true;
                          prec->succ=temp->succ;
                          delete temp;
                         }
                       else
                           {
                            prec=temp;
                            temp=temp->succ;
                           }
                       if (!trovato)
                          cout << "Il dato richiesto non esiste!" << endl << endl;
                      }
             }
    };
    
    /* dichiarazione della funzione membro stampa */
    void lista::stampa(lista *pLista)
    {
      lista *temp;
      cout << " ---------- ELENCO COMPLETO ---------- " << endl << endl;
      temp=pLista;
      while (temp!=NULL)
            {
             cout << temp->valore;
             temp=temp->succ;
            }
    cout << " ------------------------------------- " << endl << endl;
    };
    
    /* dichiarazione delle funzione membro merge */
    void lista::merge(lista *pLista1, lista *pLista2)
    {
    
     lista *unione,*temp1,*temp2;
    
     temp1=pLista1;
     temp2=temp1->succ;
     cout <<"a"<<endl;
     while ((temp1)&&(temp2))
           {
    
            if ((&temp2->valore)>(&temp1->valore))
               {
               unione=temp1;
               cout << "d" <<endl;
               temp1=temp1->succ;
               cout << "e"<<endl;
    
               }
             else
                 {
                 cout <<"c" <<endl;
                  unione=temp2;
                  temp2=temp2->succ;
                 }
              }
      if (!temp1)
         {
         while (temp2)
               {
                unione=temp2;
                temp2=temp2->succ;
               }
          }
       else
       {
        while (temp1)
                {
                 unione=temp1;
                 temp1=temp1->succ;
                }
        }
    };
    
    int main()
    {
     lista *primo,*secondo,*unione;
     bool finito=false;
     int scelta;
    
    cout << " Implementa gli elementi della prima lista " << endl
         << " 0 per terminare: " << endl << endl;
    primo->inserimento(primo);
    system("CLS");
    cout <<" Implementa gli elementi della seconda lista " << endl
         << " 0 per terminare: " << endl << endl;
    secondo->inserimento(secondo);
    system ("CLS");
    cout  << "1- Inserimento" << endl
          << "2- Cancellazione" << endl
          << "3- Fusione" << endl
          << "4- Fine" << endl << endl
          << "Scelta: ";
     cin >> scelta;
    
      switch (scelta)
        {
         case 1:
              /*merge*/
              unione->merge(primo,secondo);
              unione->inserimento(unione);
              break;
         case 2:
              unione->merge(primo,secondo);
              unione->elimina(unione);
              break;
         case 3:
              unione->merge(primo,secondo);
              unione->stampa(unione);
              break;
          case 4:
               exit(8);
         }
    
          system("PAUSE");
          return 0;
    }

  10. #10
    Utente di HTML.it L'avatar di anx721
    Registrato dal
    Apr 2003
    Messaggi
    2,352
    ma tali accessi li fai all'interno di una fuznione della classe? Questi menbri sono privati.

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 © 2024 vBulletin Solutions, Inc. All rights reserved.