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

[SFML 2.3.2] problem z kompilacją kodu error przy enemyArray.erase(iter4);

Ostatnio zmodyfikowano 2015-11-29 16:32
Autor Wiadomość
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 :
C/C++
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
C/C++
//
// Disclamer:
// ----------
//
// This code will work only if you selected window, graphics and audio.
//
// Note that the "Run Script" build phase will copy the required frameworks
// or dylibs to your application bundle so you can execute it on any OS X
// computer.
//
// Your resource files (images, sounds, fonts, ...) are also copied to your
// application bundle. To get the path to these resource, use the helper
// method resourcePath() from ResourcePath.hpp
//

#include <SFML/Audio.hpp>
#include <SFML/Graphics.hpp>
using namespace std;
#include <iostream>

// Here is a small helper for you ! Have a look.
//#include "ResourcePath.hpp"

#include "random.h"
#include "player.h"
#include "entity.h"
#include "projectile.h"
#include "enemy.h"
#include <vector>

//int main(int, char const**)
int main()
{
    // Variables
    float playerMovementSpeed = 2;
    int counterWalking = 0;
    int counter = 0;
    int counter2 = 0;
    int counter3 = 0;
   
    // Create the main window
    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;
    }
   
    // Load a sprite to display
    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 ) );
   
    // Create a graphical text to display
    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 );
   
    /*   // Load a music to play
        sf::Music music;
        if (!music.openFromFile( "D:\\nn.ogg")) {
            return EXIT_FAILURE;
        }
    */
    // Play the music
    //music.play();
   
    // Class Object
    class player Player1;
    Player1.sprite.setTexture( texturePlayer );
   
   
    // Projectile Vector Array
    vector < projectile >::const_iterator iter;
    vector < projectile > projectileArray;
   
    // Projectile Object
    class projectile projectile1;
   
   
    // Enemy Vector Array
    vector < enemy >::const_iterator iter4;
    vector < enemy > enemyArray;
   
    // Enemy ObjectA
    class enemy enemy1;
    enemy1.sprite.setTexture( textureEnemy );
    //enemy1.sprite.setTextureRect(sf::IntRect(0, 0, 32, 32));
   
    enemy1.rect.setPosition( 600, 200 );
    enemyArray.push_back( enemy1 );
   
   
   
   
    // Start the game loop
    while( window.isOpen() )
    {
        // Process events
        sf::Event event;
        while( window.pollEvent( event ) )
        {
            // Close window: exit
            if( event.type == sf::Event::Closed ) {
                window.close();
            }
           
            // Escape pressed: exit
            if( event.type == sf::Event::KeyPressed && event.key.code == sf::Keyboard::Escape ) {
                window.close();
            }
        }
       
        // Clear screen
        window.clear();
       
        // projectile collide with enemy
        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++;
        }
        //==========================   Po wpisaniu  ( dopisaniu) tego wyskakuje mi błąd         =====================
        counter = 0;
        for( iter4 = enemyArray.begin(); iter4 != enemyArray.end(); iter4++ )
        {
            if( enemyArray[ counter ].alive == false )
            {
                enemyArray.erase( iter4 ); /// =================  tu!
                break;
            }
            counter++;
        }
        //===============================================================================================================================
       
        // Fires Missle (Space bar)
        if( sf::Keyboard::isKeyPressed( sf::Keyboard::Y ) )
        {
            enemy1.rect.setPosition( generateRandom( window.getSize().x ), generateRandom( window.getSize().y ) );
            enemyArray.push_back( enemy1 );
        }
       
       
       
       
       
        // Fires Missle (Space bar)
        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 );
        }
       
        // Draw Projectiles
        counter = 0;
        for( iter = projectileArray.begin(); iter != projectileArray.end(); iter++ )
        {
            projectileArray[ counter ].update(); // Update Projectile
            window.draw( projectileArray[ counter ].rect );
           
            counter++;
        }
       
        // Draw Enemies
        counter = 0;
        for( iter4 = enemyArray.begin(); iter4 != enemyArray.end(); iter4++ )
        {
            enemyArray[ counter ].update();
            enemyArray[ counter ].updateMovement();
            //window.draw(enemyArray[counter].rect);
            window.draw( enemyArray[ counter ].sprite );
           
            counter++;
        }
       
        // Update Player
        Player1.update();
        Player1.updateMovement();
       
        // Draw Player
        window.draw( Player1.sprite );
        //window.draw(Player1.rect);
       
        // Update the window
        window.display();
    }
   
    return EXIT_SUCCESS;
}
P-141044
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.
P-141052
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.
P-141057
irdufresh
Temat założony przez niniejszego użytkownika
» 2015-11-29 14:49:07
mam ustawiony kompilator na C++ 11
a 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;"
P-141078
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ć..?
P-141084
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

C/C++
//

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; ///   TU i
               
            }
        }
        counter2++;
    }
    counter++;
}

counter = 0;
for( iter4 = enemyArray.begin(); iter4 != enemyArray.end(); iter4++ )
{
    if( enemyArray[ counter ].alive == false ) ///   TU
    {
        enemyArray.erase( iter4 );
        break;
    }
    counter++;
}
P-141090
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)

C/C++
//
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; ///   zmieniłem na " enemyArray[ counter2 ].alive = false;"  działa!?
               
            }
        }
        counter2++;
    }
    counter++;
}

counter = 0;
for( iter4 = enemyArray.begin(); iter4 != enemyArray.end(); iter4++ )
{
    if( enemyArray[ counter ].alive == false ) ///   TU
    {
        enemyArray.erase( iter4 );
        break;
    }
    counter++;
}


Jeszcze raz dzięki za drobne porady
P-141096
« 1 »
  Strona 1 z 1