Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Kontener Vector i "vector subscript out of range"

Ostatnio zmodyfikowano 2015-08-17 22:44
Autor Wiadomość
pasierdamian
Temat założony przez niniejszego użytkownika
» 2015-08-16 23:11:22
Dzieki, dodałem linie według wskaza jednak cały czas przy debugowaniu  mam vector subscript out of range
P-136401
killjoy
» 2015-08-16 23:16:26
C/C++
for( int i = 0; i, 3; i++ )
{
    ball[ i ].Move( xSpeed * dt, ySpeed * dt );
}
 
Nie dziw, że Wychodzisz poza wektor, zerknąłem głębiej w kod i znalazłem takiego potworka. Chyba Pomyliłeś operatory w warunku pętli.
P-136402
pasierdamian
Temat założony przez niniejszego użytkownika
» 2015-08-16 23:23:13
Dzięki bardzo działa, jedno mnie tylko zastanawia, czemu otrzymałem z tyc petli tylko dwie dodatkowe kule ?


#include <iostream>
#include <vector>
#include <SFML/Graphics.hpp>
#include  "Ball.h"
#include  "Line.h"
//#include  "TextBall.h"
using namespace std;
using namespace sf;

int main()
{
RenderWindow win(VideoMode(800, 600), L"Rozdział 1");
Clock stoper;
Font font;
font.loadFromFile("arial.ttf");
float ySpeed = -50;
float xSpeed = -100;
vector<Ball> ball;
while (ball.size() < 4)
ball.push_back(Ball(win));

for (int i = 0; i < 4; i++)
{

ball[i].SetPozition(100+10*i, 50*10*i);
ball[i].Fil(Color::Yellow);
ball[i].Promien(15+2*i);
}
Ball CircleOne(win);
Line linia1(win);
linia1.sie(600, 500);
linia1.position(20, 20);
linia1.thiness(2);
Text text;
text.setFont(font);
text.setString("1");
text.setCharacterSize(15);
text.setColor(sf::Color::Black);





CircleOne.SetPozition(100, 100);
// CircleOne.SetOutlineColor(Color::Red);
CircleOne.Fil(Color::Yellow);
CircleOne.Promien(15);
// CircleOne.thinesS();

while (win.isOpen())
{
win.clear(Color::White);
Event e;
while (win.pollEvent(e))
{
if (e.type == Event::Closed)
win.close();

}
float xposition = CircleOne.GetPosition().x + CircleOne.radius()*2/3 ;
float yposition = CircleOne.GetPosition().y + CircleOne.radius()/4;
text.setPosition(xposition, yposition);

auto dt = stoper.restart().asSeconds();

CircleOne.Move(xSpeed *dt , ySpeed * dt);
for (int i = 0; i<4; i++)
{
ball[i].Move(xSpeed *dt*i, ySpeed * dt*i);
}
text.move(xSpeed *dt, ySpeed * dt);
linia1.draw();
for (int i = 0; i< 4; i++)
{
ball[i].Draw();
}
CircleOne.Draw();
win.draw(text);
for (int i = 0; i< 4; i++)
{
int positionY = ball[i].GetPosition().y;
if (positionY <= 20){ ySpeed = -ySpeed; }
if (positionY >= 520.0 - 2 * ball[i].radius()){ ySpeed = -ySpeed; }
int positionX = ball[i].GetPosition().x;
if (positionX <= 20){ xSpeed = -xSpeed; }
if (positionX >= 620.0 - 2 * ball[i].radius()){ xSpeed = -xSpeed; }

}

int positionY = CircleOne.GetPosition().y;
if (positionY <= 20){ ySpeed = -ySpeed; }
if (positionY >= 520.0-2*CircleOne.radius()){ ySpeed = -ySpeed; }
int positionX = CircleOne.GetPosition().x;
if (positionX <= 20){ xSpeed = -xSpeed; }
if (positionX >= 620.0-2*CircleOne.radius()){xSpeed = -xSpeed; }

win.display();
}
}
P-136403
pasierdamian
Temat założony przez niniejszego użytkownika
» 2015-08-17 14:37:07
W przyszłości chciałem  do vectora przekzywac arndomowe obiekty np tez square nadrzedne klasy shape, wiec, chciałbym uzyc deklaracji wielkosci vectora, gdyz ball.push_back( Ball(win) ); spowoduje tyko wrzucenie obiektów jednej klasy. Jak moge to zrobić?




