This discussion has been locked.
You can no longer post new replies to this discussion. If you have a question you can start a new discussion

Double pointer usage "freeze"

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

0