Ошибка в C / arduino при преобразовании указателя - PullRequest
0 голосов
/ 10 марта 2020

У меня есть следующая функция blinkLed

uint8_t status_led_pin = 4;  

unsigned long long *previous_blink = 0;       
uint8_t *led_state = 0;  

void setup() {
 pinMode (status_led_pin, OUTPUT);
 digitalWrite(status_led_pin,0);
}

void loop() {
  while(millis() <= 10000){
    blinkLed(status_led_pin,&led_state,1000,&previous_blink);  
  }
  digitalWrite(status_led_pin,0);

}


void blinkLed(uint8_t led, uint8_t *led_state, unsigned long long interval, unsigned long long *last_blink_millis){
   unsigned long long now = millis();

   if((now - *last_blink_mills) >= interval){
      *last_blink_millis = now;
      *led_state = !*led_state;

      digitalWrite(led,*led_state);
   }
}

И возникает ошибка при вызове функции digitalWrite :

невозможно преобразовать 'uint8_t ** {aka unsigned char **}' в 'uint8_t * {aka unsigned char *}' для аргумента '2' в 'void blinkLed (uint8_t, uint8_t *, длинный длинный unsigned int, длинный длинный unsigned int * ) '

Есть идеи?

Ответы [ 3 ]

2 голосов
/ 10 марта 2020

Вы игнорируете, что работаете с указателями. Кроме того, из сообщения об ошибке кажется, что прототип digitalWrite:

void digitalWrite(char, char);

, поэтому код должен быть:

void blinkLed(uint8_t led, uint8_t *led_state, int interval, unsigned long long *last_blink_millis){
   unsigned long long now = millis();


   if((int)(now - *last_blink_mills) >= interval){
      *last_blink_millis = now;
      *led_state = !*led_state;

      digitalWrite(led,*led_state);
   }
}
1 голос
/ 10 марта 2020

Измените объявления

unsigned long long *previous_blink = 0;       
uint8_t *led_state = 0;  

на

unsigned long long previous_blink = 0;
uint8_t led_state = 0;

Вы хотите previous_blink и led_state для хранения значений типа unsigned long long и uint8_t. Когда вы передаете их в blinkled из loop, вы хотите, чтобы blinkled до обновляли эти объекты, поэтому вы должны передавать указатели на эти объекты.

Помните, что C передает все параметры функции по значению , что означает, что формальный параметр в определении функции является отдельным объектом в памяти от фактического параметра в вызове функции. Таким образом, чтобы обновить параметр, мы должны передать указатель:

void update( T *ptr ) // for any type T 
{
  *ptr = new_value(); // write a new value to the thing ptr points to
}

void call( void )
{
  T val;             // val is an object of type T
  update( &val );    // pass a pointer to val to update
}
0 голосов
/ 10 марта 2020

digitalWrite() принимает value по значению, а не по указателю, поэтому оно должно быть

 digitalWrite(led,*led_state);

, вы забыли разыменования везде в коде. Строка

 led_state = !led_state;

не выдает ошибку, потому что это допустимо, но это огромная ошибка. После этого указателя led_state - нулевой указатель, если он не был нулевым. Я уверен, что вы имели в виду

 *led_state = !(*led_state); 

Также неясно, что вы ожидаете, потому что ничто в документации не позволяет указывать произвольные значения для digitalWrite, только HIGH и LOW. Не уверен, что они равны, если LOW равен 0, то все в порядке, в противном случае строка выше приведет к нулю, записанному в led_state Предложения по документации общего стиля:

 if(*led_state)
      digitalWrite(led,HIGH);
 else
      digitalWrite(led,LOW);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...