Mam także problem przy przenoszeniu TextBall do innej klasy
error C2512: 'TextBall' : no appropriate default constructor available c:\program files (x86)\microsoft visual

main class

#include <iostream>
#include <vector>
#include <SFML/Graphics.hpp>
#include <cstring>
#include <cstdlib>
#include <ctime>
#include <string>
#include  "Ball.h"
#include  "Line.h"
#include <SFML/Graphics/Text.hpp>
#include  "TextBall.h"
using namespace std;
using namespace sf;;
const int balls = 49;
float xSpeed[balls];
float ySpeed[balls];
float xposition[balls];
float yposition[balls];
int pozitionx[balls];
int  pozitiony[balls];
int promien[49];

int main()
{
RenderWindow win(VideoMode(800, 600), L"Rozdział 1");
srand(time(NULL));
float xSpeeda=83.4f;
float ySpeeda=77.9f;

Clock stoper;
Font font;
font.loadFromFile("arial.ttf");

vector<Ball> ball;
vector<TextBall> tekst(49);
while (ball.size() < 49)
ball.push_back(Ball(win));
tekst.push_back(TextBall(win));

for (int i = 0; i < balls; i++)
{
promien[i] = (std::rand() % 40) + 10;
pozitionx[i] = (std::rand() % 200) + 10;
pozitiony[i] = (std::rand() % 200) + 10;
Color color1 = Color(rand() % 255, rand() % 255, rand() % 255, rand() % 255);

ySpeed[i] = (std::rand() % 100) + 50;
xSpeed[i] = (std::rand() % 100) + 50;

ball[i].SetPozition(ball[i].radius() + pozitionx[i], ball[i].radius() + pozitiony[i]);
ball[i].Fil(color1);
ball[i].Promien(promien[i]);
std::string s = std::to_string(i);

tekst[i].sFont(font);
tekst[i].sString(s);
tekst[i].sCharacterSize(promien[i]);
xposition[i] = ball[i].GetPosition().x + ball[i].radius() * 2 / 3;
yposition[i] = ball[i].GetPosition().y + ball[i].radius() / 4;
tekst[i].sColor(sf::Color::Black);
tekst[i].sPosition(xposition[i], yposition[i]);

}
Ball CircleOne(win);
Line linia1(win);
linia1.sie(600, 500);
linia1.position(20, 20);
linia1.thiness(2);





CircleOne.SetPozition(100, 100);
// CircleOne.SetOutlineColor(Color::Red);
CircleOne.Fil(Color::Yellow);
CircleOne.Promien(15);
// CircleOne.thinesS();

while (win.isOpen())
{
win.clear(Color::White);
Event e;
while (win.pollEvent(e))
{
if (e.type == Event::Closed)
win.close();

}



auto dt = stoper.restart().asSeconds();

CircleOne.Move(xSpeeda *dt , ySpeeda * dt);
for (int i = 0; i<49; i++)
{
ball[i].Move(xSpeed[i] *dt, ySpeed[i] * dt);
tekst[i].Move(xSpeed[i] *dt, ySpeed[i] * dt);
}

linia1.draw();
for (int i = 1; i< 49; i++)
{
ball[i].Draw();
tekst[i].Draw();
}
// CircleOne.Draw();

for (int i = 0; i< 49; i++)
{
int positionY = ball[i].GetPosition().y;
if (positionY <= 20){ ySpeed[i] = -ySpeed[i]; }
if (positionY >= 520.0 - 2 * ball[i].radius()){ ySpeed[i] = -ySpeed[i]; }
int positionX = ball[i].GetPosition().x;
if (positionX <= 20){ xSpeed[i] = -xSpeed[i]; }
if (positionX >= 620.0 - 2 * ball[i].radius()){ xSpeed[i] = -xSpeed[i]; }

}

int positionY = CircleOne.GetPosition().y;
if (positionY <= 20){ ySpeeda = -ySpeeda; }
if (positionY >= 520.0-2*CircleOne.radius()){ ySpeeda = -ySpeeda; }
int positionX = CircleOne.GetPosition().x;
if (positionX <= 20){ xSpeeda = -xSpeeda; }
if (positionX >= 620.0-2*CircleOne.radius()){xSpeeda = -xSpeeda; }

win.display();
}
}


