For a prototype of the form ReadMatrix(float **A, int n, file input-file); //Definition-Old you need to return as int the dimension i.e. int ReadMatrix(float **A, int n, file input-file) { //do whatever return(dimension-read-from-input-file); } i.e. dimension n is not used. If you want to change it and store it in the parameters you need to change V------attentionhere ReadMatrix(float **A, int *n, file input-file); //Definition-New In that case you can have ReadMatrix as void. void ReadMatrix(float **A, int n, file input-file) { //do whatever *n =dimension-read-from-input-file; } For the other **A yes you define a float *A; and call ReadMatrix(&A, &n,input-file) //Definition-New However A is a pointer to a pointer to a float. The following definition is WRONG A = (float**)malloc(sizeof(float)*nMatrixSize*nMatrixSize); in the sense that the block allocated has an address (first byte) available through (float*)malloc(sizeof(float)*nMatrixSize*nMatrixSize); but that address is not stored in a variable whose address could then be accessed through by a & . The correct way is to do ReadMatrix(float **A, int *n ... ) { { float * MyA; MyA = (float *) blah blah; *A = myA; //returns in *A the address of the block allocated. } ----- HW 3 (only Programming 1) has been updated to reflect to Definition-New definition. Java users won't be affected, and C/C++ users can still use the old definition if so desire (by returning the dimension as return date). alex -- Tue 17 Oct, 2:29pm