Czy da się jakoś dostać iterator na który wskazuje zmienna referencyjna w rfor

0
	for (const auto& row : Points)
		for (const auto& col : row)
			if (isMouseInsideRect(mousePos, col))
			{
				//tutaj chce dostać pozycję 
				//na której jest iterator w tablicy dwuwymiarowej, x i y
				int y = std::distance(Points.begin(), ...);
				int x = std::distance(row.begin(), ...);
			}

z tym by był banał ale w sumie to nwm co lepiej użyć


	for (int i = 0; i != 16; i++)
		for (int j= 0; j != 16; j++)

bo Points to array i wiem jaki mają rozmiar

0

Nie, ale jeśli to wektory/tablic/inne kontenery z ciągłymi danymi to możesz użyć wskaźników:

    for (const auto& row : Points)
        for (const auto& col : row)
            if (isMouseInsideRect(mousePos, col))
            {
                //tutaj chce dostać pozycję 
                //na której jest iterator w tablicy dwuwymiarowej, x i y
                int y = std::distance(Points.data(), &row);
                int x = std::distance(row.data(), &col);
            }

PS: co to rfor?

0

Bez tytułu.png

0

W sumie to mam jeszcze dwa pytania,
Jak przerwać podwójną pętlę (na stacku przeczytałem że to jedyna sytuacja w której mozna użyć goto x D, ale zrobiłem to z flagą. Może jakiś inny pomysł?)

oraz czy dobrze jest użyć tutaj tych funkcji ? Czy nie lepiej właśnie motyw z i i j.

0

Niestety, C++ nie ma break n, więc goto wydaje się tutaj akceptowalnym rozwiązaniem.

Co do użycia: zrób to co będzie czytelniejsze w Twojej ocenie. Ewentualnie zastanów się, czy indeksy są tutaj kluczowe, czy raczej na dokładkę (np. tylko debug print).

0

Nie bangla, data() nie zwraca consta
Bez tytułu.png

0

Jak nie jak tak? https://en.cppreference.com/w/cpp/container/array/data

Zamiast tego użyj &foo[0].

0

Chyba format kompa x D
Bez tytułu.png

				const auto *p = &Points[0];
				std::distance(p, &row);

tak działa

0

Czekaj, to nie .data() było problemem.

    for (const auto& row : Points)
        for (const auto& col : row)
            if (isMouseInsideRect(mousePos, col))
            {
                //tutaj chce dostać pozycję 
                //na której jest iterator w tablicy dwuwymiarowej, x i y
                auto const* points_begin = Points.data();
                int y = std::distance(points_begin, &row);
                int x = std::distance(row.data(), &col);
            }
0

niuanse niuansiki ... Chyba przejdę na pythona...
Points.data() zwracało stałą wartość a nie stały wskaźnik tak?
Mimo że właśnie zwracana wartość była wskaźnikiem pokazująca na consty ?

0

Zakładam, że Points nie jest const u Ciebie. Problemem było to, że szablon distance oczekuje tego samego typu obu parametrów, a tu się nie zgadzało.

1

To chyba jest nieco problem XY, bo ja tutaj bym zastosował znany z Pythona pattern:
https://infektor.net/posts/2017-03-31-range-based-enumerate.html

2
kameleo327 napisał(a):
	for (const auto& row : Points)
		for (const auto& col : row)
			if (isMouseInsideRect(mousePos, col))
			{
				//tutaj chce dostać pozycję 
				//na której jest iterator w tablicy dwuwymiarowej, x i y
				int y = std::distance(Points.begin(), ...);
				int x = std::distance(row.begin(), ...);
			}

z tym by był banał ale w sumie to nwm co lepiej użyć


	for (int i = 0; i != 16; i++)
		for (int j= 0; j != 16; j++)

bo Points to array i wiem jaki mają rozmiar

Patrzę na to i patrzę i tak się zastanawiam:
@kameleo327: czy ty przypadkiem nie masz siatki (szachownicy) i szukasz, które pole zostało kliknięte? (bo te pętle od zera do 15 coś takiego sugerują).
Jeśli tak, to nie możesz po prostu na podstawie pozycji myszy obliczyć indeksów pola, bez używania pętli!

Też mi to wygląda na problem XY.

0

title

Tak to wyglądało jakiś czas temu.
Jeżeli kliknąłem to sprawczam czy myszka nie znalazła się w jakimś prostokącie. Teraz pracuje nad tym, że gdy narysuję ścianę(tak, te białe linie to ściany) to program sprawdzi czy nie nakładają się i czy ich nie połączyć w jedno.
Przy czym ustawiłem warunek że można rysować tylko w pionie bądź w poziomie.
Projekt to symulator microMouse

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