oraz TextBall.h



#include <SFML/Graphics.hpp>
#include <SFML/Window.hpp>
#include <iostream>

using namespace std;
using namespace sf;

class TextBall{
public:
TextBall(RenderWindow&);
void sString(String);
void sCharacterSize(int);
void sColor(Color);
void sPosition(float, float);
void Move(float, float);
void Draw();
void sFont(Font);


private:
Text txt;
RenderWindow& Render;

};
TextBall::TextBall(sf::RenderWindow& app) : Render(app)
{

}

void TextBall::sString(String liczba)
{
txt.setString(liczba);
}
void TextBall::sCharacterSize(int size)
{
txt.setCharacterSize(size);
}
void TextBall::sColor(Color kolor)
{
txt.setColor(kolor);
}
void TextBall::sPosition(float x, float y)
{
txt.setPosition(x, y);
}
void TextBall::Move(float a, float b)
{
txt.move(a, b);
}
void TextBall::Draw()
{
Render.draw(txt);
}
void TextBall::sFont(Font fon)
{
txt.setFont(fon);
}


Gdzie mogę miec błąd?
P-136419
Monika90
» 2015-08-17 17:28:27
Zamiast tego
C/C++
vector < Ball > ball;
vector < TextBall > tekst( 49 );
while( ball.size() < 49 )
     ball.push_back( Ball( win ) );

tekst.push_back( TextBall( win ) );

to
C/C++
vector < Ball > ball( 49, Ball( win ) );
vector < TextBall > tekst( 49, TextBall( win ) );
bo po co ta pętla z push_back, jak można od razu?

W przyszłości chciałem  do vectora przekzywac arndomowe obiekty np tez square nadrzedne klasy shape
To musisz mieć wektor wskaźników np: std::vector<std::unique_ptr<Shape>> shapes;
P-136427
pasierdamian
Temat założony przez niniejszego użytkownika
» 2015-08-17 20:27:44
Dziekuje bardzo za odpowiedz, do vectora wskażnikow jeszcze wróce.

Nowa deklaracja wiekosci vectorów, pozwoliła na to by zniknął błąd jednak pojawił się nowy przy debugowaniu

Unhandled exception at 0x5DBA155F (sfml-graphics-d-2.dll) in Lotto.exe: 0xC0000005: Access violation reading location 0xCCCCCD24.
Wklejam jeszcze swojego maina


#include <iostream>
#include <vector>
#include <SFML/Graphics.hpp>
#include <cstring>
#include <cstdlib>
#include <ctime>
#include <string>
#include  "Ball.h"
#include  "Line.h"
#include <SFML/Graphics/Text.hpp>
#include  "TextBall.h"
using namespace std;
using namespace sf;;
const int balls = 49;
float xSpeed[balls];
float ySpeed[balls];
float xposition[balls];
float yposition[balls];
int pozitionx[balls];
int  pozitiony[balls];
int promien[49];

