![]() |
| | #1 |
| Registered User Join Date: Mar 2009
Posts: 111
| from 2D array to 1D array 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) 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 Last edited by cfdprogrammer; 03-23-2009 at 06:21 AM. |
| cfdprogrammer is offline | |
| | #2 |
| Registered User Join Date: Oct 2008 Location: TX
Posts: 1,446
| 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. Last edited by itCbitC; 03-23-2009 at 07:26 AM. |
| itCbitC is offline | |
| | #3 |
| Registered User Join Date: Mar 2009
Posts: 111
| 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) |
| cfdprogrammer is offline | |
| | #4 |
| Registered User Join Date: Oct 2008 Location: TX
Posts: 1,446
| yep, that is correct. |
| itCbitC is offline | |
| | #5 |
| Registered User Join Date: Mar 2009
Posts: 111
| Thank you, Ill try it and let u know soon |
| cfdprogrammer is offline | |
| | #6 |
| Registered User Join Date: Mar 2009
Posts: 111
| Hi again, the problem is that, given the following definitions: Code: double **COORDS; //dynamic allocation would be here ... Code: float function(double *array) I cannot call it as: Code: function(*COORDS[2]) nor can I call it as: Code: function(*COORDS) Sorry about the many problems CFD |
| cfdprogrammer is offline | |
| | #7 | |
| Registered User Join Date: Oct 2008 Location: TX
Posts: 1,446
| Quote:
To pass column 2 (array element at index 2??) the function call would be: Code: function(COORDS[2]); | |
| itCbitC is offline | |
| | #8 |
| Registered User Join Date: Oct 2008 Location: TX
Posts: 1,446
| An assumption was that enough memory has been allocated for each of the pointers of the array that COORDS points to; is that correct? |
| itCbitC is offline | |
| | #9 | |
| Registered User Join Date: Mar 2009
Posts: 111
| Quote:
However, when passing the 3rd column of the matrix as you suggested Code: function( COORDS[2]) I am lost thank you again CFD | |
| cfdprogrammer is offline | |
| | #10 |
| Registered User Join Date: Oct 2008 Location: TX
Posts: 1,446
| Hard to tell unless you post the portion of the code that's causing the problem. |
| itCbitC is offline | |
| | #11 |
| Senior software engineer Join Date: Mar 2007 Location: Portland, OR
Posts: 5,768
| 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.
__________________ "Congratulations on your purchase. To begin using your quantum computer, set the power switch to both off and on simultaneously." -- raftpeople@slashdot |
| brewbuck is offline | |
| | #12 |
| Registered User Join Date: Mar 2009
Posts: 111
| 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 |
| cfdprogrammer is offline | |
| | #13 |
| Registered User Join Date: Oct 2008 Location: TX
Posts: 1,446
| 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. |
| itCbitC is offline | |
| | #14 |
| Registered User Join Date: Mar 2009
Posts: 111
| Hi, The arrays Im using can be as big as 10000 elements; I changed all my doubles into floats to start "saving" |
| cfdprogrammer is offline | |
| | #15 |
| Registered User Join Date: Oct 2008 Location: TX
Posts: 1,446
| 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. |
| itCbitC is offline | |
![]() |
| Thread Tools | |
| Display Modes | |
|
Similar Threads | ||||
| Thread | Thread Starter | Forum | Replies | Last Post |
| multiplying a 2D array by a 1D array | youngvito | C Programming | 14 | 06-12-2009 03:50 PM |
| 1d to 2d array | helloamuro | C Programming | 6 | 04-23-2008 06:14 PM |
| 2D array pointer? | willc0de4food | C Programming | 4 | 04-23-2006 08:16 AM |
| 1D and 2D Arrays | Rajin | C++ Programming | 2 | 04-12-2005 06:23 PM |
| two dimensional dynamic array? | ichijoji | C++ Programming | 6 | 04-14-2003 04:27 PM |