Przesyłanie wskaźników do funkcji

Przesyłanie wskaźników do funkcji
tBane
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Poznań
  • Postów: 540
0

Witam. Piszę program w C++ oraz SFML 2.X. Potrzebuję przesłać wskaźniki Terrain* do funkcji Terrain::generateBorders(). Niestety funkcja wypisuje, że przesłane wskaźniki są nullptr. Jak przesłać te wskaźniki do funkcji ?
(Jakby to było istotne to Terrain dziedziczy po sf::Drawable, public sf::Transformable)

Kopiuj

void Terrain::generateBorders( Terrain* topTerrain, Terrain* bottomTerrain, Terrain* leftTerrain, Terrain* rightTerrain) {

	outlines.clear();
	outlines.setPrimitiveType(sf::Quads);

	if (coords.x / 16 == 1 && coords.y / 16 == 1) {

		cout << "coords " << coords.x / 16 << " " << coords.y / 16 << "\n";

		if (topTerrain != nullptr)
			cout << "topTerrain exist\n";
		else
			cout << "topTerrain is null\n";

		if (bottomTerrain != nullptr)
			cout << "bottomTerrain exist\n";
		else
			cout << "bottomTerrain is null\n";

		if (leftTerrain != nullptr)
			cout << "leftTerrain exist\n";
		else
			cout << "leftTerrain is null\n";

		if (rightTerrain != nullptr)
			cout << "rightTerrain exist\n";
		else
			cout << "rightTerrain is null\n";
		
	}
}
void generateBorders() {
    Chunk* topChunk;
    Chunk* bottomChunk;
    Chunk* leftChunk;
    Chunk* rightChunk;

    Terrain* topTerrain;
    Terrain* bottomTerrain;
    Terrain* leftTerrain;
    Terrain* rightTerrain;

    int y, x;

    for (int i = 0; i < chunks.size(); i++) {

        y = i / width;
        x = i % width;

        topChunk = getChunk(x, y - 1);
        bottomChunk = getChunk(x, y + 1);
        leftChunk = getChunk(x - 1, y);
        rightChunk = getChunk(x + 1, y);
        
        if (topChunk != nullptr)
            topTerrain = topChunk->terrain;
        else
            topTerrain = nullptr;
        
        if (bottomChunk != nullptr)
            bottomTerrain = bottomChunk->terrain;
        else
            bottomTerrain = nullptr;
        
        if (leftChunk != nullptr)
            leftTerrain = leftChunk->terrain;
        else
            leftTerrain = nullptr;
        
        if (rightChunk != nullptr)
            rightTerrain = rightChunk->terrain;
        else
            rightTerrain = nullptr;

        if (topTerrain != nullptr) cout << "loaded topTerrain\n";
        if (bottomTerrain != nullptr) cout << "loaded bottomTerrain\n";
        if (leftTerrain != nullptr) cout << "loaded leftTerrain\n";
        if (rightTerrain != nullptr) cout << "loaded rightTerrain\n";

        chunks[i]->terrain->generateBorders(topTerrain, bottomTerrain, leftTerrain, rightTerrain);
    }
}
Kopiuj
loaded bottomTerrain
loaded rightTerrain
loaded bottomTerrain
loaded leftTerrain

coords 1 1
topTerrain is null
bottomTerrain is null
leftTerrain is null
rightTerrain is null

chunk 1x1 nie ma ani jednego sąsiadującego terenu a powinien mieć cztery sąsiadujące tereny

several
  • Rejestracja: dni
  • Ostatnio: dni
2

Wyrób sobie odruch by inicjalizować wskaźniki nullptr w momencie deklaracji jeśli nie inicjalizujesz ich niczym konkretnym, oszczędzi Ci to sporo zmartwień. W innym przypadku gdy masz deklarację Chunk *chunk; to później test if (chunk != nullptr) zwróci true mimo, że tak na prawdę wskaźnik nie pokazuje na żaden zasób. Zrób tak jak niżej dla wszystkich wskaźników i sprawdź co się wtedy dzieje. Poza tym, Twój output który podałeś nie pokrywa się z tym co jest w kodzie, masz powtórzony loaded bottomTerrain mimo że z kodu wynika, że tak nie powinno być w jednej iteracji.

