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

Zmiana oryginalnej zmiennej przez metode [c++]

VPS Starter Arubacloud
–2 głosów
333 wizyt
pytanie zadane 10 stycznia 2017 w C i C++ przez milanap Nowicjusz (180 p.)

Dzień dobry!

Mam pewien problem:

Powiedzmy, że mam w klasie pewne zmienne przykładowo:

int x;
int y:

I w tej klasie mam metodę, która robi coś takiego:

 srand(time(NULL));
 int c = rand()%10;
 int d = rand()%10;

Jak zmienić oryginalną wartość zmiennych x, y na wartości c i d?

4 odpowiedzi

0 głosów
odpowiedź 10 stycznia 2017 przez criss Mędrzec (172,590 p.)

srand powinien być wywołany tylko raz w całym programie.

Jak zmienić oryginalną wartość zmiennych x, y na wartości c i d?

No.. przypisać wartości zmiennym x i y...  

komentarz 10 stycznia 2017 przez milanap Nowicjusz (180 p.)
Niestety mają cały czas domyślna wartość, a nie tą wylosowaną.
komentarz 10 stycznia 2017 przez criss Mędrzec (172,590 p.)
tzn, że nie robisz tego co byś chciał. wrzuc wiecej kodu
komentarz 10 stycznia 2017 przez milanap Nowicjusz (180 p.)

Fragmenty kodu

class statek   
{
protected:
 
    int ID;              
    int wlasciciel;
 
public:
    virtual void dodaj(int p[10][10])=0;   
};
 
class jednomasztowiec :public statek    
public:
 
    int zycie;
    int x_pierwszy;
    int y_pierwszy;
 
    jednomasztowiec(int=1, int=1, int=1, int=0,int=0);   
 
    void sprawdz();
    void automatycznezatapianie();
    virtual void dodaj(int p[10][10]);  
};
void jednomasztowiec::dodaj(int p[10][10])     
{
 int x;        
  srand(time(NULL)); 
 do               
 {
 int c = rand()%10;  
 int d = rand()%10;   
 if((p[c][d]==0)
    &&(p[c+1][d]==0)
    &&(p[c-1][d]==0)            
    &&(p[c][d+1]==0)
    &&(p[c][d-1]==0)
    &&(p[c+1][d+1]==0)
    &&(p[c-1][d+1]==0)
    &&(p[c+1][d-1]==0)
    &&(p[c-1][d-1]==0))
    {
    p[c][d]=1;       
    x=0;            
    x_pierwszy=c;
    y_pierwszy=d;
    }
    else
     x=1;     
 }
while(x==1);  
}
void jednomasztowiec::sprawdz()
{
ShowMessage(x_pierwszy);
ShowMessage(y_pierwszy);
}
wskj=&statek1;
  wskj->sprawdz();

I cały czas ten statek ma poczatkowe wartosci x i y czyli 5 i 5.

komentarz 11 stycznia 2017 przez criss Mędrzec (172,590 p.)
Widocznie warunek w ifie nie zostal spelniony...

Btw co jesli c lub d jest rowne 0 lub 9? Wyjdziesz poza tablice i program sie wykrzaczy.
komentarz 11 stycznia 2017 przez milanap Nowicjusz (180 p.)
Warunek jest spełniony, ogólnie cala gra działa dobrze, ale chciałem dodać, że gdy zatopimy statek to pola wokół automatycznie się zatapiają. I w tym celu chce zeby przykładowo w klasie jednomasztowiec do zmiennych x_pierwszy i y_pierwszy przypisać wylosowane w funkcji dodaj c i d, ale nie da się, cały czas maja wartosci domyslne.
0 głosów
odpowiedź 10 stycznia 2017 przez VirtualMember Pasjonat (15,790 p.)
w przypadku zmiennych spoza klasy:
class test
{

public:
void zamien(int *x, int *y)
 {
  *x = cośtam
  *y= cośtam
 }
};

//w mainie czy gdzieś tam

int a = 5;
int b = 3;

test t;

t.zamien(&a,&b);

Poczytaj o wskaźnikach

