• 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
94 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 (92,260 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 (92,260 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 (92,260 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 Nałogowiec (28,000 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 Nałogowiec (28,000 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 Nałogowiec (28,000 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 Nałogowiec (28,000 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 (4,870 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,510 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,480 punkty)
Nie rozumiem, dlaczego cię zminusowali, podałeś dobrą odpowiedź
–1 głos
odpowiedź 10 stycznia przez użytkownika morele123 Gaduła (4,870 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
2 odpowiedzi 70 wizyt
pytanie zadane 28 marca 2016 w C i C++ przez użytkownika Pixel040 Gaduła (3,010 punkty)
0 głosów
1 odpowiedź 115 wizyt
0 głosów
3 odpowiedzi 122 wizyt
pytanie zadane 6 lipca 2016 w C i C++ przez użytkownika czujek22 Gaduła (4,360 punkty)
...