Dlaczego program drukuje same zera

Dlaczego program drukuje same zera
W2
  • Rejestracja:prawie 11 lat
  • Ostatnio:ponad 4 lata
  • Postów:23
0

Dlaczego poniższy program wyświetla same zera? Co źle zrobiłem?

Kopiuj
#include <iostream>
using namespace std;

class Tab_arr
{
public:
    int arr[10] = {10};
    int index = {10};
    auto wczytaj_arr(auto *tab, auto index);
    auto wydrukuj_arr(auto *tab, auto index);

} ;
auto Tab_arr::wczytaj_arr(auto *tab, auto index)
{
    for (auto i =0;i< index;++i)
      tab[index]=i;
      
    return 0;
}
auto Tab_arr::wydrukuj_arr(auto *tab, auto index)
{
    for (auto i=0;i<index;++i)
        cout<<tab[index];
    cout<<endl;

    return 0;
}
int main()
{
    Tab_arr tar;
    tar.wczytaj_arr(tar.arr, tar.index);
    tar.wydrukuj_arr(tar.arr,tar.index);

    cin.get();
    return 0;
}


edytowany 1x, ostatnio: kq
DR
  • Rejestracja:około 12 lat
  • Ostatnio:około 21 godzin
  • Postów:1131
0

Użyj debuggera

Zobacz pozostały 1 komentarz
DR
Pewnie. Zobaczy co ma w pamięci, zobaczy jaki jest flow programu
cerrato
porada korzystania z debuggera wysłana w kierunku osoby, która ledwo ogarnia podstawy jest chyba średnią pomocą.
DR
@cerrato: Wydaje mi się, że nie. W sensie nie myślałem o gdb, a o jakimś graficznym z CLiona/QtCreatora gdzie właśnie użycie go od razu by wskazało błąd bo się ładnie pokazuje.
cerrato
Moze masz rację aczkolwiek wydaje mi się, że jednak debuger (nawet w wersji uproszczonej) to i tak trochę wyższy poziom. Nie mówię, że to Rocket science, ale nie jest to temat dla początkującego
DR
GDB tak, ale debugger który dokładnie ci wyświetla co się dzieje? Był gdzieś w internecie projekt nawet, który wykonywał kod linijka po linijce (jak znajdę to wrzucę link). Dodatkowo po godzinach "pracuje" w szkole dla dzieci i młodzieży i uczę ich programowania. I widzę, że czym szybciej powiem by korzystały z debuggera to pod koniec semestru mają one lepsze wyniki
kaczus
  • Rejestracja:około 10 lat
  • Ostatnio:3 dni
  • Lokalizacja:Łódź
  • Postów:1402
2

zamiast tab[index]=i; pownieneś mieć tab[i]=i; to samo przy wypisywaniu. Ogólnie w ten sposób mażesz po pamięci.


Ogólnie na prace domowe mam stawki zaporowe. Czasem coś o programowaniu znajdzie się na mojej stronie
W2
  • Rejestracja:prawie 11 lat
  • Ostatnio:ponad 4 lata
  • Postów:23
0

Teraz program działa tak jak powinien działać. Dziękuję! @kaczus

TomaszLiMoon
  • Rejestracja:prawie 10 lat
  • Ostatnio:około 22 godziny
  • Postów:530
3
  1. Uprość
  2. Nie używaj niepotrzebnie słowa auto
  3. Jeżeli funkcja nie musi nic zwracać to zdefiniuj ją jako void
  4. Nie wywołuj funkcji z klasy przekazując do niej jej zmienne. Nie musisz tego robić, gdyż cały czas masz do nich dostęp.

Zmień funkcję wczytaj_arr na

Kopiuj
void Tab_arr::wczytaj_arr()
{
    for( auto i=0 ; i<10; ++i ) arr[i]=i;
}

Powodzenia.

edytowany 2x, ostatnio: TomaszLiMoon
koszalek-opalek
  • Rejestracja:około 9 lat
  • Ostatnio:ponad 2 lata
2

Jeśli uczysz się C++ (a na to wygląda), to -- jeśli to możliwe -- odpuść surowe tablice, a zrób wszystko na vectorach. Gdybyś użył vectora i do niego dostawał się przez tab.at(index) zamiast tab[index] dostałbyś wyjątek zamiast UB i szybciej zorientował się, gdzie tkwi problem.

kq
Przede wszystkim, dodawałby przez push_back() :​)
W2
  • Rejestracja:prawie 11 lat
  • Ostatnio:ponad 4 lata
  • Postów:23
0

@koszalek-opalek. Biorąc pod uwagę wszystko to co zostało powiedziane nieco wyżej wykombinowałem taki program (niżej). Czy oto mniej więcej chodziło?```

Kopiuj
#include <iostream>
#include <vector>
using namespace std;

class Put_wek
{
private:
    vector <int> wek;
    vector <int>::iterator pos;
    unsigned int i=0;
    int j=0;
    int index=0;
public:
    void pobierz_dane();
    void pokaz_dane();
};
void Put_wek::pobierz_dane()
{
    cout<<"POBIERANIE DANYCH"<<endl;
    cout<<"-----------------"<<endl;
    cout<<"Podaj liczbe:";
    cin>>index;
    wek.reserve(index);
    for (i=0;i<index;++i)
      wek.push_back(i);

}
void Put_wek::pokaz_dane()
{
    cout<<"DRUKOWANIE DANYCH"<<endl;
    cout<<"----------"<<endl;
    cout<<endl;
    for (pos=wek.begin();pos!=wek.end();++pos)
    {
        j++;
        cout<<"["<<j<<"]"<<"\t"<<*pos<<endl;
    }
}
int main()
{
    Put_wek pw;
    pw.pobierz_dane();
    pw.pokaz_dane();

    cin.get();
    cin.get();
    return 0;
}
edytowany 1x, ostatnio: cerrato
kq
Moderator C/C++
  • Rejestracja:prawie 12 lat
  • Ostatnio:minuta
  • Lokalizacja:Szczecin
0

Iterator zdecydowanie powinien być zmienną w funkcji, a nie elementem klasy. Poza tym, użyj ranged for: for(int x : wek)


_13th_Dragon
on i tak potrzebuje indeksu, więc lepiej for(size_t i=0;i<wek.size();++i) cout<<'['<<(i+1)<<']'<<wek[i]<<endl;
_13th_Dragon
  • Rejestracja:prawie 20 lat
  • Ostatnio:9 dni
1
wojownik266 napisał(a):

void Put_wek::pokaz_dane()
...
j++;
...

odpal dwa lub więcej razy pod rząd.


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

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.