int main()
{
RenderWindow win(VideoMode(800, 600), L"Rozdział 1");
srand(time(NULL));
float xSpeeda=83.4f;
float ySpeeda=77.9f;

Clock stoper;
Font font;
font.loadFromFile("arial.ttf");
vector < Ball > ball(49, Ball(win));
vector < TextBall > tekst(49, TextBall(win));

for (int i = 0; i < balls; i++)
{
promien[i] = (std::rand() % 40) + 10;
pozitionx[i] = (std::rand() % 200) + 10;
pozitiony[i] = (std::rand() % 200) + 10;
Color color1 = Color(rand() % 255, rand() % 255, rand() % 255, rand() % 255);

ySpeed[i] = (std::rand() % 100) + 50;
xSpeed[i] = (std::rand() % 100) + 50;

ball[i].SetPozition(ball[i].radius() + pozitionx[i], ball[i].radius() + pozitiony[i]);
ball[i].Fil(color1);
ball[i].Promien(promien[i]);
std::string s = std::to_string(i);

tekst[i].sFont(font);
tekst[i].sString(s);
tekst[i].sCharacterSize(promien[i]);
xposition[i] = ball[i].GetPosition().x + ball[i].radius() * 2 / 3;
yposition[i] = ball[i].GetPosition().y + ball[i].radius() / 4;
tekst[i].sColor(sf::Color::Black);
tekst[i].sPosition(xposition[i], yposition[i]);

}
Ball CircleOne(win);
Line linia1(win);
linia1.sie(600, 500);
linia1.position(20, 20);
linia1.thiness(2);





CircleOne.SetPozition(100, 100);
// CircleOne.SetOutlineColor(Color::Red);
CircleOne.Fil(Color::Yellow);
CircleOne.Promien(15);
// CircleOne.thinesS();

while (win.isOpen())
{
win.clear(Color::White);
Event e;
while (win.pollEvent(e))
{
if (e.type == Event::Closed)
win.close();

}



auto dt = stoper.restart().asSeconds();

CircleOne.Move(xSpeeda *dt , ySpeeda * dt);
for (int i = 0; i<49; i++)
{
ball[i].Move(xSpeed[i] *dt, ySpeed[i] * dt);
tekst[i].Move(xSpeed[i] *dt, ySpeed[i] * dt);
}

linia1.draw();
for (int i = 1; i< 49; i++)
{
ball[i].Draw();
tekst[i].Draw();
}
// CircleOne.Draw();

for (int i = 0; i< 49; i++)
{
int positionY = ball[i].GetPosition().y;
if (positionY <= 20){ ySpeed[i] = -ySpeed[i]; }
if (positionY >= 520.0 - 2 * ball[i].radius()){ ySpeed[i] = -ySpeed[i]; }
int positionX = ball[i].GetPosition().x;
if (positionX <= 20){ xSpeed[i] = -xSpeed[i]; }
if (positionX >= 620.0 - 2 * ball[i].radius()){ xSpeed[i] = -xSpeed[i]; }

}

int positionY = CircleOne.GetPosition().y;
if (positionY <= 20){ ySpeeda = -ySpeeda; }
if (positionY >= 520.0-2*CircleOne.radius()){ ySpeeda = -ySpeeda; }
int positionX = CircleOne.GetPosition().x;
if (positionX <= 20){ xSpeeda = -xSpeeda; }
if (positionX >= 620.0-2*CircleOne.radius()){xSpeeda = -xSpeeda; }

win.display();
}
}
P-136437
Monika90
» 2015-08-17 22:09:19
void sFont(Font);

Przekazujesz Font przez wartość zamiast przez referencję, przez co tekst używa nieistniejącego fontu.
P-136449
pasierdamian
Temat założony przez niniejszego użytkownika
» 2015-08-17 22:21:51
Masz rację , dzieki, mam jeszcze pytanie niektóre kule w moim programie odbijaja się wzdłuż jednej z lini. po kilkudzisięciu , powiekszeniu okna lub kliknieciiu na niego kilkakrotnie sekundach wychodza po za okno, co moze byc przyczyną
P-136451
1 « 2 » 3
Poprzednia strona Strona 2 z 3 Następna strona