jeśli chodzi o wewnętrzne pola to po prostu w metodzie x=c y=d ale tą metodę musisz wywołać, czyli podobnie t.zamien() ale już bez argumentów bo nie będą potrzebne.

komentarz 10 stycznia 2017 przez Avernis Nałogowiec (27,400 p.)
Nie rozumiem, dlaczego cię zminusowali, podałeś dobrą odpowiedź
–1 głos
odpowiedź 10 stycznia 2017 przez niezalogowany
x=c;
y=d;
komentarz 10 stycznia 2017 przez milanap Nowicjusz (180 p.)
Gdyby to było takie proste...

Wtedy cały czas obie zmienne mają taką samą wartość (taka jaka jest domyślnie w konstruktorze). Bo z tego co rozumiem to metoda działa na kopii tych zmiennych, a ja chce na stałe zmienić ich wartość.
komentarz 10 stycznia 2017 przez niezalogowany
Czekaj czekaj, bo nie rozumiem za bardzo... Metoda działa na obiekcie i operuje na swoich (jego) bazowych oryginalnych zmiennych x,y.
komentarz 10 stycznia 2017 przez niezalogowany
Pokaż cały kod może lepiej :)
komentarz 10 stycznia 2017 przez milanap Nowicjusz (180 p.)

Wkleje fragmenty, bo jest sporo kodu:

class statek   
{
protected:

    int ID;              
    int wlasciciel;

public:
    virtual void dodaj(int p[10][10])=0;   
};

class jednomasztowiec :public statek    
public:

    int zycie;
    int x_pierwszy;
    int y_pierwszy;

    jednomasztowiec(int=1, int=1, int=1, int=0,int=0);   

    void sprawdz();
    void automatycznezatapianie();
    virtual void dodaj(int p[10][10]);  
};
void jednomasztowiec::dodaj(int p[10][10])     
{
 int x;        
  srand(time(NULL)); 
 do                
 {
 int c = rand()%10;  
 int d = rand()%10;   
 if((p[c][d]==0)
	&&(p[c+1][d]==0)
    &&(p[c-1][d]==0)            
    &&(p[c][d+1]==0)
    &&(p[c][d-1]==0)
    &&(p[c+1][d+1]==0)
    &&(p[c-1][d+1]==0)
    &&(p[c+1][d-1]==0)
    &&(p[c-1][d-1]==0))
    {
    p[c][d]=1;       
    x=0;            
    x_pierwszy=c;
    y_pierwszy=d;
    }
    else
     x=1;     
 }
while(x==1);  
}
void jednomasztowiec::sprawdz()
{
ShowMessage(x_pierwszy);
ShowMessage(y_pierwszy);
}
wskj=&statek1;
  wskj->sprawdz();

I cały czas ten statek ma poczatkowe wartosci x i y czyli 5 i 5.

komentarz 10 stycznia 2017 przez niezalogowany
Trudno się w tym połapać. Może warunek if((p[c][d]==0) nie zachodzi?
komentarz 11 stycznia 2017 przez morele123 Gaduła (4,790 p.)
Zobacz, gdzie zachodzi stworzenie zmiennej x.
komentarz 11 stycznia 2017 przez milanap Nowicjusz (180 p.)
Warunek jest spełniony, ogólnie cala gra działa dobrze, ale chciałem dodać, że gdy zatopimy statek to pola wokół automatycznie się zatapiają. I w tym celu chce zeby przykładowo w klasie jednomasztowiec do zmiennych x_pierwszy i y_pierwszy przypisać wylosowane w funkcji dodaj c i d, ale nie da się, cały czas maja wartosci domyslne.
–1 głos
odpowiedź 10 stycznia 2017 przez morele123 Gaduła (4,790 p.)
Jeżeli, twoje x,y są zmiennymi lokalnymi to użyj operatora static. Bo kiedy aplikacja opuszcza zakres zmiennej lokalnej ta jest usuwana z pamięci.

Podobne pytania

0 głosów
3 odpowiedzi 547 wizyt
0 głosów
0 odpowiedzi 109 wizyt
pytanie zadane 13 grudnia 2016 w PHP przez wanderer Gaduła (3,710 p.)

92,453 zapytań

141,262 odpowiedzi

319,088 komentarzy

61,854 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

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 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!

...