Почему я не получаю десятичное число в качестве выходного? Код объясняется с помощью комментариев

// 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

, 👍1

Обсуждение

какой результат вы получаете?, @jsotola

ваш код неправильно отформатирован ... код, который должен быть с отступом, не имеет отступа ... код, который не должен иметь отступа, имеет отступ ... это полный бардак, @jsotola

Я только что использовал функцию автоиндентирования Arduino IDE. Вам следует чаще использовать его, потому что правильный отступ очень удобен для поиска определенных синтаксических ошибок., @chrisl

Спасибо тебе, джсотола, Крисл и Эдгар! Но я получаю 57, а затем 0 в следующей строке в качестве вывода. Как я могу получить десятичные значения, сохраненные в led0, led1 и led2?, @Dhruv Rastogi

"570” правильно: led0 равно 5, led1 равно 7, а "led2" равно 0., @Edgar Bonet

Спасибо тебе, Эдгар, я совершенно по этому соскучился!, @Dhruv Rastogi


1 ответ


3

В C++ вы не можете передать массив в качестве параметра функции. Когда вы пишете прототип функции

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

компилятор считает это синонимом:

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

Другими словами, и строка, и столбец являются указателями, а не массивами.

Когда вы вызываете функцию следующим образом:

bcord(row, col);

компилятор неявно преобразует вызов в следующее:

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

Другими словами, вы действительно передаете указатели на первый элемент каждого массива. Это стандартное поведение языка, называемое “ переход к указателю”.

Когда я компилирую ваш код с включенными предупреждениями, я получаю следующее:

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[])
                              ^

Таким образом, компилятор говорит вам, что не так. Переменная n-это не то, что вы ожидаете.

Стандартное решение состоит в том, чтобы передать размер массива от вызывающего: переместите определение n в setup(), определите bcord() как:

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

и назовем это так

bcord(row, col, n);
,