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

    [C++] Shadow of a parameter

    Salve a tutti,
    ho bisogno di una funzione che mi permetta di allargare il mio array dinamico e di aggiungere un ulteriore elemento. La mia idea era quella di traferire il contenuto dell'array vecchio in uno temporaneo, allocare l'array con le nuove dimensioni e ricopiare gli elementi. Sfortunatamente quando vado a dichiarare nuovamente l'array puntato da s, il compilatore mi restituisce un errore dicendo che il nuovo valore copre il vecchio... il che è impossibile se l'array vecchio è stato opportunamente deallocato. Come posso risolvere? Di seguito c'è il codice. Grazie anticipatamente per l'aiuto.

    codice:
    //la funzione prende in ingresso un puntatore ad array allocato dinamicamente,
    // una variabile x che indica le dimensioni dell'array e una variabile obj.
    void myFunction (myType* s, int &x,  myType obj) {
    
    //allocazione di un array temporaneo per copia degli elementi di s;
    myType* a = new myType[x];
    //copia degli elementi di s;
        for (int i = 0; i < x; i++) {
             *(a+i) = *(s+i);
         }
    //deallocazione dell'array puntato da s ed il puntatore non punta più ad alcun array.
      delete []s; s = NULL;
    //nuova allocazione di s: il compilatore mi dice che questa istruzione copre
    //la variabile dichiarata all'interno degli argomenti della funzione.
    //('declaration of 'myType* s' shadows a parameter.')
      myType* s = new myType[x+1];
         for (int i = 0; i < x; i++) {
            *(s+i) = *(a+i);
    
         }
         *(s+x+1) = obj;
         dim++;
    }

  2. #2

    Re: [C++] Shadow of a parameter

    Originariamente inviato da haunted
    Salve a tutti,
    ho bisogno di una funzione che mi permetta di allargare il mio array dinamico e di aggiungere un ulteriore elemento. La mia idea era quella di traferire il contenuto dell'array vecchio in uno temporaneo, allocare l'array con le nuove dimensioni e ricopiare gli elementi. Sfortunatamente quando vado a dichiarare nuovamente l'array puntato da s, il compilatore mi restituisce un errore dicendo che il nuovo valore copre il vecchio... il che è impossibile se l'array vecchio è stato opportunamente deallocato. Come posso risolvere? Di seguito c'è il codice. Grazie anticipatamente per l'aiuto.

    codice:
    //la funzione prende in ingresso un puntatore ad array allocato dinamicamente,
    // una variabile x che indica le dimensioni dell'array e una variabile obj.
    void myFunction (myType* s, int &x,  myType obj) {
    
    //allocazione di un array temporaneo per copia degli elementi di s;
    myType* a = new myType[x];
    //copia degli elementi di s;
        for (int i = 0; i < x; i++) {
             *(a+i) = *(s+i);
         }
    //deallocazione dell'array puntato da s ed il puntatore non punta più ad alcun array.
      delete []s; s = NULL;
    //nuova allocazione di s: il compilatore mi dice che questa istruzione copre
    //la variabile dichiarata all'interno degli argomenti della funzione.
    //('declaration of 'myType* s' shadows a parameter.')
      myType* s = new myType[x+1];
         for (int i = 0; i < x; i++) {
            *(s+i) = *(a+i);
    
         }
         *(s+x+1) = obj;
         dim++;
    }
    Beh si la copre perchè la stai anche ridichiarando oltre a riallocarla, prova così: s = new myType[x+1]; incece che così myType* s = new myType[x+1];
    Il centro dell'attenzione non è sempre un buon posto in cui trovarsi

    Mai discutere con uno stupido, la gente potrebbe non capire la differenza. (O. W.)

  3. #3

    [C++] Tutto bene...

    Perfetto!!! Grazie!!

  4. #4

    Re: [C++] Tutto bene...

    Originariamente inviato da haunted
    Perfetto!!! Grazie!!
    Funziona solo nel senso che non ti da più l'errore o il codice fa anche il suo dovere (estendere l'array)?
    Il centro dell'attenzione non è sempre un buon posto in cui trovarsi

    Mai discutere con uno stupido, la gente potrebbe non capire la differenza. (O. W.)

  5. #5

    [C++] Bug e funzioni

    La dimensione viene estesa correttamente! Ora devo passare a correggere un altro bug!! :P

  6. #6

    Re: [C++] Bug e funzioni

    Originariamente inviato da haunted
    La dimensione viene estesa correttamente! Ora devo passare a correggere un altro bug!! :P
    Ok
    Il centro dell'attenzione non è sempre un buon posto in cui trovarsi

    Mai discutere con uno stupido, la gente potrebbe non capire la differenza. (O. W.)

  7. #7
    premessa: non vedendo il codice che richiama la tua funzione ho scritto un ipotetica implementazione:
    codice:
    int main()
    {
        myType *a = new myType[10];
        cout << "Riallocazione..." << endl;
        myType obj1;
        myFunction(a,10,obj1);
        return 0;
    }
    Io con il tuo codice ho un problema: quando il programma fa il delete di s la corrispondenza: indirizzo di s == indirizzo di a viene persa, quindi se tento di fare operazioni su a mi ritrovo un pointer NULL...

    io farei così:
    codice:
    #include <iostream>
    
    using namespace std;
    
    typedef struct _mytype{
            int a;
            int b; 
            _mytype()
            {
                     a = 3;
                     b  = 5;
            }
            
            void stampa()
            {
                 cout << a << ";" << b << endl;
            } 
    } myType;
    
    void* realloca(myType *s, const int x, myType &obj);
    
    int main()
    {
        myType *a = new myType[10];
        for(int k = 0; k < 10; k++)
        {
                a[k].stampa();
        }
        cout << "Riallocazione..." << endl;
        myType obj1;
        a = (myType*)realloca(a,10,obj1);
        for(int k = 0; k < 11; k++)
        {
                a[k].stampa();
        }
        system("pause");
        return 0;
    }
    
    void* realloca(myType *s, const int x, myType &obj)
    {
         myType * tmp = new myType[x];
         for(int i = 0; i < x; i++)
         {
                 *(tmp + i) = *(s + i);
         }
         delete[] s;
         s = new myType[x+1];
         for (int i = 0; i < x; i++)
         {
             *(s+i) = *(tmp+i);
         }
         *(s+x+1) = obj;
         return (void*)s;
    }

  8. #8
    Originariamente inviato da zero85
    premessa: non vedendo il codice che richiama la tua funzione ho scritto un ipotetica implementazione:
    codice:
    int main()
    {
        myType *a = new myType[10];
        cout << "Riallocazione..." << endl;
        myType obj1;
        myFunction(a,10,obj1);
        return 0;
    }
    Io con il tuo codice ho un problema: quando il programma fa il delete di s la corrispondenza: indirizzo di s == indirizzo di a viene persa, quindi se tento di fare operazioni su a mi ritrovo un pointer NULL...

    io farei così:
    codice:
    #include <iostream>
    
    using namespace std;
    
    typedef struct _mytype{
            int a;
            int b; 
            _mytype()
            {
                     a = 3;
                     b  = 5;
            }
            
            void stampa()
            {
                 cout << a << ";" << b << endl;
            } 
    } myType;
    
    void* realloca(myType *s, const int x, myType &obj);
    
    int main()
    {
        myType *a = new myType[10];
        for(int k = 0; k < 10; k++)
        {
                a[k].stampa();
        }
        cout << "Riallocazione..." << endl;
        myType obj1;
        a = (myType*)realloca(a,10,obj1);
        for(int k = 0; k < 11; k++)
        {
                a[k].stampa();
        }
        system("pause");
        return 0;
    }
    
    void* realloca(myType *s, const int x, myType &obj)
    {
         myType * tmp = new myType[x];
         for(int i = 0; i < x; i++)
         {
                 *(tmp + i) = *(s + i);
         }
         delete[] s;
         s = new myType[x+1];
         for (int i = 0; i < x; i++)
         {
             *(s+i) = *(tmp+i);
         }
         *(s+x+1) = obj;
         return (void*)s;
    }
    :master: Non ho capito qualìè il problema che hai individuato e la soluzione che hai portato.Mi spieghi in altre parole, forse sono un po tardo io
    Il centro dell'attenzione non è sempre un buon posto in cui trovarsi

    Mai discutere con uno stupido, la gente potrebbe non capire la differenza. (O. W.)

  9. #9
    In pratica mi risulta che a e s non puntino alla stessa cella di ram, quindi anche se l'array puntato da s viene espanso, le successive operazioni su a risultano sballate...
    Per risolvere ho modificato la funzione in modo che ritorni un puntatore a void (si potrebbe anche templatizzare la funzione), che rappresenta un puntatore al primo indice dell'array, che viene poi castato e assegnato ad a...

    per farti capire meglio ti mostro gli output con i relativi codici:

    codice:
    //codice che produce errori
    #include <iostream>
    
    using namespace std;
    
    typedef struct _mytype{
            int a;
            int b; 
            _mytype()
            {
                   a = 3;
                   b = 6;
            }
            
            void stampa()
            {
                 cout << a << ";" << b << endl;
                 return;
            }
            
            void mod(int x, int y)
            {
                 a = x;
                 b = y;
                 return;
            }
    } myType;
    
    void realloca(myType *s, const int x, myType &obj);
    
    int main()
    {
        myType *a = new myType[10];
        a[4].mod(2,7);
        for(int k = 0; k < 10; k++)
        {
                a[k].stampa();
        }
        cout << "Riallocazione..." << endl;
        myType obj1;
        realloca(a,10,obj1);
        for(int k = 0; k < 11; k++)
        {
                a[k].stampa();
        }
        system("pause");
        return 0;
    }
    
    void realloca(myType *s, const int x, myType &obj)
    {
         myType * tmp = new myType[x];
         for(int i = 0; i < x; i++)
         {
                 tmp[i] = s[i];
         }
         delete[] s;
         s = new myType[x+1];
         for (int i = 0; i < x; i++)
         {
            s[i] = tmp[i];
         }
         s[x+1] = obj;
         return ;
    }
    output:


    codice:
    //codice che sembra funzionare correttamente
    #include <iostream>
    
    using namespace std;
    
    typedef struct _mytype{
            int a;
            int b; 
            _mytype()
            {
                   a = 3;
                   b = 6;
            }
            
            void stampa()
            {
                 cout << a << ";" << b << endl;
                 return;
            }
            
            void mod(int x, int y)
            {
                 a = x;
                 b = y;
                 return;
            }
    } myType;
    
    void* realloca(myType *s, const int x, myType &obj);
    
    int main()
    {
        myType *a = new myType[10];
        a[4].mod(2,7);
        for(int k = 0; k < 10; k++)
        {
                a[k].stampa();
        }
        cout << "Riallocazione..." << endl;
        myType obj1;
        a = (myType*)realloca(a,10,obj1);
        for(int k = 0; k < 11; k++)
        {
                a[k].stampa();
        }
        system("pause");
        return 0;
    }
    
    void* realloca(myType *s, const int x, myType &obj)
    {
         myType * tmp = new myType[x];
         for(int i = 0; i < x; i++)
         {
                 tmp[i] = s[i];
         }
         delete[] s;
         s = new myType[x+1];
         for (int i = 0; i < x; i++)
         {
            s[i] = tmp[i];
         }
         s[x+1] = obj;
         return s;
    }
    output:

  10. #10
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    La realloca originale doveva essere

    codice:
    void realloca(myType **s, const int x, myType &obj)
    {
      myType * tmp = new myType[x];
      for(int i = 0; i < x; i++)
          tmp[i] = (*s)[i];
      delete[] (*s);
    
      *s = new myType[x+1];
      for (int i = 0; i < x; i++)
          (*s)[i] = tmp[i];
    
      (*s)[x+1] = obj;
    
      return;
    }
    e la dovevi chiamare con

    codice:
    realloca(&a,10,obj1);

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.