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

Zwraca mi liczbe mimo błędnego ifa? Implementacja stosu

Object Storage Arubacloud
0 głosów
307 wizyt
pytanie zadane 14 października 2018 w C i C++ przez periedynek Obywatel (1,320 p.)
edycja 14 października 2018 przez periedynek

Cześć.

Możecie mi powiedzieć dlaczego zwraca mi liczbę mimo, ze warunek w ifie jest błędny? Chodzi o metodę sizeOfStack.

#include "stack.h"
#include <iostream>

using namespace std;

Stack::Stack()
{
    cout <<"Podaj wielkosc stosu:";
    cin>>arraySize;
    stackArray = new int[arraySize];
    top = -1;
}

bool Stack::isEmpty()
{
    return top==-1;
}

int Stack::getSizeOfStack()
{
    if(!isEmpty())
        return top;
}
.....

Gdy w mainie wypisuje getSizeOfStack zwraca mi liczbę -256. Nie wiem dlaczego, skoro zmienna top wynosi -1, czyli isEmpty jest prawdziwe. Wynikało by z tego, że ma się nic nie pojawić w konsoli.

 

//EDIT

Cały kod:

Main: 

#include <iostream>
#include "stack.h"

using namespace std;

int main()
{
    Stack stack;
    cout << stack.getSizeOfStack();
}

Stack.cpp

#include "stack.h"
#include <iostream>

using namespace std;

Stack::Stack()
{
    cout <<"Podaj wielkosc stosu:";
    cin>>arraySize;
    stackArray = new int[arraySize];
    top = -1;
}

bool Stack::isEmpty()
{
    return top==-1;
}

int Stack::getSizeOfStack()
{
    if(!isEmpty())
        return top;
}

void Stack::pop()
{
    if(!isEmpty())
        top--;
    else
        cout<<"stos jest pusty :("<<endl;
}

void Stack::push(int number)
{
    if(!(getSizeOfStack()==arraySize))
    {
        top ++;
        stackArray[top] = number;
    }
}


stack.h

class Stack
{
public:
    Stack();
    int *stackArray;
    int top;
    int arraySize;
    void push(int);
    void pop();
    int getSizeOfStack();
    bool isEmpty();
};

 

komentarz 14 października 2018 przez adrian17 Ekspert (344,860 p.)
Możesz proszę pokazać cały kod?
komentarz 14 października 2018 przez periedynek Obywatel (1,320 p.)
@adrian17 dodałem.

2 odpowiedzi

0 głosów
odpowiedź 14 października 2018 przez j23 Mędrzec (194,920 p.)
wybrane 14 października 2018 przez periedynek
 
Najlepsza

No a co funkcja miałaby zwracać? Nic? To, że nie dałeś return dla isEmpty == true, nie znaczy, że funkcja nie zwróci jakiejś liczby. Zapewne będzie to przypadkowa liczba, która w momencie wyskoku z funkcji znajduje się w rejestrze eax.  Kompilator też pewnie krzyczy, że brakuje mu wywołania return.

komentarz 14 października 2018 przez periedynek Obywatel (1,320 p.)
Nie rozumiem. Chodzi mi o funkcję getSizeOfStack, że zwraca -256.

Chcę by isEmpty zwracało true, jeżeli stos ma jakieś liczby, czyli zmienna top będzie inna niż -1 np. 0,1,2,.... I tak to zrobiłem właśnie. I to działa.

Funkcja getSizeOfStack jak sama nazwa wskazuje ma zwracać wielkość stosu.

Nic nie krzyczy, bo się kompiluje, prawda? W obydwu funkcjach jest przecież słowo return.

Dodałem cały kod do pytania.
komentarz 14 października 2018 przez j23 Mędrzec (194,920 p.)

W obydwu funkcjach jest przecież słowo return.

A jaki jest return w getSizeOfStack dla isEmpty() == true?

 

Nic nie krzyczy, bo się kompiluje, prawda?

Czysto, bez żadnych warningów?

