Kopiowanie tablicy

Odpowiedz Nowy wątek
2013-03-28 14:12
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;
}

Pozostało 580 znaków

2013-03-28 14:25
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.


Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.

Pozostało 580 znaków

2013-03-28 14:31
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); 

Pozostało 580 znaków

2013-03-28 14:38
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;
}

Pozostało 580 znaków

2013-03-28 14:45
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)

Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.

Pozostało 580 znaków

2013-03-28 15:02
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");
}
edytowany 2x, ostatnio: Weniu, 2013-03-28 15:03
Można znacznie prościej: memcpy(tab2,tab,sizeof(tab)); - ale pytającemu nie o to chodzi. - _13th_Dragon 2013-03-28 15:06
a nie tak to było memcpy(tab2,tab,sizeof(tab)/sizeof(int)); ?) - Weniu 2013-03-28 15:12
nie, trzeci parametr - rozmiar w bajtach - _13th_Dragon 2013-03-28 15:12
W C++ do tego jest std::copy. - Endrju 2013-03-28 15:16
@Endrju, to nawet było podane wcześniej. - _13th_Dragon 2013-03-28 15:18

Pozostało 580 znaków

2013-03-28 15:10
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;
}
Nie powinno działać, czemu nie chcesz zrobić tego po ludzku: std::copy(), memcpy(), tab1[i]=tab[i] ? Trudno ci coś poradzić skoro ignorujesz i/lub nie rozumiesz co piszemy. - _13th_Dragon 2013-03-28 15:16

Pozostało 580 znaków

2013-03-28 15:19
0

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

Pozostało 580 znaków

2013-03-28 15:21
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");
}
edytowany 1x, ostatnio: Weniu, 2013-03-28 15:22

Pozostało 580 znaków

2013-03-28 15:26
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;
  }

Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.
edytowany 1x, ostatnio: _13th_Dragon, 2013-03-28 15:26

Pozostało 580 znaków

2013-03-28 16:36
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++);
        }             

 }
Trochę bez sensu przestawiać z powrotem wsk=tab; jeżeli robisz to za pomocą funkcji którą można wywołać: zamien(tab,tab1,10); No i nazwa funkcji czemu "zamien" a nie na przykład "rysuj_kolo" albo "plywaj_w_morzu". - _13th_Dragon 2013-03-28 16:47

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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