c++ error on arrays and pointers.

If you are a new Irrlicht Engine user, and have a newbie-question, this is the forum for you. You may also post general programming questions here.
Post Reply
SARIN
Posts: 139
Joined: Fri Oct 29, 2004 3:53 am

c++ error on arrays and pointers.

Post by SARIN »

im making a real time strategy and i have a problem. are u able to set an array as a pointer for an object? im setting it up like this;

//unit meshes
IAnimatedMesh* guymesh = smgr->getMesh("guy.3ds");

//unit arrays
IAnimatedMeshSceneNode* unita[60] = 0;

then i add an object

unita[5] = smgr->addAnimatedMeshSceneNode(guymesh);

i have found that the error is on the addanimatedmeshscenenode.
and its not a regular compiler error. the application, while starting, gives a windows error window that says "error on irrlicht.dll"
plz help. i just want to no if i can use an array in this way. if not, can u tell me any alternatives? (for RTS, dealing with units)
thx
Spintz
Posts: 1688
Joined: Thu Nov 04, 2004 3:25 pm

Post by Spintz »

as far as C++ goes, that shouldn't be a problem. Are you sure the mesh is loading properly?
SARIN
Posts: 139
Joined: Fri Oct 29, 2004 3:53 am

Post by SARIN »

ah, found my prob.

my code was actually

unita[numunita] = smgr->addAnimatedMeshSceneNode(rakermesh);

and numunita was an int. am i able to use a variable inside the pointer?
DarkWhoppy
Posts: 386
Joined: Thu Sep 25, 2003 12:43 pm
Contact:

Post by DarkWhoppy »

This is similar to IrrSED... I use an array to kep track of models and stuff... but then I tried using a 'list' from core::list<> and using scenenodes as the template... but that didn't work either.

If anyone has info on this, please reply.
Programmer of the Irrlicht Scene Editor:
Homepage - Forum Thread
Version 2 on its way!!
T101
Posts: 44
Joined: Thu Jul 29, 2004 4:41 pm

Post by T101 »

unita[numunita] = smgr->addAnimatedMeshSceneNode(rakermesh);

and numunita was an int. am i able to use a variable inside the pointer?
Yes you can use a variable for that.
But you need to make sure your variable has a correct value. You need to initialise it to 0 before you first use it - and you need to check if it does not become too big.

Also, your array initialisation looks odd.

AFAIK you cannot initialise an array's contents with that syntax. At best, the first entry (unita[0]) would be initialised to 0, the rest remain garbage.
Proper array initialisation is of the format:
IAnimatedMeshSceneNode* unita[60] ={0,0,0,0,0,0,0,0 ... etc };
SARIN
Posts: 139
Joined: Fri Oct 29, 2004 3:53 am

Post by SARIN »

no, still didnt work. here is my actual code then, from declaration to implementation (oooo, it rymes lol)

#include "Sicim.h"



//variables
int numunita = 0,numunitb,numunitc,numunitd,newunita;

//Keys
class MyEventReceiver : public IEventReceiver
{
public:
virtual bool OnEvent(SEvent event)
{

if(event.EventType == EET_KEY_INPUT_EVENT)
{
keys[event.KeyInput.Key] = event.KeyInput.PressedDown;
return true;
}
if(event.EventType == EET_MOUSE_INPUT_EVENT)
{
bool mouse[EMIE_LMOUSE_PRESSED_DOWN];
return true;
}
return false;
}
};

//main loop
int main()
{
MyEventReceiver receiver;

//the irrlicht device
IrrlichtDevice *device =
createDevice(EDT_OPENGL, dimension2d<s32>(640, 480), 16,
false, false, false, &receiver);

device->setWindowCaption(L"The Legend of Sicim");

//main stuff
IVideoDriver* driver = device->getVideoDriver();
ISceneManager* smgr = device->getSceneManager();
IGUIEnvironment* guienv = device->getGUIEnvironment();
ICameraSceneNode* cam = smgr->addCameraSceneNode(0,vector3df(0,100,0), vector3df(0,0,0));

//unit meshes
IAnimatedMesh* rakermesh = smgr->getMesh("raker.3ds");



//unit arrays
IAnimatedMeshSceneNode* unita[60] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};

//level
IAnimatedMesh* arena = smgr->getMesh("Arena.3ds");
arena->getMesh(0)->setMaterialFlag(EMF_LIGHTING, true);


//triangle selector
ISceneNode* oct = smgr->addOctTreeSceneNode(arena->getMesh(0));
ITriangleSelector* tris = smgr->createOctTreeTriangleSelector(arena->getMesh(0),oct,10);
oct->setTriangleSelector(tris);
tris->drop();

//loop
while(device->run())
{


driver->beginScene(true, true, SColor(0,0,0,0));

smgr->drawAll();
guienv->drawAll();

driver->endScene();


if(keys[KEY_ESCAPE]) device->closeDevice();
if(keys[KEY_UP])
{
vector3df campos = cam->getPosition();
campos.Z=campos.Z+1;
cam->setPosition(campos);
}
if(keys[KEY_DOWN])
{
vector3df campos = cam->getPosition();
campos.Z=campos.Z-1;
cam->setPosition(campos);
}
if(keys[KEY_LEFT])
{
vector3df campos = cam->getPosition();
campos.X=campos.X-1;
cam->setPosition(campos);
}
if(keys[KEY_RIGHT])
{
vector3df campos = cam->getPosition();
campos.X=campos.X+1;
cam->setPosition(campos);
}
if(mouse[EMIE_LMOUSE_PRESSED_DOWN])
{
newunita=1;
}


if(newunita=1) {
unita[numunita] = smgr->addAnimatedMeshSceneNode(rakermesh);
aabbox3d<f32> box = unita[numunita]->getBoundingBox();
vector3df radius = box.MaxEdge - box.getCenter();
ISceneNodeAnimatorCollisionResponse* anim = smgr->createCollisionResponseAnimator(
tris, unita[numunita], radius,
vector3df(0,0,0), 0.0f,
vector3df(0,0,0));
unita[numunita]->addAnimator(anim);

newunita=0;
++numunita;
}


}


device->drop();

return 0;
}


and, here is my small header (ya, i no, pathetic)

#include <irrlicht.h>
#include <wchar.h>
#include <stdio.h>
#include <math.h>

using namespace irr;
using namespace core;
using namespace scene;
using namespace video;
using namespace io;
using namespace gui;

#pragma comment(lib, "Irrlicht.lib")

bool keys[KEY_KEY_CODES_COUNT];
bool mouse[EMIE_LMOUSE_PRESSED_DOWN];



this is after i tried wat u said t101 (i may not have done it right still)
Spintz
Posts: 1688
Joined: Thu Nov 04, 2004 3:25 pm

Post by Spintz »

I think I see your problem.

Code: Select all

if ( newunita = 1 )
should be...

Code: Select all

if ( newunita == 1 )
The problem you're having is when the mouse button is down, you're calling that code, but you aren't checking that the value of numunita, which is quickly getting over the value of 60, which is the size of you're array of IAnimatedMeshSceneNode*'s.
SARIN
Posts: 139
Joined: Fri Oct 29, 2004 3:53 am

Post by SARIN »

THANKS!

finally, it works.
i worship all who replied (especially u spintz)

someone shoot me. i cant believe i didnt notice that.
Post Reply