Odnoszenie się do struktury utworzonej przez jedną funkcję w innej funkcji.

0

Mam takie struktury, których elementy przechowuję w tabelach. Ogólnie są to pozycje i numery pionków, które będę wykorzystywał w funkcji sprawdzającej sąsiednie pola naokoło każdego pionka. Poniższy fragment kodu znajduje się w funkcji void wspolrzedne pionka(tu tablica z pionkami).

int MAX_P = 4;	
	struct biale{
		int nr;
		int x;
		int y;
	};
	struct czarne{
		int nr;
		int x;
		int y;
	};
	biale B[MAX_P];
	czarne C[MAX_P];

Co muszę zrobić, by móc odnieść się przykładowo do B[0].x ?

0

Albo kłamiesz, albo zrobiłeś coś bez sensu. Nie wierzę, że masz ten kod w funkcji. Pokaż kod gdzie masz zadeklarowane te tablice, funkcję void wspolrzedne_pionka(), i gdzie chcesz ją wywoływać

0

Bardzo możliwe, że zrobiłem coś bez sensu, dopiero się uczę :P Aktualnie nie mam w void wspolrzedne_pionka() nic, próbowałem na kilka sposobów i zawsze coś robiłem nie tak. Zasadniczo mam po 4 pionki białe i czarne, ponumerowane od 1 do 4 dla białych i 5-8 dla czarnych.

 
void wspolrzednePionka (int Pola [12][8]){
// wspolrzedne pionkow pojda do struktur	
	int MAX_P = 4;	
	struct biale{
		int nr;
		int x;
		int y;
	};
	struct czarne{
		int nr;
		int x;
		int y;
	};
	biale B[MAX_P];
	czarne C[MAX_P];

	for (int i = 0; i < 12; i++)
		for (int j = 0; j < 8; j++){
			if (Pola[i][j] == 1){
			B[0].nr = 1;
			B[0].x = i;
			B[0].y = j;	}
			else if (Pola[i][j] == 2){
			B[1].nr = 2;
			B[1].x = i;
			B[1].y = j;	}
			else if (Pola[i][j] == 3){
			B[2].nr = 3;
			B[2].x = i;
			B[2].y = j;	}
			else if (Pola[i][j] == 4){
			B[3].nr = 4;
			B[3].x = i;
			B[3].y = j;	}
			else if (Pola[i][j] == 5){
			C[0].nr = 1;
			C[0].x = i;
			C[0].y = j;	}
			else if (Pola[i][j] == 6){
			C[1].nr = 2;
			C[1].x = i;
			C[1].y = j;	}
			else if (Pola[i][j] == 7){
			C[2].nr = 3;
			C[2].x = i;
			C[2].y = j;	}
			else {
			C[3].nr = 4;
			C[3].x = i;
			C[3].y = j;	}
			}
			return;	
}

