How to pass an array through a function

Hello, I apologise for the noob question. I have read some answers on this subject in this forum.

I understand that the entire array is not passed by value, however it should be passed by reference.

I have tried to follow the tutorial here: http://www.cplusplus.com/doc/tutorial/arrays/

The problem is only the value at index 0 seems to be passed.

I am trying to have a function take an array of unsigned integers and determine the min, max and mean.

I'm passing in the reference to min, max, and mean to extract the values later on.

I would really appreciate any help with this! Thank you.

My code:

void Calculate(unsigned int array[], unsigned int &min, unsigned int &max, unsigned int &mean)
{  
  min = array[0];
  max = array[0];
  int size = sizeof(array) / sizeof(int); //get length of array
  for(int i = 0; i < size; i++){
  	mean += array[i];
  	if (array[i] < min)
           min = array[i];
        if (array[i] > max)
           max = array[i]; 
  }
  mean /= size; 
}

void setup()
{
  Serial.begin(9600);
  
  unsigned int min = 0, max = 0, mean = 0;
  unsigned int data[] = {13, 88, 65, 9, 108, 43};
  
  Calculate(data, min, max, mean);
  
  Serial.print("Min is: ");
  Serial.println(min);
 
  Serial.print("Max is: ");
  Serial.println(max);
  
  Serial.print("Mean is: ");
  Serial.println(mean);
}

void loop()
{

}

I did get it to work by having my data array as a global variable, and not pass it at all. That's not what I'm looking for though.

When you pass an array to a function you are actually only passing a pointer to it. As a result the size of the array is not known to the function and using sizeof() in the function will only give you the size of the pointer. If you need the size of the array in the function you must pass it as a parameter

When you pass an array to a function you are actually only passing a pointer to it. As a result the size of the array is not known to the function and using sizeof() in the function will only give you the size of the pointer. If you need the size of the array in the function you must pass it as a parameter

That makes complete sense!! Thank you very much!

You can use templates to handle the size correctly. The compiler will determine the length of the array, and then pass it on as an argument to your function:

