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

Program działa, jednak wskaźniki dają dziwne liczby

Object Storage Arubacloud
0 głosów
444 wizyt
pytanie zadane 5 sierpnia 2016 w C i C++ przez Piotr Lis Obywatel (1,310 p.)
#include <iostream>
#include <time.h>
#include <cstdlib>
#include <windows.h>
#include <algorithm>
#include <string>
using namespace std;
string agree; //odpowiedz
int nie()
{
            std::cout << "No to Pa, Pa" << endl;
system("pause");
exit(0);
}
int tak()
{
int liczba_prob = 0;
int*w;
w = &liczba_prob;

int liczba;
int*liczba_w;
liczba_w = &liczba;

*w++;

            std::cout << *w << ". Rzut odbedzie sie za: \n" << endl;
for(int i=3;i>=1;i--)
    {
Sleep(1000);
Beep(1200,361);
            std::cout << i << endl;
    }
system("cls");
srand(time(NULL));
*liczba_w=rand()%6+1;
            std::cout << "Wylosowana liczba to " << *liczba_w << endl;
            std::cout << "Czy chcesz losowac " << *w+1 << " raz ?" << endl;
            std::cout << "\tTAK/NIE" << endl;                    std::cin >> agree;
transform(agree.begin(), agree.end(), agree.begin(), ::toupper);
system("cls");
if(agree=="TAK")
            {
            tak();
            }
}




int main()
{
            std::cout << "Witaj w symulatorze rzutu kostka !" << endl;
            std::cout << "\nCzy chcesz wykonac pierwszy rzut ?" << endl;
            std::cout << "\tTAK/NIE" << endl;
                    cin >> agree;
                    system("cls");
transform(agree.begin(), agree.end(), agree.begin(), ::toupper);
            if(agree=="TAK")
            {
            tak();
            }
                     if(agree=="NIE")
                     {
                     nie();
                      }
                              if((agree!="TAK")&&(agree!="NIE"))
                               {
                               do
                               {
            std::cout << "\tNapisz TAK lub NIE" << endl;
                    cin >> agree;
            system("cls");
transform(agree.begin(), agree.end(), agree.begin(), ::toupper);
            if(agree=="TAK")
            {
            tak();
            }
            if(agree=="NIE")
            {
            nie();
            }
            }while((agree!="TAK")&&(agree!="NIE"));
            }
}

 

 

Witam, mam pytanie, mianowicie w owym kodzie nie ma żadnych błędów, a pokazują się jakieś nie stworzone liczby. Z góry dziękuje za wszystkie udzielone odpowiedzi i pozdrawiam. wink

komentarz 5 sierpnia 2016 przez QizmoPL Stary wyjadacz (11,440 p.)
jezeli jest problem to jest blad w kodzie

4 odpowiedzi

+1 głos
odpowiedź 5 sierpnia 2016 przez Pac Plus Mądrala (5,560 p.)
edycja 5 sierpnia 2016 przez Pac Plus
 
Najlepsza

'*w ++' nie ma efektu na wskaźniku. Musisz użyć poprawnego zapisu arytmicznego.

int *w;
int liczba_prob = 0;
w = &liczba_prob;
	 
*w = *w + 1;
//albo
*w += 1;
	 
cout << *w << ". Rzut odbedzie sie za: \n" << endl;

 

komentarz 5 sierpnia 2016 przez Pac Plus Mądrala (5,560 p.)

Bwe. nigdy nie przypisuj wskaźnikom zmiennych bez wartości jak tutaj:

int liczba;

int*liczba_w;

liczba_w = &liczba;

komentarz 5 sierpnia 2016 przez niezalogowany
a możesz powiedzieć czemu??
komentarz 5 sierpnia 2016 przez Piotr Lis Obywatel (1,310 p.)

Mam jeszcze małe pytanie, mianowicie dlaczego, gdy *w podlega inkrementacji to ta liczba nie zmienia się za każdym literacją pętli do...while ?

 

Próba 1:

 

 

Próba 2:

 

 

komentarz 5 sierpnia 2016 przez Pac Plus Mądrala (5,560 p.)

A używasz zapisu który podałem? Jeśli wskaźnik wskazuje pustą zmienną może się rozsypać program, może np. wskazywać jakieś miejsce w pamięci które już nie należy do danego programu. Jestem pewien, że Binki wytłumaczy ci więcej o wskaźnikach http://cslibrary.stanford.edu/104/.

komentarz 5 sierpnia 2016 przez Piotr Lis Obywatel (1,310 p.)

Tak użyłem nie ma błędów, lecz cały czas jest ta sama cyfra przy numerze rzutu indecision

komentarz 5 sierpnia 2016 przez Pac Plus Mądrala (5,560 p.)
Kompilator nie podepnie za ciebie wskaźników, to nie znaczy że nie ma błędu gdy wszystko się kompiluje ;). Pokarz fragment kodu który powinien iterować zmienną przez referencje.
komentarz 5 sierpnia 2016 przez Piotr Lis Obywatel (1,310 p.)
int tak()
{
int liczba_prob = 0;
int*w;
w = &liczba_prob;

int liczba;
int*liczba_w;
liczba_w = &liczba;
*w = *w + 1;
            std::cout << *w << ". Rzut odbedzie sie za: \n" << endl;
for(int i=3;i>=1;i--)
    {
Sleep(1000);
Beep(1200,361);
            std::cout << i << endl;
    }
system("cls");
srand(time(NULL));
*liczba_w=rand()%6+1;
            std::cout << "Wylosowana liczba to " << *liczba_w << endl;
            std::cout << "Czy chcesz losowac " << *w+1 << " raz ?" << endl;
            std::cout << "\tTAK/NIE" << endl;
                std::cin >> agree;
transform(agree.begin(), agree.end(), agree.begin(), ::toupper);
system("cls");

 

(To jest część funkcji)

1
komentarz 5 sierpnia 2016 przez Pac Plus Mądrala (5,560 p.)
int liczba_prob = 0;
int*w;
w = &liczba_prob;

Za karzdym razem na początku funkcji zerujesz wskazywaną wartość.

+1 głos
odpowiedź 5 sierpnia 2016 przez dziki indyk Użytkownik (940 p.)
zamiast:
*w++;
*w+1;

pisz tak:
*w += 1;
(*w) + 1;

jest czytelniej i masz pewność co do kolejności operacji.
0 głosów
odpowiedź 5 sierpnia 2016 przez Avernis Nałogowiec (27,400 p.)
Sprawdź czy zadziała *wskaźnik = &zmienna;
0 głosów
odpowiedź 5 sierpnia 2016 przez Piotr Lis Obywatel (1,310 p.)

Serdecznie dziękuje wszystkim za odpowiedzi wink

Podobne pytania

+2 głosów
3 odpowiedzi 2,980 wizyt
0 głosów
4 odpowiedzi 496 wizyt
pytanie zadane 24 lutego 2016 w C i C++ przez Owczarek Niemiecki Obywatel (1,570 p.)

92,579 zapytań

141,432 odpowiedzi

319,663 komentarzy

61,964 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!

...