komentarz 14 października 2018 przez periedynek Obywatel (1,320 p.)
Mam rozumieć, że mam dodać dwa przypadki tak?
komentarz 14 października 2018 przez j23 Mędrzec (194,920 p.)
Tak.
komentarz 14 października 2018 przez periedynek Obywatel (1,320 p.)
Dziwne to jest trochę dla mnie.... Jak warunek jest prawidłowy, to zwraca wartość jak nie, to nie robi nic... Przynajniej tak myślałem.
komentarz 14 października 2018 przez j23 Mędrzec (194,920 p.)

Zrozum, że funkcja w C++, jeśli ma zadeklarowany typ zwracany inny niż void, nie może nic nie zwrócić. Teraz masz tak, że funkcja zwraca top lub jakieś przypadkowe wartości - to ewidentny błąd.

komentarz 14 października 2018 przez periedynek Obywatel (1,320 p.)
Okej rozumiem.

Nie bardzo jeszcze wiem, czy domyślnie jest by funkcja wyświetlała 0 jak jest false a 1 jak jest true?

Z tego względu, że jak próbuje wypisać rezultat isEmpty, to wyskakuje mi 0 albo 1.
1
komentarz 14 października 2018 przez j23 Mędrzec (194,920 p.)
std::cout << std::boolalpha << isEmpty();

 

+1 głos
odpowiedź 14 października 2018 przez adrian17 Ekspert (344,860 p.)

Powinieneś dostać ostrzeżenie kompilatora:

<source>: In member function 'int Stack::getSizeOfStack()':

<source>:35:1: warning: control reaches end of non-void function [-Wreturn-type]

-256 to pewnie śmieć, który wziął się stąd, że `getSizeOfStack` nie ma `return`a w jednym z możliwych przypadków.

komentarz 14 października 2018 przez periedynek Obywatel (1,320 p.)
Nie dostaję nic. Używam codeblocksa.
komentarz 14 października 2018 przez adrian17 Ekspert (344,860 p.)
Upewnij się, że ostrzeżenia kompilatora są włączone. https://i0.wp.com/bytefreaks.net/wp-content/uploads/2011/10/Wall-CodeBlocks.png
komentarz 14 października 2018 przez periedynek Obywatel (1,320 p.)
polecasz jakieś inne środowisko? Bo zaznaczyłem i dalej jest lipa... Już i tak chciałem zmienić tego codeblocksa, bo wydaje mi sie jakbym pisał w notatniku.
komentarz 14 października 2018 przez adrian17 Ekspert (344,860 p.)
Jeśli na Windowsie, to Visual Studio jest przez wielu uważany za najlepsze IDE.
komentarz 14 października 2018 przez j23 Mędrzec (194,920 p.)
Ustawiłeś flagi -Wall i -pedantic?
komentarz 14 października 2018 przez adrian17 Ekspert (344,860 p.)
(pedantic akurat nie powinno mieć znaczenia w tym przypadku)
komentarz 14 października 2018 przez periedynek Obywatel (1,320 p.)
Dobra. Działa, ale i tak przeniosę się na Visual Studio. Dzieki.
komentarz 14 października 2018 przez j23 Mędrzec (194,920 p.)

@adrian17, nie wiem, czy nie powinno, ale wiem, że opcja ta powoduje, że kompilator jest bardziej "czepialski".

Podobne pytania

0 głosów
1 odpowiedź 198 wizyt
pytanie zadane 14 listopada 2021 w C i C++ przez pawel_000 Początkujący (450 p.)
0 głosów
1 odpowiedź 363 wizyt
pytanie zadane 19 maja 2021 w C i C++ przez hassan00 Nowicjusz (130 p.)
+4 głosów
1 odpowiedź 436 wizyt
pytanie zadane 5 lutego 2017 w C i C++ przez JAKUBW Nałogowiec (33,470 p.)

92,555 zapytań

141,403 odpowiedzi

319,557 komentarzy

61,940 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.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...