We are running a survey to help us improve the experience for all of our members. If you see the survey appear, please take the time to tell us about your experience if you can.
Hello!
Iam currently working on a project with the XC2785X-104F Controller, uVision 4 and Keil C166 Compiler. Within my code i have to work with matrices and several matrix calculations. Therefor iam working with double pointers, structs and 2 dimensional arrays.
######################### Code snippet ###################
#################################### matrix struct (incl col,row)
typedef struct { int row; int col; } MATHEAD;
typedef struct { MATHEAD head; double *matrix; } MATBODY;
typedef double **MATRIX;
#define Mathead(a) ((MATHEAD *)((MATHEAD *)(a) - 1)) #define MatRow(a) (Mathead(a)->row) #define MatCol(a) (Mathead(a)->col)
############################################# struct to work with
typedef struct { MATRIX A, B, C; double var;
}structure;
############################################ func to "create" matrices
MATRIX mat_creat( row, col, type ) int row, col, type; { MATRIX A;
if ((A =_mat_creat( row, col )) != NULL) { return (mat_fill(A, type)); } else return (NULL);
return (A); }
MATRIX _mat_creat( row, col ) int row, col; { MATBODY *mat; int i;
if ((mat = (MATBODY *)malloc( sizeof(MATHEAD) + sizeof(double *) * row)) == NULL) return NULL;//(mat_error( MAT_MALLOC ));
for (i=0; i<row; i++) { if ((*((double **)(&mat->matrix) + i) = (double *)malloc(sizeof(double) * col)) == NULL) return NULL;//(mat_error( MAT_MALLOC )); }
mat->head.row = row; mat->head.col = col;
return (&(mat->matrix)); //(& ) }
########################### main.c
structure test1;
// value for var test1.var = 1.234;
// send data via uart to terminal send_uart(test1.var); // works fine
// create a 2x1 matrix with unknown data test1.A = mat_creat(2,1,UNDEFINED);
// fill matrix with values test1.A[0][0] = 0x00; // <--------- causes uC-freeze at this point
// send data via uart to terminal send_uart(test1.A[0][0]); // is not delivered send_uart("TEST\n"); // is not delivered
########################## END Code snippet ##############################
If i comment that line out (// test1.A[0][0] = 0x00;) everything works fine. If not, there is no error nor a warning from the compiler. Just a freeze on the uC.
In my eyes the error lies in the usage of the double pointer, but i can't find the mistake. Also tried the same code in eclipse with gnu c compiler and everything worked fine...
Does anybody know where the problem is? Did anyone make similar experiences??
I hope someone can help me!
thank you!
Bye, Josh
Which certainly looks like the case here:
*((double **)(&mat->matrix) + i)
Hey folks!
thanks for all the (more or less usefull) answers. Especially to Andrew!! The problem seems to be solved now. It was not a NULL returning from the mat_creat function, moreover it was the missing init_mempool function which initializes the memory management routines. Yet i do not really understand how to use this func the right way.
- Do i have to call the init_mempool(xxx) only once to reserve the memory for all my matrices? or - Do i have to call the func everytime i want memory reserved for a single (new created) matrix
I've read the article in the User Guide: but it confused me somehow ... Call the init_mempool function only once at the beginning of your program ... otherwise it is used different in that tst_init_mempool function..
So far, iam sorry to hear of some "noobish" errors in my code - i do not really have good programming skills and, unfortunately, not the time to enhance them.
Do i have to call the init_mempool(xxx) only once to reserve the memory for all my matrices?
Exactly.
i do not really have good programming skills and, unfortunately, not the time to enhance them.
If you only need to get the program running and code readability and maintainability is not a concern, then simply ignore the criticism.
"... and, unfortunately, not the time to enhance them"
But you have time to deal, like this, with the consequences?!
Which is the better use of time:
1. Throwing something together in a day, then spending a week sorting out the mess;
2. Taking a week to learn how to do it properly, then spending a day getting it right first time.
Your call!
IF this is a school project then, surely, the object of the exercise is to learn those skills?
If it's a commercial project, wouldn't it be more appropriate to hire someone who does have the required skills?