• 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
91 wizyt
pytanie zadane 10 stycznia w C i C++ przez użytkownika milanap Nowicjusz (180 punkty)

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 użytkownika Criss Szeryf (87,500 punkty)

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 użytkownika milanap Nowicjusz (180 punkty)
Niestety mają cały czas domyślna wartość, a nie tą wylosowaną.
komentarz 10 stycznia przez użytkownika Criss Szeryf (87,500 punkty)
tzn, że nie robisz tego co byś chciał. wrzuc wiecej kodu
komentarz 10 stycznia przez użytkownika milanap Nowicjusz (180 punkty)

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 użytkownika Criss Szeryf (87,500 punkty)
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 użytkownika milanap Nowicjusz (180 punkty)
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 użytkownika Hipcio Pasjonat (22,160 punkty)
x=c;
y=d;
komentarz 10 stycznia przez użytkownika milanap Nowicjusz (180 punkty)
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 użytkownika Hipcio Pasjonat (22,160 punkty)
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 użytkownika Hipcio Pasjonat (22,160 punkty)
Pokaż cały kod może lepiej :)
komentarz 10 stycznia przez użytkownika milanap Nowicjusz (180 punkty)

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 użytkownika Hipcio Pasjonat (22,160 punkty)
Trudno się w tym połapać. Może warunek if((p[c][d]==0) nie zachodzi?
komentarz 11 stycznia przez użytkownika morele123 Gaduła (3,950 punkty)
Zobacz, gdzie zachodzi stworzenie zmiennej x.
komentarz 11 stycznia przez użytkownika milanap Nowicjusz (180 punkty)
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 użytkownika mvxxx Obywatel (1,460 punkty)
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 użytkownika Avernis Nałogowiec (26,220 punkty)
Nie rozumiem, dlaczego cię zminusowali, podałeś dobrą odpowiedź
–1 głos
odpowiedź 10 stycznia przez użytkownika morele123 Gaduła (3,950 punkty)
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
1 odpowiedź 107 wizyt
0 głosów
3 odpowiedzi 116 wizyt
pytanie zadane 6 lipca 2016 w C i C++ przez użytkownika czujek22 Bywalec (2,590 punkty)
–2 głosów
2 odpowiedzi 196 wizyt
pytanie zadane 22 marca 2016 w C i C++ przez użytkownika Karoll98 Początkujący (400 punkty)
...