Przesyłanie wskaźników do funkcji

Przesyłanie wskaźników do funkcji
tBane
  • Rejestracja:ponad rok
  • Ostatnio:25 minut
  • Lokalizacja:Poznań
  • Postów:312
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


W wolnych chwilach od codzienności programuję hobbystycznie Edytor gier RPG 2D.
Technologie, z których korzystam to C++ oraz SFML 2.6.
edytowany 3x, ostatnio: tBane
several
  • Rejestracja:prawie 16 lat
  • Ostatnio:około 4 godziny
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};

edytowany 2x, ostatnio: several
tBane
  • Rejestracja:ponad rok
  • Ostatnio:25 minut
  • Lokalizacja:Poznań
  • Postów:312
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;

W wolnych chwilach od codzienności programuję hobbystycznie Edytor gier RPG 2D.
Technologie, z których korzystam to C++ oraz SFML 2.6.
edytowany 1x, ostatnio: tBane
tBane
  • Rejestracja:ponad rok
  • Ostatnio:25 minut
  • Lokalizacja:Poznań
  • Postów:312
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);
    }
}

W wolnych chwilach od codzienności programuję hobbystycznie Edytor gier RPG 2D.
Technologie, z których korzystam to C++ oraz SFML 2.6.
edytowany 1x, ostatnio: tBane
several
  • Rejestracja:prawie 16 lat
  • Ostatnio:około 4 godziny
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:ponad rok
  • Ostatnio:25 minut
  • Lokalizacja:Poznań
  • Postów:312
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 :-)


W wolnych chwilach od codzienności programuję hobbystycznie Edytor gier RPG 2D.
Technologie, z których korzystam to C++ oraz SFML 2.6.
edytowany 1x, ostatnio: tBane
Marius.Maximus
  • Rejestracja:ponad 14 lat
  • Ostatnio:3 minuty
  • Postów:2098
1

ZAMYKAM !
;)


--
Nie przyjmuję reklamacji za moje rady, używasz na własną odpowiedzialność.
Programowanie bez formatowania to jak chodzenie ze spodniami spuszczonymi na kostki. Owszem da się ale po pierwsze nie wygodne, po drugie nieprzyzwoicie wygląda.
Przed zaczęciem nowego wątku przeczytam problem XY
several
  • Rejestracja:prawie 16 lat
  • Ostatnio:około 4 godziny
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.