| irdufresh Temat założony przez niniejszego użytkownika | [SFML 2.3.2] problem z kompilacją kodu  error  przy   enemyArray.erase(iter4); » 2015-11-28 23:38:25 Witam zainteresowanych  Po kolei na youtubie znalazłem ciekawy tutorial do SFML //www.youtube.com/watch?v=M5B4faQXHkE&list=PLx2OWCj5oxNMf0g1ggEzcboCzdYYFuXF6&index=11 w do odcinka 9 wszystko działa perfekt ale w 10 po 6,19min wpisany jest kod : counter = 0;for( iter4 = enemyArray.begin(); iter4 != enemyArray.end(); iter4++ )
 {
 if( enemyArray[ counter ].alive == false )
 {
 enemyArray.erase( iter4 );
 break;
 }
 counter++;
 }
i tu problem przy próbie kompilacji wyskakuje mi wiadomość  ||=== Build: Debug in x1 (compiler: GNU GCC Compiler) ===|D:\...\main.cpp||In function 'int main()':|
 D:\...\main.cpp|154|error: no matching function for call to 'std::vector<enemy>::erase()'|
 D:\...\main.cpp|154|note: candidates are:|
 d:\..\lib\gcc\mingw32\4.7.1\include\c++\bits\vector.tcc|135|note: std::vector<_Tp, _Alloc>::iterator std::vector<_Tp, _Alloc>::erase(std::vector<_Tp, _Alloc>::iterator) [with _Tp = enemy; _Alloc = std::allocator<enemy>; std::vector<_Tp, _Alloc>::iterator = __gnu_cxx::__normal_iterator<enemy*, std::vector<enemy> >; typename std::_Vector_base<_Tp, _Alloc>::pointer = enemy*]|
 d:\..\lib\gcc\mingw32\4.7.1\include\c++\bits\vector.tcc|135|note:   candidate expects 1 argument, 0 provided|
 d:\..\lib\gcc\mingw32\4.7.1\include\c++\bits\vector.tcc|147|note: std::vector<_Tp, _Alloc>::iterator std::vector<_Tp, _Alloc>::erase(std::vector<_Tp, _Alloc>::iterator, std::vector<_Tp, _Alloc>::iterator) [with _Tp = enemy; _Alloc = std::allocator<enemy>; std::vector<_Tp, _Alloc>::iterator = __gnu_cxx::__normal_iterator<enemy*, std::vector<enemy> >; typename std::_Vector_base<_Tp, _Alloc>::pointer = enemy*]|
 d:\..\lib\gcc\mingw32\4.7.1\include\c++\bits\vector.tcc|147|note:   candidate expects 2 arguments, 0 provided|
 D:\...\main.cpp|36|warning: unused variable 'playerMovementSpeed' [-Wunused-variable]|
 D:\...\main.cpp|37|warning: unused variable 'counterWalking' [-Wunused-variable]|
 D:\...\main.cpp|40|warning: unused variable 'counter3' [-Wunused-variable]|
 ||=== Build failed: 1 error(s), 3 warning(s) (0 minute(s), 0 second(s)) ===|
 Dodam że na oglondanym tutorialu wszystko działa ? u mnie do momenu wpisania tego kodu też? cały main 
 
 
 
 
 
 
 
 
 
 
 
 
 
 #include <SFML/Audio.hpp>
 #include <SFML/Graphics.hpp>
 using namespace std;
 #include <iostream>
 
 
 
 
 #include "random.h"
 #include "player.h"
 #include "entity.h"
 #include "projectile.h"
 #include "enemy.h"
 #include <vector>
 
 
 int main()
 {
 
 float playerMovementSpeed = 2;
 int counterWalking = 0;
 int counter = 0;
 int counter2 = 0;
 int counter3 = 0;
 
 
 sf::RenderWindow window( sf::VideoMode( 1000, 800 ), "I want to learn SFML! W00tsaurs" );
 window.setFramerateLimit( 60 );
 
 sf::Texture textureEnemy;
 if( !textureEnemy.loadFromFile( "D:\\nn.png" ) ) {
 return EXIT_FAILURE;
 }
 
 
 sf::Texture texturePlayer;
 if( !texturePlayer.loadFromFile( "D:\\nn.png" ) ) {
 return EXIT_FAILURE;
 }
 sf::Sprite spritePlayer( texturePlayer );
 spritePlayer.setPosition( window.getSize().x / 2, window.getSize().y / 2 );
 spritePlayer.setTextureRect( sf::IntRect( 0, 0, 32, 32 ) );
 
 
 sf::Font font;
 if( !font.loadFromFile( "D:\\nn.ttf" ) ) {
 return EXIT_FAILURE;
 }
 sf::Text text( "Zoomafu!1obe", font, 25 );
 text.setColor( sf::Color::White );
 text.setCharacterSize( 50 );
 text.setPosition( 300, 300 );
 
 
 
 
 
 
 
 
 
 
 
 class player Player1;
 Player1.sprite.setTexture( texturePlayer );
 
 
 
 vector < projectile >::const_iterator iter;
 vector < projectile > projectileArray;
 
 
 class projectile projectile1;
 
 
 
 vector < enemy >::const_iterator iter4;
 vector < enemy > enemyArray;
 
 
 class enemy enemy1;
 enemy1.sprite.setTexture( textureEnemy );
 
 
 enemy1.rect.setPosition( 600, 200 );
 enemyArray.push_back( enemy1 );
 
 
 
 
 
 while( window.isOpen() )
 {
 
 sf::Event event;
 while( window.pollEvent( event ) )
 {
 
 if( event.type == sf::Event::Closed ) {
 window.close();
 }
 
 
 if( event.type == sf::Event::KeyPressed && event.key.code == sf::Keyboard::Escape ) {
 window.close();
 }
 }
 
 
 window.clear();
 
 
 counter = 0;
 for( iter = projectileArray.begin(); iter != projectileArray.end(); iter++ )
 {
 counter2 = 0;
 for( iter4 = enemyArray.begin(); iter4 != enemyArray.end(); iter4++ )
 {
 if( projectileArray[ counter ].rect.getGlobalBounds().intersects( enemyArray[ counter2 ].rect.getGlobalBounds() ) )
 
 cout << "BOOOOOMMMM  !!!!!" << endl;
 
 enemyArray[ counter2 ].hp--;
 if( enemyArray[ counter2 ].hp <= 0 )
 {
 enemyArray[ counter2 ].alive == false;
 }
 counter2++;
 }
 counter++;
 }
 
 counter = 0;
 for( iter4 = enemyArray.begin(); iter4 != enemyArray.end(); iter4++ )
 {
 if( enemyArray[ counter ].alive == false )
 {
 enemyArray.erase( iter4 );
 break;
 }
 counter++;
 }
 
 
 
 if( sf::Keyboard::isKeyPressed( sf::Keyboard::Y ) )
 {
 enemy1.rect.setPosition( generateRandom( window.getSize().x ), generateRandom( window.getSize().y ) );
 enemyArray.push_back( enemy1 );
 }
 
 
 
 
 
 
 if( sf::Keyboard::isKeyPressed( sf::Keyboard::Space ) )
 {
 projectile1.rect.setPosition( Player1.rect.getPosition().x + Player1.rect.getSize().x / 2 - projectile1.rect.getSize().x / 2, Player1.rect.getPosition().y + Player1.rect.getSize().y / 2 - projectile1.rect.getSize().y / 2 );
 projectile1.direction = Player1.direction;
 projectileArray.push_back( projectile1 );
 }
 
 
 counter = 0;
 for( iter = projectileArray.begin(); iter != projectileArray.end(); iter++ )
 {
 projectileArray[ counter ].update();
 window.draw( projectileArray[ counter ].rect );
 
 counter++;
 }
 
 
 counter = 0;
 for( iter4 = enemyArray.begin(); iter4 != enemyArray.end(); iter4++ )
 {
 enemyArray[ counter ].update();
 enemyArray[ counter ].updateMovement();
 
 window.draw( enemyArray[ counter ].sprite );
 
 counter++;
 }
 
 
 Player1.update();
 Player1.updateMovement();
 
 
 window.draw( Player1.sprite );
 
 
 
 window.display();
 }
 
 return EXIT_SUCCESS;
 }
 | 
