• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Problem z SFML i wskaźnikiem

Object Storage Arubacloud
0 głosów
212 wizyt
pytanie zadane 6 lutego 2016 w C i C++ przez avi1999 Nowicjusz (200 p.)
void Dot::newObstacle(bool isPressed)
{
	if(isPressed == 1) mousePosStart = Mouse::getPosition(okno);
	if(isPressed == 0)
	{
		mousePosFinish = Mouse::getPosition(okno);
		int sizex, sizey;
		sizex = (mousePosStart.x>mousePosFinish.x) ? mousePosStart.x-mousePosFinish.x : mousePosFinish.x-mousePosStart.x;
		sizey = (mousePosStart.y>mousePosFinish.y) ? mousePosStart.y-mousePosFinish.y : mousePosFinish.y-mousePosStart.y;
		
		obstacle = new RectangleShape;
		obstacleCount++;

		obstacle[obstacleCount-1].setSize(Vector2f(sizex,sizey));
		obstacle[obstacleCount-1].setFillColor(Color::Red);
		obstacle[obstacleCount-1].setPosition(mousePosStart.x,mousePosStart.y);
	}
}

Witam, mam pewien problem z funkcją, która miała działać w taki sposób że, gdy kliknę lewy przycisk myszy zostają zapisane współrzędne myszy, po czym przeciągam myszkę na inną pozycję i puszczam przycisk, wtedy znów zapisywane są współrzędne i na ich podstawie jest tworzony prostokąt. Ten prostokąt jest obiektem wskaźnika obstacle i od razu chcę przypisać mu odpowiednie parametry. Tu pojawia się problem ponieważ, gdy program jest włączony, pierwszy taki prostokąt jest tworzony bez problemu ale przy drugim program przestaje działać i wyświetla mi błąd w linijce

obstacle[obstacleCount-1].setSize(Vector2f(sizex,sizey));

zmienna obstacleCount działa jak powinna czyli jest zwiększana za każdym razem gdy powstaje nowy objekt, ale w momencie gdy program próbuje edytować obstacle[1] przestaje działać

3 odpowiedzi

+2 głosów
odpowiedź 6 lutego 2016 przez mar3 Gaduła (3,040 p.)

Za każdym razem do obstacle przypisujesz adres obiektu RectangleShape,

obstacle = new RectangleShape;

a potem odwołujesz się do tego jak do tablicy.

obstacle[obstacleCount-1].setSize(Vector2f(sizex,sizey));

 

komentarz 6 lutego 2016 przez avi1999 Nowicjusz (200 p.)
Myślałem że używając new tworzę tak jakby ciąg zmiennych i mogę dostać się do nich poprzez indeks. Jeśli tak nie jest to w jaki sposób mogę dynamicznie alokować obiekty by mieć do nich dostęp?
komentarz 6 lutego 2016 przez pietrzakacper Mądrala (7,480 p.)
std::vector to kontener umożliwiający dynamiczne dodawanie obiektów
+2 głosów
odpowiedź 6 lutego 2016 przez pietrzakacper Mądrala (7,480 p.)
Za każdym razem tworzysz nowy obiekt i przypisujesz go do zerowego indeksu tablicy obstacle, program wywala błąd gdy odwołujesz się do komórki tablicy która nie istnieje. Radzę ci tutaj skorzystać z std::vector. W miejscu gdzie obsługujesz puszczenie przez użytkownika przycisku myszy twórz nowy RectangleShape o podanych paramatrach i metodą push_back() dodaj go na koniec vectora.
komentarz 6 lutego 2016 przez avi1999 Nowicjusz (200 p.)
Dziękuje za odpowiedź, teraz tylko trzeba nauczyć się używać vector'ów :)
komentarz 6 lutego 2016 przez pietrzakacper Mądrala (7,480 p.)
Jest to bardzo intuicyjne, polecam ten link : http://cpp0x.pl/dokumentacja/standard-C++/vector/819
–1 głos
odpowiedź 6 lutego 2016 przez Bravo555 Gaduła (3,970 p.)
edycja 6 lutego 2016 przez Bravo555

Do skorzystania z właściwości lub metod obiektu na który wskazuje wskaźnik stosujemy operator ->

obstacle = new RectangleShape;
obstacleCount++;
 
obstacle[obstacleCount-1]->setSize(Vector2f(sizex,sizey));
obstacle[obstacleCount-1]->setFillColor(Color::Red);
obstacle[obstacleCount-1]->setPosition(mousePosStart.x,mousePosStart.y);

 

komentarz 6 lutego 2016 przez avi1999 Nowicjusz (200 p.)
Niestety ale ten sposób także nie działa
komentarz 6 lutego 2016 przez Bravo555 Gaduła (3,970 p.)
A jaki wyrzuca błąd?
komentarz 6 lutego 2016 przez avi1999 Nowicjusz (200 p.)
Wyświetla błąd przy obstacle "expresion must have pointer type" ale już wiem że błąd był w tym że nie użyłem std::vector, ale dziękuje za pomoc :)
komentarz 6 lutego 2016 przez notabigthreat Mądrala (7,060 p.)

Poprawna (pod względem kompilowania się programu) jest kropka.

struct RectangleShape
{
    void setSize(){}
};

int main()
{
    RectangleShape* obstacle = new RectangleShape;
        //błąd kompilacji
    obstacle[3]->setSize();
        //niby poprawne, lecz znaczy to tyle, co (*(obstacle+3)).setSize();
        //pod adresem (obstacle+3) nie znajduje się poprawny obiekt
    obstacle[3].setSize();
}

 

komentarz 6 lutego 2016 przez mar3 Gaduła (3,040 p.)

To nadal jest błędne. Tak jak napisał pietrzakacper: 

Za każdym razem tworzysz nowy obiekt i przypisujesz go do zerowego indeksu tablicy obstacle, program wywala błąd gdy odwołujesz się do komórki tablicy która nie istnieje.

komentarz 6 lutego 2016 przez notabigthreat Mądrala (7,060 p.)
Przeczytaj komentarze w podanym przeze mnie programie.

Podobne pytania

0 głosów
3 odpowiedzi 283 wizyt
pytanie zadane 21 stycznia 2016 w C i C++ przez grzecho123 Początkujący (450 p.)
0 głosów
1 odpowiedź 448 wizyt
pytanie zadane 24 stycznia 2016 w C i C++ przez Whynotpeter Nowicjusz (140 p.)

92,555 zapytań

141,403 odpowiedzi

319,554 komentarzy

61,939 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...