Kopiuj
 Chunk* topChunk{nullptr};
 Chunk* bottomChunk{nullptr};
tBane
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Poznań
  • Postów: 540
0

@several problem mam z przesyłaniem tych Terenów przez funkcje. Nie wiem dlaczego z jednej strony wchodza Terrain różne od nullptr a w funkcji wszystkie są już nullptr

Dopisałem jak doradziłeś ale nic to nie zmieniło

Kopiuj
Chunk* topChunk = nullptr;
Chunk* bottomChunk = nullptr;
Chunk* leftChunk = nullptr;
Chunk* rightChunk = nullptr;

Terrain* topTerrain = nullptr;
Terrain* bottomTerrain = nullptr;
Terrain* leftTerrain = nullptr;
Terrain* rightTerrain = nullptr;
tBane
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Poznań
  • Postów: 540
0

Udało mi się przesłać te wskaźniki do funkcji:

Kopiuj
void generateBorders() {
    Chunk* topChunk = nullptr;
    Chunk* bottomChunk = nullptr;
    Chunk* leftChunk = nullptr;
    Chunk* rightChunk = nullptr;

    Terrain* topTerrain = nullptr;
    Terrain* bottomTerrain = nullptr;
    Terrain* leftTerrain = nullptr;
    Terrain* rightTerrain = nullptr;

    short y, x;

    for (int i = 0; i < chunks.size(); i++) {

        y = chunks[i]->coords.y;
        x = chunks[i]->coords.x;

        cout << x << " " << y << "\n";

        topChunk = getChunk(x, y - 1);
        bottomChunk = getChunk(x, y + 1);
        leftChunk = getChunk(x - 1, y);
        rightChunk = getChunk(x + 1, y);
        
        if (topChunk != nullptr)
            topTerrain = topChunk->terrain;
        else
            topTerrain = nullptr;
        
        if (bottomChunk != nullptr)
            bottomTerrain = bottomChunk->terrain;
        else
            bottomTerrain = nullptr;
        
        if (leftChunk != nullptr)
            leftTerrain = leftChunk->terrain;
        else
            leftTerrain = nullptr;
        
        if (rightChunk != nullptr)
            rightTerrain = rightChunk->terrain;
        else
            rightTerrain = nullptr;

        chunks[i]->terrain->generateBorders(topTerrain, bottomTerrain, leftTerrain, rightTerrain);
    }
}
several
  • Rejestracja: dni
  • Ostatnio: dni
0

Zwróciłem uwagę na ten detal jak również nie pasujący output do kodu bo z samego kodu nie wynika dlaczego miałbyś mieć problem jak opisałeś. Tak samo jak zmiana którą wykonałeś, która naprawiła Twój problem również nie tlumaczy oryginalnego problemu.

tBane
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Poznań
  • Postów: 540
0

@several problemem było, że chunki w liścia niekoniecznie muszą być uporządkowane :

Kopiuj
for( int i = 0; i < chunks.size(); i++ ) {
       
        y = i / width;
        x = i % width;
}

trzeba było zmienić na współrzędne chunków:

Kopiuj
for (int i = 0; i < chunks.size(); i++) {

    y = chunks[i]->coords.y;
    x = chunks[i]->coords.x;
}

temat do zamknięcia :-)

Marius.Maximus
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 2202
1

ZAMYKAM !
;)

several
  • Rejestracja: dni
  • Ostatnio: dni
0
tBane napisał(a):

@several problemem było, że chunki w liścia niekoniecznie muszą być uporządkowane :

Kopiuj
for( int i = 0; i < chunks.size(); i++ ) {
       
        y = i / width;
        x = i % width;
}

trzeba było zmienić na współrzędne chunków:

Kopiuj
for (int i = 0; i < chunks.size(); i++) {

    y = chunks[i]->coords.y;
    x = chunks[i]->coords.x;
}

temat do zamknięcia :-)

Co nadal nie tłumaczy problemów jakie miałeś. Ale jak Ci działa to już nie moja broszka.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.