user623990
user623990

Reputation:

Passing a pointer to an array of arrays to a function

I have a main function which sets up the following variables:

double matrix[numVectors][size] = {
    {0.183963, 0.933146, 0.476773, 0.086125, 0.566566, 0.728107, 0.837345, 0.885175, 0.600559, 0.142238},
    {0.086523, 0.025236, 0.252289, 0.089437, 0.382081, 0.420934, 0.038498, 0.626125, 0.468158, 0.247754},
    {0.969345, 0.127753, 0.736213, 0.264992, 0.518971, 0.216767, 0.390992, 0.242241, 0.516135, 0.990155}
};

double result1[size], result2[size];

double *ptr_matrix  = &matrix[0];
double *ptr_result1 = &result1[0];
double *ptr_result2 = &result2[0];

What the above is trying to do is:

Then, I'm trying to pass all three pointers to another function. This other function will iterate over the matrix rows (only the rows, it doesn't visit the whole matrix space), perform a computation using the row (as an array). The end result is the two empty arrays declared at the beginning end up each becoming one row from the matrix.

Here is the prototype of the second function:

void smallestSum(double (*mat)[size], int num, double *first, double *second)

This function goes through each combination of the matrix rows (0/1, 0/2, 1/2) and checks the sums of their values. The two arrays producing the smallest sum eventually become result1 and result2 from above.

Seeing as this is the first time I'm really delving into pointer/array/matrix territory, I have a few questions:

Upvotes: 0

Views: 100

Answers (2)

aducore
aducore

Reputation: 31

The answer abacabadabacaba gave is mostly correct except that size does not need to be known at compile time. If you include size as a parameter to the function you can use it as part of the type for other parameters to that function:

void smallestSum(int size, double (*mat)[size], int num, double *first, double *second)

Upvotes: 0

abacabadabacaba
abacabadabacaba

Reputation: 2692

You need to change the definition of ptr_matrix, as it's not a pointer to a single double, but to the whole row:

double (*ptr_matrix)[size] = &matrix[0];

Then, you can call the function as follows:

smallestSum(ptr_matrix, numVectors, ptr_result1, ptr_result_2);

Inside smallestSum, you can iterate both over rows and over columns.

Note that size must be known at compilation time.

If the function doesn't modify the matrix, consider adding const to the type of its first argument.

Upvotes: 1

Related Questions