# from 2D array to 1D array

Show 80 post(s) from this thread on one page
Page 1 of 2 12 Last
• 03-23-2009
cfdprogrammer
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
• 03-23-2009
itCbitC
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.
• 03-23-2009
cfdprogrammer
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?
• 03-23-2009
itCbitC
yep, that is correct.
• 03-23-2009
cfdprogrammer
Thank you, Ill try it and let u know soon
• 03-23-2009
cfdprogrammer
Quote:

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
• 03-23-2009
itCbitC
Quote:

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]);`
• 03-23-2009
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?
• 03-23-2009
cfdprogrammer
Quote:

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
• 03-23-2009
itCbitC
Hard to tell unless you post the portion of the code that's causing the problem.
• 03-23-2009
brewbuck
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.
• 03-23-2009
cfdprogrammer
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
• 03-23-2009
itCbitC
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.
• 03-24-2009
cfdprogrammer
Hi,

The arrays Im using can be as big as 10000 elements; I changed all my doubles into floats to start "saving"
• 03-24-2009
itCbitC
Quote:

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.
Show 80 post(s) from this thread on one page
Page 1 of 2 12 Last