Kopiowanie tablicy

0

Witam, mam za zadanie skopiować tablicę, jednakże mam problemy.. Napisałem kawałek kodu, co w nim trzeba zmienić żeby działało?

#include <iostream>


using namespace std;
int main(int argc, char *argv[]) {
	
	int tab[10]={0,1,2,3,4,5,6,7,8,9};	
    int *wsk;
    wsk=tab;
    
    for(int i=0; i<10; i++)
    	cout<<"tabl["<<i<<"]="<<*(wsk++)<<endl;
	
	int tab1[10];
	int *wsk1;
	wsk1=tab1;
	
	for (int i=0; i<10; i++){	
		*(wsk1++) = *(wsk++);
	}
		
	cout<<"Tablica po skopiowaniu:";
	for( int i=0; i<10; i++)
	    cout<<"tabl["<<i<<"]="<<*(wsk1++)<<endl;	
	
	return 0;
}

0

Po pętle:

    for(int i=0; i<10; i++)
            cout<<"tabl["<<i<<"]="<<*(wsk++)<<endl;

wsk już nie wskazuje na początek tablicy, więc następna pętla już nie działa poprawnie.

0
const unsigned size = 10;
int tab[size]={0,1,2,3,4,5,6,7,8,9};
int tab2[size];
std::copy(tab, tab + size, tab2); 
0

Ok, rzeczywiście. A da się to jakoś szybko zniwelować? Bo ja zrobiłem kolejny wskaźnik pokazujący na element zerowy tablicy "tab" i działa, ale myślę, że nie jest to optymalne rozwiązanie.. Moim zadanie jest stworzenie funkcji kopiującej, więc chyba chodzi też o to aby tych zmiennych za wiele nie było.

Póki co rozwiązanie bez funkcji.

#include <iostream>


using namespace std;
int main(int argc, char *argv[]) {
	
	int tab[10]={0,1,2,3,4,5,6,7,8,9};	
    int *wsk;
    wsk=tab;
    
    for(int i=0; i<10; i++)
    	cout<<"tabl["<<i<<"]="<<*(wsk++)<<endl;
    	
	int *wsk2;	
	wsk2=tab;
	
	int tab1[10];
	int *wsk1;
	wsk1=tab1;
	
	for (int i=0; i<10; i++){	
		*(wsk1++) = *(wsk2++);
	}
		
	cout<<"Tablica po skopiowaniu:"<<endl;
	for( int i=0; i<10; i++)
	    cout<<"tabl["<<i<<"]="<<*(wsk2++)<<endl;	
	
	return 0;
}

0
  1. nie musisz robić kolejnego wskaźnika, wystarczy wsk=tab;
  2. ten sam problem występuje po drugiej pętli
  3. teraz trzecia pętla idzie po niewłaściwej tablice (poprzednio było prawie dobrze)
0

Dawno w c++ nie pisałem, ale takie coś powinno zadziałać.

#include <iostream>
#include <cstdlib>
 
using namespace std;

template <class typDanych>
void kopiujTablice(typDanych* tab1Oryginal, typDanych* tab2Kopia, int dlugoscTab)
{
	for (int i = 0 ; i < dlugoscTab ; i++){ 
	     tab2Kopia[i] = tab1Oryginal[i];
	}
}


int main(int argc, char *argv[]) {
 
        int tab[10] = {0,1,2,3,4,5,6,7,8,9};
	int tab2[10];
 
	kopiujTablice(tab,tab2,10);

        cout<<"Tablica po skopiowaniu:"<<endl;
       
        for( int i=0; i<10; i++)
            cout<<"tabl["<<i<<"]="<< tab2[i] <<endl;        
		
	system("pause");
}
0

Nie wiem czy o to chodziło, ale działa.

#include <iostream>
 
 
using namespace std;
int main(int argc, char *argv[]) {
 
    int tab[10]={0,1,2,3,4,5,6,7,8,9};        
     int *wsk;
    wsk=&tab[0];
 
    for(int i=0; i<10; i++)
            cout<<"tabl["<<i<<"]="<<*(wsk++)<<endl;
 
        int tab1[10];
        int *wsk1;
        wsk1=tab1;
       
        for (int i=0 ; i<10; i++){			   			        
             *(wsk1++) = *(wsk++);
        }
                
        
        cout<<"Tablica po skopiowaniu:"<<endl;
        for( int i=0; i<10; i++)
            cout<<"tabl["<<i<<"]="<<*(wsk1)<<endl;        
 
        return 0;
}
0

W devc++ działa.. Nie chcę tak zrobić, ponieważ zapomniałem dodać, że mam to zrobić za pomocą wskaźników.

0
#include <iostream>
 
 
using namespace std;
int main(int argc, char *argv[]) {
 
    int tab[10]={0,1,2,3,4,5,6,7,8,9};        
     int *wsk;
    wsk=&tab[0];
 
    for(int i=0; i<10; i++)
            cout<<"tabl["<<i<<"]="<<*(wsk++)<<endl;
 
        int tab1[10];
        int *wsk1;
        wsk1=tab1;
 
	wsk = tab; //Musisz tutaj przypisac pamiec do poczatku tab!!
        for (int i=0 ; i<10; i++){                                                           
             *(wsk1++) = *(wsk++);
        }

	wsk1 = tab1;
        cout<<"Tablica po skopiowaniu:"<<endl;
        for( int i=0; i<10; i++)
            cout<<"tabl["<<i<<"]="<<*(wsk1++)<<endl;        
 
        system ("pause");
}
0

No to rób za pomocą wskaźników:

#include <iostream> 
using namespace std;

int main()
  {
   int tab[10]={0,1,2,3,4,5,6,7,8,9};
   for(int *w=tab;w<tab+10;++w) cout<<"tab["<<(w-tab)<<"]="<<*w<<endl;
   int tab1[10];
   for(int *s=tab,*d=tab1;s<tab+10;++s,++d) *d=*s;
   cout<<"Tablica po skopiowaniu:"<<endl;
   for(int *w=tab1;w<tab1+10;++w) cout<<"tab1["<<(w-tab)<<"]="<<*w<<endl;
   return 0;
  }
0

Ok, chociaż to wygląda mniej strawnie niż mój kod, przynajmniej dla mnie...
W takiej postaci może wyglądać to zadanie?

#include <iostream>
 void zamien( int *wsk, int *wsk1, int rozmiar);
 
using namespace std;
int main(int argc, char *argv[]) {
    int rozmiar=10;
	int tab[10]={0,1,2,3,4,5,6,7,8,9}; 
	int tab1[10];
	
	int *wsk;
	wsk=tab;
	
	for(int i=0; i<10; i++)
            cout<<"tabl["<<i<<"]="<<*(wsk++)<<endl;
	       
	int *wsk1;
    wsk1=tab1;
    
	wsk=tab;     //ustawienie wsk poownie na 1 element tablicy tab[10]         
                          
	zamien(wsk,wsk1,10);
	
         cout<<"Tablica po skopiowaniu:"<<endl;
 	 for( int i=0; i<10; i++)
          cout<<"tabl["<<i<<"]="<<*(wsk1++)<<endl;
}

 void zamien( int *wsk, int *wsk1, int rozmiar){
 	
        for (int i=0 ; i<rozmiar; i++){                                                           
             *(wsk1++) = *(wsk++);
        }             
 	 	
 }

0

Ok, racja- przecież nazwa tablicy jest adresem jej pierwszego elementu.. Co do nazwy funkcji to również jej nazwa nie jest najtrafniejsza.. Dzięki za pomoc.

1 użytkowników online, w tym zalogowanych: 0, gości: 1