CodeGuru Home VC++ / MFC / C++ .NET / C# Visual Basic VB Forums Developer.com
Page 1 of 2 12 LastLast
Results 1 to 15 of 25
  1. #1
    Join Date
    Mar 2009
    Posts
    14

    Exclamation Vector, class, and iterator issues

    Hello, I'm new to this forum.

    I'm making a Combat addon fro the space flight simulator, orbiter (www.orbitersim.com). You include compiled libraries to make the addons. I'm pretty sure my problem is not orbiter specific, though. Here is the code that is causing my error:

    Code:
    DLLCLBK void opcPreStep(double simt, double simdt, double mjd)
    {
    	//loop through all weapons, and destroy them.
    	for (vector<Weapon>::iterator it = WeaponList.begin(); it != WeaponList.end();++it)
      {
    	 it->explode();
    	}
    };
    opcPreStep is called by the core every timestep. WeaponList is a vector of the Weapon class.
    I compile my addon, and I get a crash to desktop. If I change it to *it, I get an illegal indirection error. can anyone help? thanks.

  2. #2
    Join Date
    Jun 2006
    Location
    M31
    Posts
    885

    Re: Vector, class, and iterator issues

    1. Thanks for using code tags.
    2. The problem isn't in the snippet that you've posted.
    3. Lose the last semicolon.
    4. After you've fixed the underlying issue, if all you're doing is calling destroy in opcPreStep, then you can replace your for-loop with the cleaner std::for_each variant:
      Code:
      std::for_each(WeaponList.begin(), WeaponList.end(), std::mem_fun_ref(&Weapon::explode));

  3. #3
    Join Date
    Mar 2009
    Posts
    14

    Re: Vector, class, and iterator issues

    Quote Originally Posted by Plasmator View Post
    1. Thanks for using code tags.
    2. The problem isn't in the snippet that you've posted.
    3. Lose the last semicolon.
    4. After you've fixed the underlying issue, if all you're doing is calling destroy in opcPreStep, then you can replace your for-loop with the cleaner std::for_each variant:
      Code:
      std::for_each(WeaponList.begin(), WeaponList.end(), std::mem_fun_ref(&Weapon::explode));
    Thank you for the quick reply.

    Where do you think the problem lies, then? Persumably the WeaponList vector? Or perhaps the Weapon class?
    Here is the declaration of the weapon class;
    Code:
    //The Weapon class.
    class Weapon {
    	//for safety, all variables are accessed privately.
    private:
    int FireVesselIndex;
    const char *explodemesh;													//A mesh to  be spawned on explosion.
    const char *name;															//The name of the weapon.
    const char *classname;														//Classname (CFG File) of the vessel to be 'fired'
    
    bool missile;																//Whether it's a missile (full throttle on fire) or not.
    bool exploded;																//Whether the vessel has exploded or not.
    bool fired;																	//Whether the vessel has been fired or not.
    
    public:
    
    Weapon(const char *newname,const char *newclassname, bool newmissile);		//Constructor.
    ~Weapon() {}																//Destructor.
    
    bool fire();																//The fire function.
    bool explode();																//The explode function - replaces the current mesh with the explosion mesh.
    
    //Update status function.
    void UpdateStatus() {
    	this->vessel->GetStatusEx(&stat);
    }
    OBJHANDLE objvessel;					//The OBJHANDLE for the weapon.
    VESSEL *vessel;							//The VESSEL handle for the weapon.
    VESSELSTATUS2 stat;						//The current status of the weapon. Given properties on fire.
    //Set functions- for changing private data.
    void SetExplodeMesh(const char*newexplodemesh){
    	explodemesh=newexplodemesh;
    }
    };
    You may not recognise some data types, such as OBJHANDLE etc - they are ORbiter specific.

    Thanks for helping.

  4. #4
    Join Date
    Oct 2002
    Location
    Austria
    Posts
    1,284

    Re: Vector, class, and iterator issues

    The Weapon class with all that pointer members should propably have a copy constructor and an assignement operator.
    But then it seems to be incomplete and I can't tell for shure.
    Kurt

  5. #5
    Join Date
    Jun 2006
    Location
    M31
    Posts
    885

    Re: Vector, class, and iterator issues

    As ZuK pointed out, there's not enough information to determine the root cause of your problem(s).
    Having said that, start taking advantage of standard facilities such as std::string -- they'll make your life a lot easier.

    P.S.: Debuggers are very useful tools.

  6. #6
    Join Date
    Mar 2009
    Posts
    14

    Re: Vector, class, and iterator issues

    Quote Originally Posted by Plasmator View Post
    As ZuK pointed out, there's not enough information to determine the root cause of your problem(s).
    Having said that, start taking advantage of standard facilities such as std::string -- they'll make your life a lot easier.

    P.S.: Debuggers are very useful tools.
    I have to use const char, because that's what the APIs require. I can't use a debugger either, because Orbiter has no built in debugging information.

    EDIT: more info on my problem;

    I can run an empty iterating loop through the vector fine, I only get a CTD after using a member function of the iterator's class (Weapon). I've checked that there is nothig wrong with explode().

    The initialisation of the vector:
    Code:
    //This vector contains all Weapons in the scenario. Weapons are added on construction.
    vector <Weapon> WeaponList;
    ANOTHER EDIT:
    Ok, I've managed to get vc's debugger working with orbiter - got this -
    First-chance exception at 0x00414d6c in orbiter.exe: 0xC0000005: Access violation reading location 0xc304d107.
    Unhandled exception at 0x00414d6c in orbiter.exe: 0xC0000005: Access violation reading location 0xc304d107.
    First-chance exception at 0x00414d6c in orbiter.exe: 0xC0000005: Access violation reading location 0xc304d107.
    Unhandled exception at 0x00414d6c in orbiter.exe: 0xC0000005: Access violation reading location 0xc304d107.
    First-chance exception at 0x00414d6c in orbiter.exe: 0xC0000005: Access violation reading location 0xc304d107.
    Unhandled exception at 0x00414d6c in orbiter.exe: 0xC0000005: Access violation reading location 0xc304d107.
    First-chance exception at 0x00414d6c in orbiter.exe: 0xC0000005: Access violation reading location 0xc304d107.
    Unhandled exception at 0x00414d6c in orbiter.exe: 0xC0000005: Access violation reading location 0xc304d107.
    First-chance exception at 0x00414d6c in orbiter.exe: 0xC0000005: Access violation reading location 0xc304d107.
    Unhandled exception at 0x00414d6c in orbiter.exe: 0xC0000005: Access violation reading location 0xc304d107.
    First-chance exception at 0x00414d6c in orbiter.exe: 0xC0000005: Access violation reading location 0xc304d107.
    Unhandled exception at 0x00414d6c in orbiter.exe: 0xC0000005: Access violation reading location 0xc304d107.
    First-chance exception at 0x00414d6c in orbiter.exe: 0xC0000005: Access violation reading location 0xc304d107.
    Unhandled exception at 0x00414d6c in orbiter.exe: 0xC0000005: Access violation reading location 0xc304d107.
    Last edited by Escapetomsfate; March 17th, 2009 at 02:15 PM.

  7. #7
    Join Date
    Jan 2006
    Location
    Singapore
    Posts
    6,765

    Re: Vector, class, and iterator issues

    Quote Originally Posted by Escapetomsfate
    I have to use const char, because that's what the APIs require.
    You can get a const char* from a std::string by way of the c_str() member function.
    C + C++ Compiler: MinGW port of GCC
    Build + Version Control System: SCons + Bazaar

    Look up a C/C++ Reference and learn How To Ask Questions The Smart Way
    Kindly rate my posts if you found them useful

  8. #8
    Join Date
    May 2007
    Posts
    811

    Re: Vector, class, and iterator issues

    Quote Originally Posted by Escapetomsfate View Post
    I have to use const char, because that's what the APIs require. I can't use a debugger either, because Orbiter has no built in debugging information.

    EDIT: more info on my problem;

    I can run an empty iterating loop through the vector fine, I only get a CTD after using a member function of the iterator's class (Weapon). I've checked that there is nothig wrong with explode().

    The initialisation of the vector:
    Code:
    //This vector contains all Weapons in the scenario. Weapons are added on construction.
    vector <Weapon> WeaponList;
    Then use this:
    Code:
    std::string someString = "My foo is great";
    // some API function which takes const char * as a argument
    void somAPIFoo(const char *text);
    // and you call this like this:
    somAPIFoo(someString .c_str());

  9. #9
    Join Date
    May 2007
    Posts
    811

    Re: Vector, class, and iterator issues

    Quote Originally Posted by Escapetomsfate View Post
    I have to use const char, because that's what the APIs require. I can't use a debugger either, because Orbiter has no built in debugging information.

    EDIT: more info on my problem;

    I can run an empty iterating loop through the vector fine, I only get a CTD after using a member function of the iterator's class (Weapon). I've checked that there is nothig wrong with explode().

    The initialisation of the vector:
    Code:
    //This vector contains all Weapons in the scenario. Weapons are added on construction.
    vector <Weapon> WeaponList;
    Then use this:
    Code:
    std::string someString = "My foo is great";
    // some API function which takes const char * as a argument
    void somAPIFoo(const char *text);
    // and you call this like this:
    somAPIFoo(someString.c_str());

  10. #10
    Join Date
    Mar 2009
    Posts
    14

    Re: Vector, class, and iterator issues

    Quote Originally Posted by STLDude View Post
    Then use this:
    Code:
    std::string someString = "My foo is great";
    // some API function which takes const char * as a argument
    void somAPIFoo(const char *text);
    // and you call this like this:
    somAPIFoo(someString.c_str());
    Can I ask why it is necessary to use std::string and then convert, when you can just pass a const char?

    I've been learning c++ for a month or so, and I don't really understand why some functions are 'safer' than others- can someone please explain?

  11. #11
    Join Date
    Jan 2006
    Location
    Singapore
    Posts
    6,765

    Re: Vector, class, and iterator issues

    Quote Originally Posted by Escapetomsfate
    Can I ask why it is necessary to use std::string and then convert, when you can just pass a const char?
    So you are relieved of the burden of memory management. Also, when you do need to manipulate strings other than with the API that you are using, it tends to be safer and easier due to the functions provided.
    C + C++ Compiler: MinGW port of GCC
    Build + Version Control System: SCons + Bazaar

    Look up a C/C++ Reference and learn How To Ask Questions The Smart Way
    Kindly rate my posts if you found them useful

  12. #12
    Lindley is offline Elite Member Power Poster
    Join Date
    Oct 2007
    Location
    Seattle, WA
    Posts
    10,895

    Re: Vector, class, and iterator issues

    When dealing with char arrays, you either have to settle for fixed-size arrays (limiting your string length), or else you need to use dynamic allocation (new/delete or malloc/free) to make sure you always have a big enough array.

    For numerous reasons, getting dynamic allocation "right" in complex cases is nontrivial. Even experts can screw it up---don't allocate enough space and have a buffer overrun, forget to allocate a new array in a class's copy constructor, or simply fail to delete an array and end up with a memory leak. It's a pain.

    std::string wraps all that difficult logic up in a clean, easy-to-use container that it's hard to screw up with.

  13. #13
    Join Date
    Jun 2006
    Location
    M31
    Posts
    885

    Re: Vector, class, and iterator issues

    OP: you should be able to step through your code with the help of VS's debugger as long as your binary exposes debug symbols.
    You can either use a hard breakpoint (i.e., the VS JIT-Debugger dialog will be spawned), or attach to your target process (see the "Attach to Process" under Tools) and wait for an IDE breakpoint to be hit.

    As I said earlier, debuggers are useful tools...

  14. #14
    Join Date
    Mar 2009
    Posts
    14

    Re: Vector, class, and iterator issues

    Quote Originally Posted by Plasmator View Post
    OP: you should be able to step through your code with the help of VS's debugger as long as your binary exposes debug symbols.
    You can either use a hard breakpoint (i.e., the VS JIT-Debugger dialog will be spawned), or attach to your target process (see the "Attach to Process" under Tools) and wait for an IDE breakpoint to be hit.

    As I said earlier, debuggers are useful tools...
    Can you do this with DLLs? that's what I'm making.

  15. #15
    Join Date
    Jun 2006
    Location
    M31
    Posts
    885

    Re: Vector, class, and iterator issues

    Quote Originally Posted by Escapetomsfate View Post
    Can you do this with DLLs?
    Aye.
    Quote Originally Posted by Escapetomsfate View Post
    that's what I'm making.
    Yes, this was evident from your first post.

Page 1 of 2 12 LastLast

Tags for this Thread

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •  





Click Here to Expand Forum to Full Width

Featured