Если выражение, сравнивающее массив со списком значений, вызывает ошибку

В моей программе у меня есть следующие строки кода:

if (invest == {0, 1, 0, 0})
   {
      //code 
   }

Однако, пытаясь скомпилировать код, я получаю следующую ошибку:

exit status 1
expected ';' before '}' token

«Invest» - это массив bool, первоначально определенный с помощью

bool invest[] = {0, 0, 0, 0};

Как я могу предотвратить эту ошибку при запуске?

2 голоса | спросил Excelseo 12 J0000006Europe/Moscow 2017, 01:43:00

3 ответа


2

Вы не можете так сравнивать ... вам нужно сделать это один за другим (и проверить длину массива).

if ((sizeof(invest) / sizeof(bool) == 4) &&
    (invest[0] == 0) && 
    (invest[1] == 1) &&
    (invest[2] == 0) &&
    (invest[3] == 0)) 
{
     ...
}

Если вам нужно часто выполнять такой сравнительный анализ (возможно, с разными значениями), вы, конечно, всегда можете написать выделенную функцию, передающую массив, и массив для проверки и проверки длины и использования цикла для проверки всех значений .

Обратите внимание, что если invest является булевым массивом, лучше использовать false и true вместо 0 и 1.

ответил Michel Keijzers 12 J0000006Europe/Moscow 2017, 01:50:32
1

К сожалению, вы не можете этого сделать.

В дополнение к Мишелю Кейззерсу другим возможным способом является использование двоичных манипуляций с целым числом.

Ваше объявление переменной будет выглядеть так:

unsigned int invest = 0x00;    // B0000 or 0 would be acceptable also

(См. https://www.arduino.cc/ru/Reference/IntegerConstants для обозначения обозначений.)
Поэтому ваш оператор if будет очень близок к тому, что вы изначально писали.

if (invest == B0100)
{
   //code 
}

Используя этот метод, вы не можете ссылаться на каждый бит так же, как массив (т.е. invest[3]). Вместо просмотра 4-й бит:

result = (invest && 0x08) >> 3;

Чтобы установить 4-й бит, который вам нужно написать:

invest |= 0x08;    // ie. B1000

И чтобы очистить 4-й бит:

invest &= 0x07;    // ie. B0111
ответил sa_leinad 12 J0000006Europe/Moscow 2017, 04:33:19
0

У вас есть синтаксическая ошибка в этом коде; в C99 вам нужно будет объявить тип анонимного массива {0, 1, 0, 0}, например, через (bool[]){0, 1, 0, 0}. Таким образом, следующий код компилируется в C:

int main() {
  char invest[] = {0, 1, 0, 0};
  if (invest == (char[]){0, 1, 0, 0})
    printf("Yes yes yes\n");
  else
    printf("No no no\n");
  return 0;
}

Однако, если вы скомпилируете и запустите этот код, он выведет «Нет нет», а не «Да да да», потому что логический тест invest == (char[]){0, 1, 0, 0} говорит, чтобы сравнить адрес массива invest с адресом анонимного массива и, конечно, они отличаются.

Обратите внимание, что если вы попытаетесь скомпилировать вышеуказанное как программу на C ++, результатом будет «ошибка: получение адреса временного массива» из-за проверки различного типа.


Все, что сказано, простой способ сравнить массивы байтов или в некоторых случаях массивы в целом - использовать функцию memcmp(). На странице своего руководства:

SYNOPSIS  
   #include <string.h>
   ...  
   int memcmp(const void *s1, const void *s2, size_t n);
DESCRIPTION  
   The  memcmp()  function compares the first n bytes (each
   interpreted as unsigned char) of the memory areas s1 and s2.  
RETURN VALUE  
   The memcmp() function returns an integer less than, equal to,
   or greater  than zero  if  the  first  n  bytes of s1 is found,
   respectively, to be less than, to match, or be greater than 
   the first n bytes of s2.

Следующий код компилируется как на C99, так и на C ++ и выводит «Да, да».

#include <stdio.h>
#include <string.h>
int main() {
  char invest[] = {0, 1, 0, 0};
  char others[] = {0, 1, 0, 0};
  if (memcmp(invest, others, sizeof invest)==0)
    printf("Yes yes yes.\n");
  else
    printf("No no no.\n");
  return 0;
}

Обратите внимание, что при компиляции такого кода в среде разработки Arduino вы можете оставить один или оба оператора #include .

ответил James Waldby - jwpat7 12 J0000006Europe/Moscow 2017, 04:38:47

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132