Page 1 of 2
using included function crashes DS
Posted: Mon Sep 17, 2012 5:19 pm
by slenkar
here is a small example to crash the DS:
includeme.h
Code: Select all
#ifndef anims
#define anims
int new_int();
#endif
includeme.cpp
Code: Select all
int new_int()
{
int a;
return a;
}
main.cpp
Code: Select all
#include <nds.h>
#include <stdio.h>
#include <string.h>
#include "includeme.h"
int main()
{
int b=new_int();
while( 1 )
{
swiWaitForVBlank();
}
return 0;
}
Re: using included function crashes DS
Posted: Mon Sep 17, 2012 9:57 pm
by mtheall
This works as expected for me. Maybe you can describe what is a "crash"?
Re: using included function crashes DS
Posted: Tue Sep 18, 2012 12:00 am
by slenkar
I compiled with GCC , are you using microsofts compiler?
When I run the nds file in the emulator it crashes.It just says 'Rom image has crashed'
Re: using included function crashes DS
Posted: Tue Sep 18, 2012 12:41 am
by elhobbs
Emulators are not 100% accurate. What are you trying to prove with this example? Crashing an emulator is not particularly useful/meaningful in itself.
Re: using included function crashes DS
Posted: Tue Sep 18, 2012 2:39 am
by mtheall
Yes. Try a different emulator. Desmume is particularly good for testing homebrew
Re: using included function crashes DS
Posted: Tue Sep 18, 2012 2:55 pm
by slenkar
It also doesnt work on the hardware,or desmume
try adding a printf statement in the code and youll see that nothing is printed
then take out the call to the external function and it will work
Re: using included function crashes DS
Posted: Tue Sep 18, 2012 3:23 pm
by slenkar
oops I was running the wrong nds file!!
But I managed to recreate the crash succesfully now:
here is structs.h
Code: Select all
#ifndef structs
#define structs
#define one_off 1
#define torso_img 0
#define right_arm_img 1
#define right_forearm_img 2
#define left_arm_img 3
#define left_forearm_img 4
static inline void gxTranslate3f32( int32 x, int32 y, int32 z )
{
MATRIX_TRANSLATE = x;
MATRIX_TRANSLATE = y;
MATRIX_TRANSLATE = z;
}
struct image
{
int width;
int height;
int handlex;
int handley;
int img_num;
};
//torso
struct body_part
{
char* name;
int img_num;
int x_pos;
int y_pos;
int angle;
m4x4 matrix;
};
struct limb_position
{
char *bodypart;
int angle;
int x_pos;
int y_pos;
int xscale;
int yscale;
};
struct pose
{
limb_position limb_positions[30];
int num;
int pose_delay;
};
struct animation
{
char *name;
int anim_type;
int pose_delay;
int pose_timer;
pose poses[30];
};
//#define new_string(my_string) (char *)malloc(sizeof(char) * (strlen(my_string)+1));
char* new_string(const char *my_string);
struct character
{
body_part body_part_array[10];
int x_pos;
int y_pos;
};
void draw_character(character c);
#endif
here is main.cpp
Code: Select all
#include <nds.h>
#include <stdio.h>
#include "structs.h"
#include "heroanims.h"
//---------------------------------------------------------------------------------
int main(void) {
animation a =new_anim();
//---------------------------------------------------------------------------------
consoleDemoInit();
iprintf("this is a ds");
while(1) {
swiWaitForVBlank();
}
}
heroanims.h
Code: Select all
ifndef anims
#define anims
animation new_anim();
#endif
if you move new_anim in main.cpp to outside of main() it works,
it crashes when new_anim is inside main()
also if I remove a piece of the animation struct it works
Re: using included function crashes DS
Posted: Tue Sep 18, 2012 3:35 pm
by elhobbs
the stack is 16k on the ds - you have overflowed the stack. your local declarations are too big - you will need to either make the global or dynamically allocate them (malloc or new). both will put the objects in main memory instead of the stack.
as a note - I choose to ignore
if you move new_anim in main.cpp to outside of main() it works,
it crashes when new_anim is inside main()
I have no idea what this means
Re: using included function crashes DS
Posted: Tue Sep 18, 2012 4:46 pm
by mtheall
Yes definitely the you have overflowed the stack. The sizeof(animation) is 21856 bytes (quite a bit higher than the 16KB limit). Change "animation a = new_anim();" to "animation *a = new animation();" or "animation *a = (animation*)malloc(sizeof(animation));"
It appears that you have no idea what you are doing for allocations. Nobody in their right mind makes a function to allocate an object on the stack. It already happens automatically just by declaring the variable. "int b = new_int();" does not allocate a new 'b'; it is already allocated just from the "int b". All you are effectively doing is assigning to 'b' the value of 'a' from the new_int() function. Which is undefined because 'a' is uninitialized.
If you are doing exactly the same thing with new_anim(), then you are super overflowing the stack. "animation a" allocates the 21856 bytes, then in new_anim(), it allocates ANOTHER 21856 bytes;
Re: using included function crashes DS
Posted: Tue Sep 18, 2012 5:14 pm
by slenkar
oh i seee,
thanks I will be allocating everything from now on, (except maybe local ints and things like that)