1
// Defined three array arr0,arr1,arr2
int arr0[] = {0, 0, 0, 0, 0, 0, 0, 0};
int arr1[] = {0, 0, 0, 0, 0, 0, 0, 0};
int arr2[] = {0, 0, 0, 0, 0, 0, 0, 0};
//cord function takes binary number array as input and returns decimal 
//number to a single variable as output
int cord(int a[]) {
 int v = 0;
 for (int i = 0; i < 8; i++)
 {
 int p = 1;
 for (int j = 0; j < i; j++)
 {
 p = p * 2;
 }
 v = v + a[i] * p;
 }
 return v;
}
//function bcord takes input row & col and updates the value in arr0,arr1,arr2 to 1 wherever
// there is some value in the row and column coordinate Eg.2,0 will make 2nd index of arr0
// to 1 or 2,1 will make 2nd index of arr1 to 1
int bcord(int row[], int col[])
{
 int n = sizeof(col) / sizeof(col[0]);
 for (int i = 0; i < n; i++)
 {
 int j;
 if (col[i] == 2)
 {
 j = row[i];
 arr2[j] = 1;
 }
 if (col[i] == 1)
 {
 j = row[i];
 arr1[j] = 1;
 }
 if (col[i] == 0)
 {
 j = row[i];
 arr0[j] = 1;
 }
 }
 int led0 = cord(arr0);
 Serial.print(led0);
 int led1 = cord(arr1);
 Serial.println(led1);
 int led2 = cord(arr2);
 Serial.println(led2);
 return 0;
}
void setup()
{
 Serial.begin(9600);
 int row[] = {0, 0, 2, 2, 1};
 int col[] = {0, 1, 0, 1, 1};
 bcord(row, col);
}
void loop() {}
// Output expected is decimal numbers which are stored in led0, led1 and led2 on the serial
// monitor
asked Nov 29, 2021 at 18:55
6
  • 1
    what output are you getting? Commented Nov 29, 2021 at 19:21
  • your code is improperly formatted ... code that should be indented, isn't indented ... code that should not be indented, is indented ... it's a mess Commented Nov 29, 2021 at 19:24
  • I just used the autoindent function of the Arduino IDE. You should make more use of it, because correct indenting comes in very handy to find certain syntax errors. Commented Nov 29, 2021 at 19:47
  • Thank you jsotola, Chrisl & Edgar! But i get 57 and then 0 in next line as output. How can i get the decimal values stored in led0, led1 and led2? Commented Nov 30, 2021 at 3:18
  • "570" is correct: led0 is 5, led1 is 7 and led2 is 0. Commented Nov 30, 2021 at 8:10

1 Answer 1

3

In C++, you cannot pass an array as a parameter to a function. When you write the function prototype

int bcord(int row[], int col[], int n)

the compiler considers it a synonym of:

int bcord(int *row, int *col, int n)

In other words, both row and col are pointers, not arrays.

When you call the function like this:

bcord(row, col);

the compiler implicitly converts the call into this:

bcord(&row[0], &col[0]);

In other words, you are really passing pointers to the first element of each array. This is a standard language behavior called "decay to pointer".

When I compile your code with warnings enabled, I get the following:

In function 'int bcord(int*, int*)':
warning: 'sizeof' on array function parameter 'col'
will return size of 'int*' [-Wsizeof-array-argument]
 int n = sizeof(col) / sizeof(col[0]);
 ^
arr-ind.ino:31:30: note: declared here
 int bcord(int row[], int col[])
 ^

Thus the compiler is telling you what is wrong. The variable n is not what you expect.

The standard solution is to pass the size of the array from the caller: move the definition of n to setup(), define bcord() as:

int bcord(int row[], int col[], int n)

and call it as

bcord(row, col, n);
answered Nov 29, 2021 at 20:06

Your Answer

Draft saved
Draft discarded

Sign up or log in

Sign up using Google
Sign up using Email and Password

Post as a guest

Required, but never shown

Post as a guest

Required, but never shown

By clicking "Post Your Answer", you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.