void warunki (int Pola[12][8], int A[12][8], void wspolrzednePionka(){
	int k;
	srand(time(NULL));
	k = rand() % 6;	

for (int i = 0; i < 4; i++){
	if (A[B[i].x - 1][B[i].y + 1] = k or A[B[i].x][B[i].y + 1] = k or A[B[i].x + 1][B[i].y + 1] = k or A[B[i].x - 1][B[i].y] = k or
	    A[B[i].x + 1][B[i].y] = k or A[B[i].x - 1][B[i].y - 1] = k or A[B[i].x][B[i].y - 1] = k or A[B[i].x + 1][B[i].y - 1] = k)
	    cout << "Mozesz ruszyc pionek " << B[i].nr;
	else
		cout << "Brak mozliwych ruchow."	    
}

Próbowałem przykładowo

void warunki (int Pola[12][8], int A[12][8], void wspolrzednePionka(B[], C[], int Pola[12][8], int A[12][8], struct czarne, struct biale))

Ale wciąż dostaję informację - 'B' was not declared in this scope.

0

Od czego by zacząć :p

W c++ nie ma czegoś takiego jak or, odpowiednikiem jest ||

Jeżeli chcesz coś porównać (np. w ifie) porównujesz za pomocą == nie = czyli

f (A[B[i].x - 1][B[i].y + 1] == k ...

Robiąc w funkcji coś takiego

int MAX_P = 4;    
    struct biale{
        int nr;
        int x;
        int y;
    };
    struct czarne{
        int nr;
        int x;
        int y;
    };
    biale B[MAX_P];
    czarne C[MAX_P];

zaraz po wyjściu z niej te dwie tablice przestają istnieć. Ta funkcja ma sens, ale jak jej przekażesz w parametrach te tablice i je zaktualizujesz. Czyli definiujesz gdzieś strukturę

 struct pionek{
        int nr;
        int x;
        int y;
    };

Potem np. w mainie tworzysz dwie tablice struktur.

 pionek B[MAX_P];
    pionek C[MAX_P];

Zmieniasz nazwę funkcji aktualizującej pozycje pionków, żeby było wiadomo co ona robi i dajesz jej jeszcze dwa parametry - wcześniej stworzone tablice

void aktualizujWspolrzednePoionkow(int Pola [12][8], pionek B[], pionek C[] )

Do funkcji warunki() też dodajesz dwa parametry - tablice pionkow. Gdzieś na jej początku wywołujesz aktualizujWspolrzednePoionkow(). I potem robisz sprawdzanie.

Ale przed tym wszystkim radziłbym jednak przerobić jakiś kurs C++. A jeżeli już przerabiałeś to jeszcze raz (:

0

Racja, z tymi == się walnąłem, ale pewnie doszedłbym do tego gdy już kompilator przestałby krzyczeć o braku deklaracji B :P Co do 'or' to wykładowca mówił, że jest równoważny z || i nawet działa w innym miejscu programu. Problem jest taki, że jeśli usunę tworzenie tablic z funkcji wspolrzednePionka, to przestaje ona działać. Stosując się do Twoich porad mam teraz coś takiego:

void wspolrzednePionka (int Pola [12][8], biale B[], czarne C[]){
// wspolrzedne pionkow pojda do struktur		
	struct biale{
		int nr;
		int x;
		int y;
	};
	struct czarne{
		int nr;
		int x;
		int y;
	};	

	for (int i = 0; i < 12; i++)
		for (int j = 0; j < 8; j++){
			if (Pola[i][j] == 1){
			B[0].nr = 1;
			B[0].x = i;
			B[0].y = j;	}
			else if (Pola[i][j] == 2){
			B[1].nr = 2;
			B[1].x = i;
			B[1].y = j;	}
			else if (Pola[i][j] == 3){
			B[2].nr = 3;
			B[2].x = i;
			B[2].y = j;	}
			else if (Pola[i][j] == 4){
			B[3].nr = 4;
			B[3].x = i;
			B[3].y = j;	}
			else if (Pola[i][j] == 5){
			C[0].nr = 1;
			C[0].x = i;
			C[0].y = j;	}
			else if (Pola[i][j] == 6){
			C[1].nr = 2;
			C[1].x = i;
			C[1].y = j;	}
			else if (Pola[i][j] == 7){
			C[2].nr = 3;
			C[2].x = i;
			C[2].y = j;	}
			else {
			C[3].nr = 4;
			C[3].x = i;
			C[3].y = j;	}
			}
			return;	
}

void warunki (int Pola[12][8], int A[12][8], biale B[], czarne C[]){
	int k;
	srand(time(NULL));
	k = rand() % 6;	

for (int i = 0; i < 4; i++){
	if (A[B[i].x - 1][B[i].y + 1] == k or A[B[i].x][B[i].y + 1] == k or A[B[i].x + 1][B[i].y + 1] == k or A[B[i].x - 1][B[i].y] == k or
	    A[B[i].x + 1][B[i].y] == k or A[B[i].x - 1][B[i].y - 1] == k or A[B[i].x][B[i].y - 1] == k or A[B[i].x + 1][B[i].y - 1] == k)
	    cout << "Mozesz ruszyc pionek " << B[i].nr;
	else
		cout << "Brak mozliwych ruchow."	    
}


int main ()
{
	int MAX_P = 4;
	biale B[MAX_P];
	czarne C[MAX_P];
	ustawPiony (Pola);
	wypiszTabela (A, Pola, Rzedy, Kolumny);
	wspolrzednePionka (Pola, biale B[] , czarne C[]);
	warunki (Pola, A, wspolrzednePionka)
} 

Teraz otrzymuję błędy: "biale has not been declared" oraz "czarne has not been declared".

e: Przerobiłem to jeszcze dokładniej stosując się do Twoich instrukcji, teraz działa ale wymagało to wrzucenia deklaracji struktury globalnie, a problem polega na tym, że u mnie musi być w funkcji.

1 użytkowników online, w tym zalogowanych: 0, gości: 1