• 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++]

–2 głosów
112 wizyt
pytanie zadane 10 stycznia 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 przez Criss VIP (114,280 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 przez milanap Nowicjusz (180 p.)
Niestety mają cały czas domyślna wartość, a nie tą wylosowaną.
komentarz 10 stycznia przez Criss VIP (114,280 p.)
tzn, że nie robisz tego co byś chciał. wrzuc wiecej kodu
komentarz 10 stycznia 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 przez Criss VIP (114,280 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 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 przez Hipcio Nałogowiec (46,440 p.)
x=c;
y=d;
komentarz 10 stycznia 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 przez Hipcio Nałogowiec (46,440 p.)
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 przez Hipcio Nałogowiec (46,440 p.)
Pokaż cały kod może lepiej :)
komentarz 10 stycznia 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 przez Hipcio Nałogowiec (46,440 p.)
Trudno się w tym połapać. Może warunek if((p[c][d]==0) nie zachodzi?
komentarz 11 stycznia przez morele123 Gaduła (4,850 p.)
Zobacz, gdzie zachodzi stworzenie zmiennej x.
komentarz 11 stycznia 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 przez VirtualMember Bywalec (2,510 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 przez Avernis Nałogowiec (26,790 p.)
Nie rozumiem, dlaczego cię zminusowali, podałeś dobrą odpowiedź
–1 głos
odpowiedź 10 stycznia przez morele123 Gaduła (4,850 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
2 odpowiedzi 78 wizyt
0 głosów
0 odpowiedzi 66 wizyt
pytanie zadane 13 grudnia 2016 w PHP, Symfony, Zend przez wanderer Bywalec (2,670 p.)
0 głosów
0 odpowiedzi 75 wizyt
Obowiązuje już zaktualizowany regulamin.

Czy wiesz, że nie musisz już odświeżać strony głównej?

Lista pytań i odpowiedzi aktualizuje się automatycznie!

38,497 zapytań

76,314 odpowiedzi

149,004 komentarzy

17,978 pasjonatów

Przeglądających: 284
Pasjonatów: 26 Gości: 258

Motyw:

Akcja Pajacyk

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

Oto dwie polecane książki warte uwagi. Pełną listę znajdziesz tutaj.

...