|  | 
| j23 | » 2015-11-29 09:51:06 Prawdopodobnie problem jest w tym, że iter4 jest typu const_iterator, a erase w wersji sprzed C++11 oczekuje typu iterator. Przestaw kompilator (w opcjach projektu) na nowy standard lub zmień typ iteratora. | 
|  | 
| pekfos | » 2015-11-29 12:28:56 Nie ucz się z kursów youtube. W każdych kursach mogą się zdarzyć błędy, a na filmach nikt ich nie poprawi. Do tego kursy na youtube nie mają zwykle zbyt wysokiej jakości. | 
|  | 
| irdufresh Temat założony przez niniejszego użytkownika | » 2015-11-29 14:49:07 mam ustawiony kompilator na C++ 11a co do zmiany const_iterator na iterator to czy nie spowoduje to potem błędów z linią kodu powyżej:
 
 - "enemyArray[counter2].hp--;"
 - "enemyArray[counter2].alive == false;"
 | 
|  | 
| pekfos | » 2015-11-29 15:42:13 | czy nie spowoduje to potem błędów z linią kodu powyżej: 
 - "enemyArray[counter2].hp--;"
 - "enemyArray[counter2].alive == false;"
 | 
 Te linie nawet nie używają tego iteratora. Po co w ogóle pytasz, czy nie spowoduje to błędu, skoro możesz to w 5 sekund sam sprawdzić..? | 
