Ustawienie wskaznika

0

Witam! Mam problem z ponownym ustawieniem wskaznika na element 0 tablicy. Przy zaladowaniu do niego wartosci wskaznik jest przesuwany az do momentu, gdy ustawi sie na ostatnie miejsce tablicy. Podczas przypisywania wartosci do tablicy 3 (dzieje sie to przez mnozenie elementu tablicy 1 i 2) oba wskazniki powinny byc ustawione na element 0 tablic, a sa ustawione na element ostatni. Jak rozwiazac ten problem?

#include<iostream>
using namespace std;
//********************************************************************************
void zaladuj(double *w, const int x);
void przypisz(double *w1, double *w2, double *w3, const int x);
void drukuj(double *w, const int rozmiar);
//********************************************************************************
int main()
{
    double *wsk1, *wsk2, *wsk3;
    const int rozmiar=20;
    wsk1 = new double [rozmiar];
    wsk2 = new double [rozmiar];
    wsk3 = new double [rozmiar];

    zaladuj(wsk1,rozmiar); zaladuj(wsk2,rozmiar);
    przypisz(wsk1, wsk2, wsk3, rozmiar);

    cout << "Tablica pierwsza: " << endl;
    drukuj(wsk1, rozmiar);
    cout << "Tablica druga: " << endl;
    drukuj(wsk2, rozmiar);
    cout << "Tablica trzecia: " << endl;
    drukuj(wsk3, rozmiar);

    return 0;
}
//********************************************************************************
void zaladuj(double *w, const int x)
{
    for(int i=0; i<x; i++, w++)
    {
        *w=i;
    }
    w-=20;
}
//********************************************************************************
void przypisz(double *w1, double *w2, double *w3, const int x)
{
    for(int i=0; i<x; i++, w1++, w2++)
    {
        (*w3)=(*w1)*(*w2);
    }
}
//********************************************************************************
void drukuj(double *w, const int rozmiar)
{
    for(int i=0; i<rozmiar; i++, w++)
    {
        cout << i+1 << ".)Element:\t" << *w << endl;
    }
}
//********************************************************************************
2

Szczerze to nie wiem o co Ci chodzi, ale tutaj:

for(int i=0; i<x; i++, w1++, w2++)
{
    (*w3)=(*w1)*(*w2);
}

Jest błąd. w3 nie jest przesuwane, więc wszystko ląduje do zerowego elementu tablicy. (A dokładniej to ląduje tam 19 * 19 czyli 361)

Co to za dziwaczny kod. Alokujesz dynamicznie pamięć i nigdy jej nie zwalniasz. To się nazywa wyciek pamięci. Nigdy tego nie rób. Po co Ci w ogóle dynamiczna alokacja w tym przypadku?
Co się tak uparłeś na te wskaźniki? Iteruj jak ludzie używając operatora [].
Ten kod: w-=20; nie ma żadnego sensu. Co chciałeś osiągnąć?

2

nie przesuwaj wskaznika tylko dobieraj sie do elementu poprzez []. Tak samo jak do tablicy. Nie bedziesz musial sie bawic w przesuwanie wskaznika

0

Dzięki wielkie, już czaję o co chodzi.

2
  1. Nie musisz niczego cofać do funkcji trafia kopia (możesz nad nią się pastwić ile wlezie.
  2. Nie używaj i++ tam gdzie możesz użyć ++i to ci się zemści
  3. Używaj deklaracji funkcji tylko jeżeli to niezbędne
  4. Przekazanie parametru poprzez const int jest absolutnie bezsensowne
  5. Dla wartości które nie mogą przyjmować wartości ujemnych używaj unsigned lub size_t
  6. Jeżeli for lub if lub itp ma tylko jedną instrukcje nie musisz używać klamerek
  7. Staraj się nie używać polskich nazw zmiennych
  8. Problem był w braku zwiększenia w3 w przypisz
#include<iostream>
using namespace std;

void zaladuj(double *w,size_t size)
  {
   for(size_t i=0;i<size;++i) *(w++)=i;
  }

void przypisz(const double *w1,const double *w2,double *w3,size_t size)
  {
   for(size_t i=0;i<size;++i) *(w3++)=*(w1++)*(*(w2++));
  }

void drukuj(const double *w,size_t size)
  {
   for(size_t i=0;i<size;++i) cout<<(i+1)<<". Element:\t"<<*(w++)<<endl;
  }

int main()
  {
   const size_t rozmiar=20;
   double *wsk1=new double [rozmiar],*wsk2=new double [rozmiar],*wsk3=new double [rozmiar];
   zaladuj(wsk1,rozmiar);
   zaladuj(wsk2,rozmiar);
   przypisz(wsk1,wsk2,wsk3,rozmiar);
   cout<<"Tablica pierwsza: "<<endl;
   drukuj(wsk1,rozmiar);
   cout<<"Tablica druga: "<<endl;
   drukuj(wsk2,rozmiar);
   cout<<"Tablica trzecia: "<<endl;
   drukuj(wsk3,rozmiar);
   return 0;
  }
0

Nie używaj i++ tam gdzie możesz użyć ++i to ci się zemści

Dlaczego to mi się zemści?

1

@sztukers ++i nigdy nie będzie wolniejsze od i++, a czasami będzie szybsze bo to drugie musi tworzyć kopię i. Pół biedy jak to jest jakiś int, gorzej jeśli to jest obiekt, który ma kosztowną operację kopiowania.

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