• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

C++ Klasy i zamiana wartości.

0 głosów
447 wizyt
pytanie zadane 24 sierpnia 2016 w C i C++ przez Ziom Początkujący (430 p.)

Witam wszystkich. Z góry uprzedzam że jestem początkującym programistą więc proszę o wyrozumiałość. Otóż mam pewną klasę która ma za zadanie utworzyć tablicę, wypełnić wartością 5,podmienić pierwszą wartość na 0 i wyświetlić wynik. Proszę powiedzcie gdzie leży błąd i jak można go naprawić? Z góry dziękuję za pomoc

 

class GRAFIKA{

public :

 int ROZMIAR_OKNA(int c){


HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE); // potrzebujesz uchwytu
    SMALL_RECT sr;

    sr.Left = 0;
    sr.Top = 0;
    sr.Right = 49;
    sr.Bottom = 49;
    SetConsoleWindowInfo(handle,true,&sr); // ustawiasz szerokoœæ okna na 50 x 50 (w szerokoœciach i wysokoœciach znaku pojedynczego a nie w pikselach)

    CONSOLE_SCREEN_BUFFER_INFO sbi; // struktura opisuj¹ca okno

    GetConsoleScreenBufferInfo(handle, &sbi);
    int X = sbi.srWindow.Right - sbi.srWindow.Left + 1;
    int Y = sbi.srWindow.Bottom - sbi.srWindow.Top + 1;

    switch(c){
    case 0 : return X;
    case 1 : return Y; } }

    int X = ROZMIAR_OKNA(0);
    int Y = ROZMIAR_OKNA(1);


    int *PLANSZA = new int[5];
    void ZERUJ_PLANSZE(){
    int *PLANSZA = new int[5];

    for(int i = 0; i < 5; i++){
        PLANSZA[i] = 5;       } }

    void ZAMIANA(){
    int *PLANSZA;
    PLANSZA[0] = 0;

    }


    void POKAZ_WYNIK(){
        int *PLANSZA;
        for(int i = 0; i < 5; i++){
        cout << PLANSZA[i];       }
    }

 

2 odpowiedzi

+1 głos
odpowiedź 24 sierpnia 2016 przez Sebastian Fojcik Nałogowiec (43,040 p.)

Wszystkie nazwy w kodzie pisane CAPSLOCKIEM... Na miły Bóg! Miej litość nad tym nieszczęsnym programistą, bo nie wie co czyni ;-;

Linijka 31:

int *PLANSZA = new int[5];

Linijka 33:

int *PLANSZA = new int[5];

Linijka 46:

int *PLANSZA;

We wszystkich tych wierszach tworzysz nowe wskaźniki o tej samej nazwie. Sposób pisania przez Ciebie klamer w kodzie woła o pomstę do Nieba (tak swoją drogą). Kompilator nie wyświetla błędu, bo mogą istnieć zmienne o takiej samej nazwie w innym zakresie.

Funkcja ZERUJ_PLANSZE tworzy własną tablicę i to ją zeruje. Podobnie funkcja POKAZ_WYNIK tworzy swój wskaźnik i wyświetla zawartość pięciu kolejnych komórek (tym samym wychodząc poza dozwolony zakres — naruszenie pamięci).

Linijka 31 zawiera deklarację i definicję tablicy, która ma zasięg globalny w całej klasie. Do tej tablicy masz się odwoływać za każdym razem. Usuń więc deklaracje tablic z wierszy 33 i 46 i poprawnie utwórz tablicę dla klasy (najlepiej prywatną).

komentarz 24 sierpnia 2016 przez Ziom Początkujący (430 p.)
Wiem że ten kod wygląda jak wygląda ale dopiero się uczę programowania i jestem nowicjuszem co do tematu klas. Jeśli mógłbym prosić to podeślij mi poprawiony kod
0 głosów
odpowiedź 24 sierpnia 2016 przez Szykem2 Nałogowiec (29,510 p.)
Dwia złe nawyki pierwsze się rzucają w oczy. Jeśli nazwa składa się z samych dużych liter to sugeruje, że jet to stała. Nazw klas i funkcji nie powinno sie pisać dużymi literami bo mogą być mylone właśnie ze stałymi. Druga sprawa wcięcia i domknięcia klamer. W kilku miejscach miałem ten problem, że nie wiem czy już wysziśmy z bloku czy jeszcze w nim jesteśmy(np. linia 27). I nie wiem gdzie są jakieś pola klasy.

Twój problem jest w tym, że za każdym razem jak chcesz coś zrobić z planszą to tworzysz nową w lokalnym scopie(zasięgu), a ta planasza w scopie wyżej zostaje niezmieniona. Pozatym ani razu nie dealokujesz pamięci.

Najłatwiej jest to rozwiązać w taki sposób. Tworzysz pole planszy int* plansza. Najlepiej prywatne. W kostruktorze alokujesz pamięć na tą planszę, a w destruktorze ją dealokujesz. W metodach nie tworzysz nowej zmiennej plansza tylko odwołujesz się do pola klasy.

Podobne pytania

0 głosów
3 odpowiedzi 1,702 wizyt
pytanie zadane 3 września 2016 w C i C++ przez igor1988bb Użytkownik (800 p.)
0 głosów
2 odpowiedzi 1,316 wizyt
pytanie zadane 26 sierpnia 2017 w C i C++ przez minemoney Nowicjusz (240 p.)
+1 głos
2 odpowiedzi 770 wizyt
pytanie zadane 7 czerwca 2017 w C i C++ przez mel0n Początkujący (400 p.)

93,741 zapytań

142,677 odpowiedzi

323,296 komentarzy

63,326 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

Twierdza Linux. Bezpieczeństwo dla dociekliwych

Aby uzyskać rabat -10%, użyjcie kodu pasja-linux, wpisując go w specjalne pole w koszyku.

...