Go Down

Topic: passing arrays by reference (Read 1 time) previous topic - next topic

rigg

I am new to Arduino, but come from a c++ back ground in microsofts VS.  I am trying to pass an array into a function by reference, so that more than one function can operare on the same array.  An example of what I'm trying to do:

Quote


void function(int &);

void setup(){
  Serial.begin(9600);
  
};

void loop(){
  int counter[10];
  funtion(&cunter[]);
  for(int i=0;i<10;i++){
    Serial.println(counter);
  }
};

void function(int &functionary[]){
  for(int i=0;i<10;i++){
    funtionary=(i*10);
  }
}



At least in VS. this is how I would do it, however arduino returns an error stating 'declaration of 'ary' as array of references'.  I'm not really sure what to do as a work around.  So far I have concluded that the prototype is needed to fix a bug in arduino's auto-prototyping, and I have found several postings saying you can not return an array from a function.  Anything will help.

rigg

AlphaBeta

#1
Oct 23, 2009, 09:17 pm Last Edit: Oct 24, 2009, 02:49 am by AlphaBeta Reason: 1
Arrays (which actually are pointers) pass by reference by default.

Code: [Select]

void function(int arr[]);

void setup(){
 Serial.begin(9600);
 
}

void loop(){
 int counter[10];
 funtion(cunter);
 for(int i=0;i<10;i++){
   Serial.println(counter[i]);
 }
}

void function(int arr[]){
 for(int i=0;i<10;i++){
   arr[i]=(i*10);
 }
}

:)

Groove

I corrected the spelling, the syntax and removed the extraneous semicolons:

Code: [Select]
const int arraySize = 10;
void setup(){
 Serial.begin(9600);
}

void loop(){
 int counter[arraySize];
 function(counter);
 for(int i=0;i<arraySize;i++){
   Serial.println(counter[i]);
 }
}

void function(int *functionary){
 for(int i=0; i < arraySize; ++i){
   functionary[i]=(i*10);
 }
}
Per Arduino ad Astra

rigg

Thank you Groove i know there are some spelling mistakes in the code.  This is just a quick example of my code to clearly demonstrate the problem i was having.

AlphaBata- do the arrays pass by reference because of arduino's auto-prototype thing.  Because I tryed just running code very similer to how you have it writen and did not get anything to print to the serial line.  Should I leave off the prototype?

Thank you for your quick responce.

rigg

AlphaBeta

Because arrays are pointers, you're passing arrays by 'reference'.

You'll have to excuse my code, I was too quick on the Post button. It should be OK now.


int x[]; and
Code: [Select]
int *x; are basically the exact same.



C++ can never pass an array by value, because of the nature of how arrays work.
The variable is just a pointer to the address of the first entry.

int x[10];
Code: [Select]
x[2] is the same as
Code: [Select]
*(x+2*sizeof(int))

03:00
/me got to sleep! See you  :)

Coding Badly

#5
Oct 24, 2009, 03:36 am Last Edit: Oct 24, 2009, 03:37 am by bcook Reason: 1
Quote
pass an array into a function by reference


In C(++), that isn't necessary.  Arrays are always passed by reference.

Quote
At least in VS. this is how I would do it


No, you wouldn't.  This...

Code: [Select]
 function(&counter[]);

...produces this...

Quote
error C2059: syntax error : ']'


...in Visual Studio 2008.


If you change to a prototype with a named argument this is the result...

Code: [Select]
void function(int &functionary[]);
error C2234: 'functionary' : arrays of references are illegal



Try dropping the reference...

Code: [Select]
void function(int functionary[]);

void setup(){
 Serial.begin(9600);
 
};

void loop(){
 int counter[10];
 function(counter);
 for(int i=0;i<10;i++){
   Serial.println(counter[i]);
 }
};

void function(int functionary[]){
 for(int i=0;i<10;i++){
   functionary[i]=(i*10);
 }
}

AlphaBeta

And we arrive back to reply #1  :)

rigg: Have you solved the problem? Got some code that does what it's supposed to do?

rigg

Yes I beleive all the input has helped me solve my problem.  It is going to be a few days before I can run the code to a microcontroller, however all the compiling errors have gone away. I will let every one know how it turns out in a couple of days.

Thank you to everybody how took time to help out, this is my first time asking for help in a forum and I am very thankfull with the quick responses.

rigg

Mike Murdock

AlphaBeta,

If you have an array of, for instance, ints
Code: [Select]
int x[10];And an array reference like
Code: [Select]
i = x[2];Then the pointer equivalent would be
Code: [Select]
i = *(x + 2);There's no need to multiply by sizeof(int) -- C does this for you automatically.

Regards,

-Mike

AlphaBeta

Quote
AIf you have an array of, for instance, ints
Code: [Select]
int x[10];And an array reference like
Code: [Select]
i = x[2];Then the pointer equivalent would be
Code: [Select]
i = *(x + 2);There's no need to multiply by sizeof(int) -- C does this for you automatically.


Ah. True that.

I just came from a C code dealing with void pointers.
:-[

Go Up
 


Please enter a valid email to subscribe

Confirm your email address

We need to confirm your email address.
To complete the subscription, please click the link in the email we just sent you.

Thank you for subscribing!

Arduino
via Egeo 16
Torino, 10131
Italy