Почему я не получаю десятичное число в качестве выходного? Код объясняется с помощью комментариев
// 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
@Dhruv Rastogi, 👍1
Обсуждение1 ответ
В 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);
- C++ против языка Arduino?
- avrdude ser_open() can't set com-state
- Как читать и записывать EEPROM в ESP8266
- Float печатается только 2 десятичных знака после запятой
- устаревшее преобразование из строковой константы в 'char*'
- Запрограммировать ATMega328P и использовать его без платы Arduino.
- Разница между print() и println()
- Как исправить: Invalid conversion from 'const char*' to 'char*' [-fpermissive]
какой результат вы получаете?, @jsotola
ваш код неправильно отформатирован ... код, который должен быть с отступом, не имеет отступа ... код, который не должен иметь отступа, имеет отступ ... это полный бардак, @jsotola
Я только что использовал функцию автоиндентирования Arduino IDE. Вам следует чаще использовать его, потому что правильный отступ очень удобен для поиска определенных синтаксических ошибок., @chrisl
Спасибо тебе, джсотола, Крисл и Эдгар! Но я получаю 57, а затем 0 в следующей строке в качестве вывода. Как я могу получить десятичные значения, сохраненные в led0, led1 и led2?, @Dhruv Rastogi
"570” правильно:
led0
равно 5,led1
равно 7, а "led2" равно 0., @Edgar BonetСпасибо тебе, Эдгар, я совершенно по этому соскучился!, @Dhruv Rastogi