[color=#00979c]void[/color] [color=#000000]Calculate[/color][color=#000000]([/color][color=#00979c]const[/color] [color=#00979c]unsigned[/color] [color=#00979c]int[/color] [color=#00979c]array[/color][color=#000000][[/color][color=#000000]][/color][color=#434f54],[/color] [b][color=#d35400]size_t[/color][/b] [color=#d35400]length[/color][color=#434f54],[/color]
               [color=#00979c]unsigned[/color] [color=#00979c]int[/color] [color=#434f54]&[/color][color=#d35400]min[/color][color=#434f54],[/color] [color=#00979c]unsigned[/color] [color=#00979c]int[/color] [color=#434f54]&[/color][color=#d35400]max[/color][color=#434f54],[/color]
               [color=#00979c]unsigned[/color] [color=#00979c]int[/color] [color=#434f54]&[/color][color=#000000]mean[/color][color=#000000])[/color] [color=#000000]{[/color]
  [color=#d35400]max[/color] [color=#434f54]=[/color] [color=#d35400]min[/color] [color=#434f54]=[/color] [color=#00979c]array[/color][color=#000000][[/color][color=#000000]0[/color][color=#000000]][/color][color=#000000];[/color]
  [color=#5e6d03]for[/color] [color=#000000]([/color][b][color=#d35400]size_t[/color][/b] [color=#000000]i[/color] [color=#434f54]=[/color] [color=#000000]0[/color][color=#000000];[/color] [color=#000000]i[/color] [color=#434f54]<[/color] [color=#d35400]length[/color][color=#000000];[/color] [color=#000000]i[/color][color=#434f54]++[/color][color=#000000])[/color] [color=#000000]{[/color]
    [color=#000000]mean[/color] [color=#434f54]+=[/color] [color=#00979c]array[/color][color=#000000][[/color][color=#000000]i[/color][color=#000000]][/color][color=#000000];[/color]  [color=#434f54]// might overflow[/color]
    [color=#5e6d03]if[/color] [color=#000000]([/color][color=#00979c]array[/color][color=#000000][[/color][color=#000000]i[/color][color=#000000]][/color] [color=#434f54]<[/color] [color=#d35400]min[/color][color=#000000])[/color]
      [color=#d35400]min[/color] [color=#434f54]=[/color] [color=#00979c]array[/color][color=#000000][[/color][color=#000000]i[/color][color=#000000]][/color][color=#000000];[/color]
    [color=#5e6d03]if[/color] [color=#000000]([/color][color=#00979c]array[/color][color=#000000][[/color][color=#000000]i[/color][color=#000000]][/color] [color=#434f54]>[/color] [color=#d35400]max[/color][color=#000000])[/color]
      [color=#d35400]max[/color] [color=#434f54]=[/color] [color=#00979c]array[/color][color=#000000][[/color][color=#000000]i[/color][color=#000000]][/color][color=#000000];[/color]
  [color=#000000]}[/color]
  [color=#000000]mean[/color] [color=#434f54]/=[/color] [color=#d35400]length[/color][color=#000000];[/color]
[color=#000000]}[/color]

[color=#5e6d03]template[/color] [color=#434f54]<[/color][b][color=#d35400]size_t[/color][/b] [color=#000000]N[/color][color=#434f54]>[/color] [color=#00979c]void[/color] [color=#000000]Calculate[/color][color=#000000]([/color][color=#00979c]const[/color] [color=#00979c]unsigned[/color] [color=#00979c]int[/color] [color=#000000]([/color][color=#434f54]&[/color][color=#00979c]array[/color][color=#000000])[/color][color=#000000][[/color][color=#000000]N[/color][color=#000000]][/color][color=#434f54],[/color] [color=#00979c]unsigned[/color] [color=#00979c]int[/color] [color=#434f54]&[/color][color=#d35400]min[/color][color=#434f54],[/color] [color=#00979c]unsigned[/color] [color=#00979c]int[/color] [color=#434f54]&[/color][color=#d35400]max[/color][color=#434f54],[/color] [color=#00979c]unsigned[/color] [color=#00979c]int[/color] [color=#434f54]&[/color][color=#000000]mean[/color][color=#000000])[/color] [color=#000000]{[/color]
  [color=#000000]Calculate[/color][color=#000000]([/color][color=#00979c]array[/color][color=#434f54],[/color] [color=#000000]N[/color][color=#434f54],[/color] [color=#d35400]min[/color][color=#434f54],[/color] [color=#d35400]max[/color][color=#434f54],[/color] [color=#000000]mean[/color][color=#000000])[/color][color=#000000];[/color]
[color=#000000]}[/color]

[color=#00979c]void[/color] [color=#5e6d03]setup[/color][color=#000000]([/color][color=#000000])[/color] [color=#000000]{[/color]
  [b][color=#d35400]Serial[/color][/b][color=#434f54].[/color][color=#d35400]begin[/color][color=#000000]([/color][color=#000000]9600[/color][color=#000000])[/color][color=#000000];[/color]
  [color=#5e6d03]while[/color] [color=#000000]([/color][color=#434f54]![/color][b][color=#d35400]Serial[/color][/b][color=#000000])[/color][color=#000000];[/color]

  [color=#00979c]unsigned[/color] [color=#00979c]int[/color] [color=#d35400]min[/color] [color=#434f54]=[/color] [color=#000000]0[/color][color=#434f54],[/color] [color=#d35400]max[/color] [color=#434f54]=[/color] [color=#000000]0[/color][color=#434f54],[/color] [color=#000000]mean[/color] [color=#434f54]=[/color] [color=#000000]0[/color][color=#000000];[/color]
  [color=#00979c]unsigned[/color] [color=#00979c]int[/color] [color=#000000]data[/color][color=#000000][[/color][color=#000000]][/color] [color=#434f54]=[/color] [color=#000000]{[/color][color=#000000]13[/color][color=#434f54],[/color] [color=#000000]88[/color][color=#434f54],[/color] [color=#000000]65[/color][color=#434f54],[/color] [color=#000000]9[/color][color=#434f54],[/color] [color=#000000]108[/color][color=#434f54],[/color] [color=#000000]43[/color][color=#000000]}[/color][color=#000000];[/color]

  [color=#000000]Calculate[/color][color=#000000]([/color][color=#000000]data[/color][color=#434f54],[/color] [color=#d35400]min[/color][color=#434f54],[/color] [color=#d35400]max[/color][color=#434f54],[/color] [color=#000000]mean[/color][color=#000000])[/color][color=#000000];[/color]

  [b][color=#d35400]Serial[/color][/b][color=#434f54].[/color][color=#d35400]print[/color][color=#000000]([/color][color=#005c5f]"Min is: "[/color][color=#000000])[/color][color=#000000];[/color] [b][color=#d35400]Serial[/color][/b][color=#434f54].[/color][color=#d35400]println[/color][color=#000000]([/color][color=#d35400]min[/color][color=#000000])[/color][color=#000000];[/color]
  [b][color=#d35400]Serial[/color][/b][color=#434f54].[/color][color=#d35400]print[/color][color=#000000]([/color][color=#005c5f]"Max is: "[/color][color=#000000])[/color][color=#000000];[/color] [b][color=#d35400]Serial[/color][/b][color=#434f54].[/color][color=#d35400]println[/color][color=#000000]([/color][color=#d35400]max[/color][color=#000000])[/color][color=#000000];[/color]
  [b][color=#d35400]Serial[/color][/b][color=#434f54].[/color][color=#d35400]print[/color][color=#000000]([/color][color=#005c5f]"Mean is: "[/color][color=#000000])[/color][color=#000000];[/color] [b][color=#d35400]Serial[/color][/b][color=#434f54].[/color][color=#d35400]println[/color][color=#000000]([/color][color=#000000]mean[/color][color=#000000])[/color][color=#000000];[/color]
[color=#000000]}[/color]

[color=#00979c]void[/color] [color=#5e6d03]loop[/color][color=#000000]([/color][color=#000000])[/color] [color=#000000]{[/color][color=#000000]}[/color]

Pieter

PieterP:
You can use templates to handle the size correctly. The compiler will determine the length of the array, and then pass it on as an argument to your function:

So that will not work with dynamically allocated arrays as the compiler has no idea of the size at compile time. Is there a solution for that?

Note: I'm a C programmer, not a C++ programmer.

sterretje:
So that will not work with dynamically allocated arrays as the compiler has no idea of the size at compile time. Is there a solution for that?

Note: I'm a C programmer, not a C++ programmer.

The template function won't work, no, because templates are all handled at compile time.

But there's nothing stopping you from calling the function with the size directly.
And if you're serious about dynamic arrays, you probably have some kind of RAII wrapper, so you can just add another overload for the Calculate function:

[color=#5e6d03]#include[/color] [color=#434f54]<[/color][color=#000000]vector[/color][color=#434f54]>[/color]

[color=#00979c]void[/color] [color=#000000]Calculate[/color][color=#000000]([/color][color=#00979c]const[/color] [color=#000000]std[/color][color=#434f54]:[/color][color=#434f54]:[/color][color=#000000]vector[/color][color=#434f54]<[/color][color=#00979c]unsigned[/color] [color=#00979c]int[/color][color=#434f54]>[/color] [color=#434f54]&[/color][color=#000000]vector[/color][color=#434f54],[/color] 
               [color=#00979c]unsigned[/color] [color=#00979c]int[/color] [color=#434f54]&[/color][color=#d35400]min[/color][color=#434f54],[/color] [color=#00979c]unsigned[/color] [color=#00979c]int[/color] [color=#434f54]&[/color][color=#d35400]max[/color][color=#434f54],[/color] 
               [color=#00979c]unsigned[/color] [color=#00979c]int[/color] [color=#434f54]&[/color][color=#000000]mean[/color][color=#000000])[/color] [color=#000000]{[/color]
  [color=#000000]Calculate[/color][color=#000000]([/color][color=#000000]vector[/color][color=#434f54].[/color][color=#000000]data[/color][color=#000000]([/color][color=#000000])[/color][color=#434f54],[/color] [color=#000000]vector[/color][color=#434f54].[/color][color=#d35400]size[/color][color=#000000]([/color][color=#000000])[/color][color=#434f54],[/color] [color=#d35400]min[/color][color=#434f54],[/color] [color=#d35400]max[/color][color=#434f54],[/color] [color=#000000]mean[/color][color=#000000])[/color][color=#000000];[/color]
[color=#000000]}[/color]

You can have more than one overload, one for static arrays using templates, and one for std::vector, for example.

Note: this code snippet doesn't work on AVR, because there is no support for the STL. It does work on ARM and Espressif boards.

I do appreciate @Pieter being one of most knowledgeable contributors here in the area of advanced C++ topics. Especially templates, which appear to be his weapon of choice. I always study his post to increase my abilities in using that feature (although, I still find the syntax to be butt-ugly).

However, they aren't the right answer to questions from newbies. In that case, @UKHeliBob's Solution is the way to go.

gfvalvo:
(although, I still find the syntax to be butt-ugly).

:smiley:

Amen.