|  | 
| irdufresh Temat założony przez niniejszego użytkownika | » 2015-11-29 16:02:06 Prawda sprawdziłem i okazało sie że to nie dział  nie mam pojęcia dlaczego to działa na przykladzie z youtuba skoro robie wszystko tak samo a linie kodu oznaczyłem"///" nie współpracują po prost niewiem gdzie jest błąd 
 counter = 0;
 for( iter = projectileArray.begin(); iter != projectileArray.end(); iter++ )
 {
 counter2 = 0;
 for( iter4 = enemyArray.begin(); iter4 != enemyArray.end(); iter4++ )
 {
 if( projectileArray[ counter ].rect.getGlobalBounds().intersects( enemyArray[ counter2 ].rect.getGlobalBounds() ) )
 {
 enemyArray[ counter2 ].hp--;
 
 if( enemyArray[ counter2 ].hp <= 0 )
 {
 enemyArray[ counter2 ].alive == false;
 
 }
 }
 counter2++;
 }
 counter++;
 }
 
 counter = 0;
 for( iter4 = enemyArray.begin(); iter4 != enemyArray.end(); iter4++ )
 {
 if( enemyArray[ counter ].alive == false )
 {
 enemyArray.erase( iter4 );
 break;
 }
 counter++;
 }
 | 
|  | 
| irdufresh Temat założony przez niniejszego użytkownika | » 2015-11-29 16:32:41 Dobra  po zmianie iteratora z  const_iterator   na   iteratot   błąd znikł -( dzięki za podpowiedz)  a co do kodu poniżej to zrobiłem błąd == zamiast =,    całoś teraz działa poprawnie  ( zapis const_iteratot nie pozwala na zmiany ,a zapis iterator tak -czy dobże to rozumiem)  counter = 0;
 for( iter = projectileArray.begin(); iter != projectileArray.end(); iter++ )
 {
 counter2 = 0;
 for( iter4 = enemyArray.begin(); iter4 != enemyArray.end(); iter4++ )
 {
 if( projectileArray[ counter ].rect.getGlobalBounds().intersects( enemyArray[ counter2 ].rect.getGlobalBounds() ) )
 {
 enemyArray[ counter2 ].hp--;
 
 if( enemyArray[ counter2 ].hp <= 0 )
 {
 enemyArray[ counter2 ].alive == false;
 
 }
 }
 counter2++;
 }
 counter++;
 }
 
 counter = 0;
 for( iter4 = enemyArray.begin(); iter4 != enemyArray.end(); iter4++ )
 {
 if( enemyArray[ counter ].alive == false )
 {
 enemyArray.erase( iter4 );
 break;
 }
 counter++;
 }
Jeszcze raz dzięki za drobne porady | 
|  | 
| « 1 » |