PDA

Visualizza la versione completa : [C++] Lavorando su un vettore mi si modifica un altro


Skull260287
01-06-2008, 18:48
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.



/*
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

oregon
01-06-2008, 18:57
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 ...

Skull260287
01-06-2008, 19:09
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.

oregon
01-06-2008, 19:11
Originariamente inviato da Skull260287
Grazie mille, è la prima volta che mi succede.

E' uno degli errori più comuni (a runtime) ...

Skull260287
01-06-2008, 19:49
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.




#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;

}

oregon
01-06-2008, 20:03
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 ...

Skull260287
01-06-2008, 20:14
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

oregon
01-06-2008, 20:25
Se nella for seguente aggiungi la riga in grassetto



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 ...

Skull260287
02-06-2008, 08:59
Originariamente inviato da oregon
Se nella for seguente aggiungi la riga in grassetto



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.

oregon
02-06-2008, 09:07
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]

Loading