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

    [C++] Lavorando su un vettore mi si modifica un altro

    Ciao a tutti, come da titolo, c'è un punto di questo programma che non ho capito per quale motivo mi va a modificare il vettore v, pure lavorando sul vettore v1. Ve lo evidenzio, facendolo girare noterete che dopo l'istruzione v1[++due]=v[i], il vettore v[i] cambia nel secondo elemento. Vi prego di aiutarmi dato che il perchè mi è sconosciuto.

    codice:
    /*
       Nome del programma: unionearray.cpp   
       Note            : Assegnato un array A monodimensionale di N interi con
                           ripetizioni di lunghezza =N. Assegnato un array B
                           monodimensionale di N interi con ripetizioni di 
                           lunghezza =2N Trasformare l'array A nell'array pari 
                           all'intersezione di A e B e l'array B nell'array pari 
                           alla loro unione.
    */     
    
    #include <cstdlib>
    #include <iostream>
    
    using namespace std;
    
    
    
    int main(){
        
        int v[4]={1,5,3,5};
        int v1[8]={9,3,5,6,3,11,13,15};
        int i=0,duen=8,n=4;
        bool ceck=false;
        while(i<n){
                ceck=false;           
       for(int k=0;k<duen;k++){
                cout<<v[i]<<" "<<v1[k]<<endl;
                if(!ceck && v[i]==v1[k]) ceck=true;
                if(ceck && v[i]==v1[k]){cout<<"CECK: "<<v[i]<<" "<<v1[k]<<endl; system("pause");
                        for(int n=k;n<duen-1;n++){
                                v1[n]=v1[n+1];
                                }
                                duen--;
                                }
                                }
                        cout<<endl;
                        for(int c=0;c<n;c++) cout<<v[c]<<" ";
                        cout<<endl;
                if(!ceck){
                          
                          v1[++duen]=v[i];
                          duen++;
    
                          cout<<v1[duen]<<endl;
                          cout<<endl;
                        for(int c=0;c<n;c++) cout<<v[c]<<" ";
                        cout<<endl;
                          for(int z=i;z<n-1;z++){
                                  cout<<v[z+1]<<endl;
                                  v[z]=v[z+1];
                                  cout<<z<<" "<<v[z]<<endl;
                                  system("PAUSE");
                                  }
                                  }
                else i++;
                }     
    
        
        system("pause");
        return 0;
        
    }

    Grazie
    MondoLibero: Informazione Libera, Varia ed Eventuale
    Sito di informazione varia ed eventuale. Quando ho voglia scrivo di ciò che mi pare. Pubblico guide, recensioni, notizie, critiche e tutto ciò che mi passa sotto mano e che penso sia interessante.

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,465
    Visualizza il valore dell'indice

    duen

    prima della riga

    v1[++duen]=v[i];

    e controlla se e in quali condizioni eccede il numero di valori previsti nel vettore ...

    Se succede, effettivamente, potrebbe sconfinare e rovinare il secondo vettore ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    Originariamente inviato da oregon
    Visualizza il valore dell'indice

    duen

    prima della riga

    v1[++duen]=v[i];

    e controlla se e in quali condizioni eccede il numero di valori previsti nel vettore ...

    Se succede, effettivamente, potrebbe sconfinare e rovinare il secondo vettore ...
    In effetti era proprio questo il motivo, sconfinava nello spazio assegnato al secondo vettore.

    Grazie mille, è la prima volta che mi succede.
    MondoLibero: Informazione Libera, Varia ed Eventuale
    Sito di informazione varia ed eventuale. Quando ho voglia scrivo di ciò che mi pare. Pubblico guide, recensioni, notizie, critiche e tutto ciò che mi passa sotto mano e che penso sia interessante.

  4. #4
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,465
    Originariamente inviato da Skull260287
    Grazie mille, è la prima volta che mi succede.
    E' uno degli errori più comuni (a runtime) ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  5. #5
    Originariamente inviato da oregon
    E' uno degli errori più comuni (a runtime) ...
    Grazie, ne terrò presente sempre. In tutto ciò non capisco perchè il codice, che ho anche modificato un pò, continua a non funzionare. Mi aggiunge uno zero alla fine del primo vettore che non capisco da dove prende.

    codice:
    #include <cstdlib>
    #include <iostream>
    
    using namespace std;
    
    
    
    int main(){
        
        int v[50]={2,3,3,5};
        int v1[50]={9,3,5,6,3,11,13,15};
        int i=0,duen=8,n=4;
        bool ceck=false,first=false;
        while(i<n){
                ceck=false;    
                first=false;
                       
       for(int k=0;k<duen;k++){
                cout<<v[i]<<" "<<v1[k]<<endl;
                if(!ceck && v[i]==v1[k]) ceck=true;
                if(ceck && v[i]==v1[k] && first){
                cout<<"CECK: "<<v[i]<<" "<<v1[k]<<endl; system("pause");
                        for(int u=k;u<duen-1;u++){
                                v1[u]=v1[u+1];
                                }
                                duen-=1;
                                k-=1;
                                }
                                if(ceck) first=true;
                                }    
                        
                if(!ceck){
                          duen+=1;
                          v1[duen]=v[i];
                          cout<<"\n\n!ceck"<<v[i]<<" "<<v1[duen]<<endl;
                          cout<<endl;
                          for(int z=i;z<n-1;z++){
                                  //cout<<v[z+1]<<endl;
                                  v[z]=v[z+1];
                                  //cout<<z<<" "<<v[z]<<endl;
                                 // system("PAUSE");
                                  }
                                   n-=1;
                                   cout<<"!ceck"<<endl;
                                   for(int c=0;c<n;c++) cout<<v[c]<<" ";
                                   cout<<endl;
                                  }
                else{
                     int z=i+1;
                     while(z<n){
                                  if(v[i]==v[z]){
                     for(int k=z;k<n-1;k++){
                                  //cout<<v[z+1]<<endl;
                                  v[k]=v[k+1];
                                  //cout<<z<<" "<<v[z]<<endl;
                                 // system("PAUSE");
                                  }
                                  n-=1;
                                  }
                                  z+=1;
                                  }
                     i+=1;
                     }
                }
       
               cout<<endl; 
               for(int n1=0;n1<n;n1++) cout<<v[n1]<<" ";
               cout<<endl;   
               for(int n2=0;n2<duen;n2++) cout<<v1[n2]<<" ";
               cout<<endl;     
    
        
        system("pause");
        return 0;
        
    }
    MondoLibero: Informazione Libera, Varia ed Eventuale
    Sito di informazione varia ed eventuale. Quando ho voglia scrivo di ciò che mi pare. Pubblico guide, recensioni, notizie, critiche e tutto ciò che mi passa sotto mano e che penso sia interessante.

  6. #6
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,465
    Originariamente inviato da Skull260287
    Grazie, ne terrò presente sempre. In tutto ciò non capisco perchè il codice, che ho anche modificato un pò, continua a non funzionare. Mi aggiunge uno zero alla fine del primo vettore che non capisco da dove prende.
    Tu conosci il programma e il problema ... chi ti legge non sa nulla e fa fatica ad afferrare il problema se tu dai solamente queste poche informazioni ...

    P.S. Si scrive check ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  7. #7
    Originariamente inviato da oregon
    Tu conosci il programma e il problema ... chi ti legge non sa nulla e fa fatica ad afferrare il problema se tu dai solamente queste poche informazioni ...

    P.S. Si scrive check ...
    :-) So che si scrive check per indicare controllato. ceck è una variabile booleana che ha un nome qualunque che mi piace chiamare così per semplicità di scrittura, il suono è lo stesso no (?), a parte questa piccolezza vi spiego il problema.

    Se provate a far girare il programma vi accorgerete che al vettore v1 si aggiunge uno zero, nel caso il numero selezionato in v non sia presente in v1, invece dovrebbe aggiungersi proprio il numero selezionato in v, come da codice v1[duen]=v[i]. E' proprio questo che non sono risucito a capire, perchè accade una cosa del genere.

    Vi allego l'output
    Immagini allegate Immagini allegate
    MondoLibero: Informazione Libera, Varia ed Eventuale
    Sito di informazione varia ed eventuale. Quando ho voglia scrivo di ciò che mi pare. Pubblico guide, recensioni, notizie, critiche e tutto ciò che mi passa sotto mano e che penso sia interessante.

  8. #8
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,465
    Se nella for seguente aggiungi la riga in grassetto

    codice:
      for(int u=k;u<duen-1;u++)
      {
        cout << u+1 << " in " << u << endl;
        v1[u]=v1[u+1];
      }
    vedrai che viene visualizzato

    8 in 7

    che vuol dire che viene leggo l'elemento 8 di v1 che non esiste (probabilmente il programma accede ad una zona di memoria che sta a zero ... ) ...

    Il motivo lo devi trovare tu ... probabilmente dovrai capire perche' il valore finale della for va oltre quello che pensi tu ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  9. #9
    Originariamente inviato da oregon
    Se nella for seguente aggiungi la riga in grassetto

    codice:
      for(int u=k;u<duen-1;u++)
      {
        cout << u+1 << " in " << u << endl;
        v1[u]=v1[u+1];
      }
    vedrai che viene visualizzato

    8 in 7

    che vuol dire che viene leggo l'elemento 8 di v1 che non esiste (probabilmente il programma accede ad una zona di memoria che sta a zero ... ) ...

    Il motivo lo devi trovare tu ... probabilmente dovrai capire perche' il valore finale della for va oltre quello che pensi tu ...
    Ho controllato ma continuo a non capire. Praticamente dato che il primo elemento di v è un numero non presente in v1, lo vado ad aggiungere grazie al contenuto del controllo if(!ceck), visualizzando il valore all'interno di questo controllo dopo l'inserimento si ha effettivamente come ultimo elemento 2, e duen incrementato di 1 dato che ora gli elementi sono 8. Però poi quando torna su nel for che va a eliminare un elemento dal vettore, risulta l'ultimo elemento come 0.
    MondoLibero: Informazione Libera, Varia ed Eventuale
    Sito di informazione varia ed eventuale. Quando ho voglia scrivo di ciò che mi pare. Pubblico guide, recensioni, notizie, critiche e tutto ciò che mi passa sotto mano e che penso sia interessante.

  10. #10
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,465
    Non mi sono spiegato, ma mi sembrava chiaro ... il tuo programma, ad un certo punto, in quel for legge l'elemento

    v1[8]

    perchè, per un motivo che non ho approfondito, u+1 vale 8.

    Dato che l'elemento v1[8] non esiste, viene letto dalla memoria un valore "sporco" (lo 0 probabilmente) che viene assegnato all'elemento v1[7]
    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 © 2024 vBulletin Solutions, Inc. All rights reserved.