# Thread: from 2D array to 1D array

1. ## from 2D array to 1D array

Hi there,

I need to use a function that requires a 1D array in entry; to do so I created a 1D array from my original 2D array in order to pass it to the function (consider that I cannot modify the function because it's part of a library that must be kept as it is), but with the obvious waste of memory.

In fact, when I am treating very large matrices (extremely large), I get to a segmentation fault that is more than likely due to the size of the 2D array plus the new writing of the 1D vector.

I would like to pass directly the original 2D array to the function that requires a 1D array.

In this pseudo code probably my need is clearer:

Code:
```int n=... (very large number. It changes with different input files that I read from a previous part of my code)
int m=3;

//Original 2D array from my code:
double COORDS[n][5];   //Originally this array is dynamically allocated with malloc): double **VARS + dynamic allocation with malloc

//Definition of the calling function: void function(double *VARIABLES)```
This is what I am doing now before passing the required 1D array to the function; and this is where I get a segmentation fault when using extremely large arrays:

Code:
```       k = 0;
for( i = 0; i<=nnodes-1; i++){
COORDSarray[k] = COORDS[i][0];
COORDSarray[k+1] = COORDS[i][1];
COORDSarray[k+2] = 0.0;

k=k+3;
}```

As said above, I would like to pass the 2D array as if its content were to be written in a 1D array

I hope someone can help. Please, ask me if something is not clear from my description

All the best
CFD

2. What do you think, can a pointer equal a double value??
Multi-dimensional arrays are laid out as a row of logically contiguous memory locations ie 1D.

3. Hi there,

I was thinking the same thing, but I wouldn't know how to apply that concept when passing my 1D pointer to the calling function:

Code:
`function(double *COORDS)`
Would this be correct?

4. yep, that is correct.

5. Thank you, Ill try it and let u know soon

6. Originally Posted by itCbitC
yep, that is correct.
Hi again, the problem is that, given the following definitions:

Code:
```double **COORDS;

//dynamic allocation would be here ...```
and

Code:
`float function(double *array)`
How would I pass only one of the columns of **COORDS (let's say column 2) to "function"?
I cannot call it as:
Code:
`function(*COORDS[2])`
because I get an error saying : error: incompatible type for argument 1 of 'function',

nor can I call it as:
Code:
`function(*COORDS)`
which gives me a segmentation fault in execution

CFD

7. Originally Posted by cfdprogrammer
[/CODE]

How would I pass only one of the columns of **COORDS (let's say column 2) to "function"?
I cannot call it as:
Code:
`function(*COORDS[2])`
because I get an error saying : error: incompatible type for argument 1 of 'function',
Dereferencing the pointer makes it a double instead of a pointer to double.
To pass column 2 (array element at index 2??) the function call would be:
Code:
`function(COORDS[2]);`

8. An assumption was that enough memory has been allocated for each of the pointers of the array that COORDS points to; is that correct?

9. Originally Posted by itCbitC
An assumption was that enough memory has been allocated for each of the pointers of the array that COORDS points to; is that correct?
Hello again; yes, your assumption is correct, that is why I am having all this doubts about the segmentation faults that I get with very large matrices.

However, when passing the 3rd column of the matrix as you suggested

Code:
` function( COORDS[2])`
apparently I am not passing what I mean to pass, because when I print it out to screen from inside the function to verify its correctness, I do not get either of the 3 columns of that 2D array, but a strange combination of values.

I am lost

thank you again
CFD

10. Hard to tell unless you post the portion of the code that's causing the problem.

11. If you are keeping data in format A, and you need to pass it somewhere that expects format B, then there is no way around the fact that you have to convert it, which will be inefficient. Unless format B is completely bad for your own purposes, it might be better to just represent the data as format B yourself, to avoid this overhead.

12. Thank you very much for replying.
I wanted to avoid to write another array because they are extremely big ones, and I believe that is what is causing my system to crash (segmentation fault if big matrices are used).

I see what I can do in a different way

I appreciate

CFD

13. How big is the size of your array? Given that each double is 8 bytes, sizeof COORDS will be 8 x rows x cols bytes.

14. Hi,

The arrays Im using can be as big as 10000 elements; I changed all my doubles into floats to start "saving"

15. Originally Posted by cfdprogrammer
Hi,

The arrays Im using can be as big as 10000 elements; I changed all my doubles into floats to start "saving"
With 10000 elements, 8x10000 is approx. 80Kb, hardly enough to fill up the heap. Perhaps storage hasn't been allocated for first-level pointers to double.