Hi

I'm adapting some code I've written using 2d arrays (to represent matrices) to handle large arrays such that double matrix[][] goes to double **matrix and then I'm using malloc.

It seems to work fine for part of my program up to where I have to find the matrix transpose at which point it does something I don't understand. I've taken that bit of code out and run it by itself (included below), get the same problem and still can't work out why. Can anyone help??
Thanks
jbd

``````int find_transpose(int n, double **a, double **b)
{
int i,j;
for (i=0; i<n; i++)
{
for (j=0; j<n; j++)
b[i][j] = a[i][j];
}
for (i=0; i<n; i++)
{
for (j=0; j<n; j++)
b[i][j] = a[j][i];
}

}

int main (void)
{

int i, j, p=3;
double **in, **out;

in = malloc(p * sizeof(int *));
out = malloc(p * sizeof(int *));

for (i=0;  i<p; i++){
in[i]= malloc(p * sizeof(int *));
out[i]= malloc(p * sizeof(int *));}

for (i=0;  i<p; i++)
{
for (j=0;  j<p; j++)
{in[i][j]= 10./(i+1);
printf("in[%i][%i] = %f\n", i, j, in[i][j]);
}
}

find_transpose(p, in, out);

for (i=0;  i<p; i++)
{
for (j=0;  j<p; j++)
printf("in[%i][%i] = %f\n", i, j, in[i][j]);
}

for (i=0;  i<p; i++)
{
for (j=0;  j<p; j++)
printf("out[%i][%i] = %f\n", i, j, out[i][j]);
}

return``````

What does not work? Does it gives you compile errors? Does it crashes?

I corrected minor syntactical errors in your code. I did not check the logic. Check following code.

``````#include<stdio.h>
#include<stdlib.h>

int find_transpose(int n, double **a, double **b)
{
int i,j;
for (i=0; i<n; i++)
{
for (j=0; j<n; j++)
b[i][j] = a[i][j];
}
for (i=0; i<n; i++)
{
for (j=0; j<n; j++)
b[i][j] = a[j][i];
}
return 0;
}

int main (void)
{

int i, j, p=3;
double **in, **out;

in = (double **)malloc(p * sizeof(int *));
out = (double **)malloc(p * sizeof(int *));

for (i=0; i<p; i++){
in[i]= (double *)malloc(p * sizeof(int *));
out[i]= (double *)malloc(p * sizeof(int *));}

for (i=0; i<p; i++)
{
for (j=0; j<p; j++)
{in[i][j]= 10./(i+1);
printf("in[%i][%i] = %f\n", i, j, in[i][j]);
}
}

find_transpose(p, in, out);

for (i=0; i<p; i++)
{
for (j=0; j<p; j++)
printf("in[%i][%i] = %f\n", i, j, in[i][j]);
}

for (i=0; i<p; i++)
{
for (j=0; j<p; j++)
printf("out[%i][%i] = %f\n", i, j, out[i][j]);
}

return 0;
}``````

Still getting same problem... which is that the input matrix is getting modified when the function is called, here's an example for a test 3 by 3:
The input is:in[0][0] = 10.000000
in[0][1] = 10.000000
in[0][2] = 10.000000
in[1][0] = 5.000000
in[1][1] = 5.000000
in[1][2] = 5.000000
in[2][0] = 3.333333
in[2][1] = 3.333333
in[2][2] = 3.333333

but after being passed to find_transpose is comes out as:in[0][0] = 10.000000
in[0][1] = 10.000000
in[0][2] = 10.000000
in[1][0] = 10.000000
in[1][1] = 5.000000
in[1][2] = 10.000000
in[2][0] = 3.333333
in[2][1] = 3.333333
in[2][2] = 10.000000

and the actual transpose output is:
out[0][0] = 10.000000
out[0][1] = 10.000000
out[0][2] = 10.000000
out[1][0] = 10.000000
out[1][1] = 5.000000
out[1][2] = 3.333333
out[2][0] = 10.000000
out[2][1] = 10.000000
out[2][2] = 10.000000

I really don't understand why!?

Thanks
jbd

Going off of dubydapreek's revision:

• Lines 7..11: Useless. Get rid of them. (You don't need to copy b to a before you copy b to a.)
• Lines 27..28: You should be allocating an array of (double *).
• Lines 31..32: You should be allocating an array of (double).

As a rule, when using malloc(), it should look something like: `[B]type[/B] *foo = ([B]type[/B] *)malloc( n *sizeof( [B]type[/B] ) );` where "type" is whatever type you need it to be. In your case, "type" is first (double*) then it is (double).

Hope this helps.

Be a part of the DaniWeb community

We're a friendly, industry-focused community of developers, IT pros, digital marketers, and technology enthusiasts meeting, networking, learning, and sharing knowledge.