无效使用无效表达式,怎么办? [关闭]

Posted

技术标签:

【中文标题】无效使用无效表达式,怎么办? [关闭]【英文标题】:invalid use of void expression, what how? [closed] 【发布时间】:2016-11-20 05:14:15 【问题描述】:

不知道为什么会这样。

该程序是一个编码错误的鼹鼠游戏,可在 Arduino Uno 上运行。

我的 IED 是 Arduino IED 版本 1.6.12

是的,它还有很多内容,但如果您想查看所有代码,请直接询问。

错误

Arduino: 1.6.12 (Windows 7), Board: "Arduino/Genuino Uno"

C:\Users\Strings\Documents\Arduino\Too_Many_Moles\Too_Many_Moles.ino: In function 'void winOrLost()':

Too_Many_Moles:146: error: invalid use of void expression

       timelyCall(current_millis, toggleBuzer(), 1000);

                                                     ^

C:\Users\Strings\Documents\Arduino\Too_Many_Moles\Too_Many_Moles.ino: In function 'void loop()':

Too_Many_Moles:191: error: invalid use of void expression

     timelyCall(current_millis, popAMole(), time_interval);

                                                         ^

exit status 1
invalid use of void expression

This report would have more information with
"Show verbose output during compilation"
option enabled in File -> Preferences.

Main.ino

    const int buzer = A0, on_off_pin = A1;

unsigned long current_millis;
const int time_interval = 20;
int currentMole = 0;

int points = 0, lives = 3, level = 0, odds_of_pop_up = 6;

mole moles[6] = 
  mole( 2, 8  ),
  mole( 3, 9  ),
  mole( 4, 10 ),
  mole( 5, 11 ),
  mole( 6, 12 ),
  mole( 7, 13 )
;
int number_of_mole = sizeof(moles) / sizeof(*moles);

    void timelyCall(unsigned long currentMillis, void (&f)(), int ms) 
  if (millis() - currentMillis > ms) 
    f();
    currentMillis = millis();
  

void popAMole() 
  if (moles[currentMole].isReadyToPop()) 
    moles[currentMole].popUp(odds_of_pop_up);
  
  if (currentMole + 1 <=  number_of_mole) 
    currentMole = 0;
  
  else 
    currentMole++;
  

mole.h

#ifndef mole_h
#define mole_h

#include "Arduino.h"

class mole

  public:
    mole(int p_out, int p_in);
    void resetMole();
    void popUp(int odds);
    boolean moleGetHit();
    boolean isReadyToPop();

    void setUpTimer(int up_timer);
    int  getUpTimer();
    void decrementUpTimer();

    void setRecoveryTimer(int recovery_timer);
    int  getRecoveryTimer();
    void decrementRecoveryTimer();
    void addRecoveryTimer(int add_time);

    boolean getSouldBeUp();

    int getOddsOfPopinh();
    void setOddsOfPopinh(int odds);

    int getPinIn();


  private:
    boolean _sould_be_up = false;
    int _up_timer = 0;
    int _recovery_timer = 0;
    int _pin_out;
    int _pin_in;
    int _odds_of_poping = 10; 

;
#endif

mole.cpp

boolean mole::isReadyToPop() 
  if (_recovery_timer == 0 && _sould_be_up = false) 
    return true;
  
  else 
    return false;
  


void mole::popUp(int odds) 
  if (rand() % odds + 1 == 1) 
    digitalWrite(_pin_out, HIGH)
    _sould_be_up = true;
  

【问题讨论】:

能否提供发生错误的代码?你知道,例如Too_Many_Moles:146: 大声笑,“Arduino IED”,会在某处引发一些危险信号。 【参考方案1】:

您调用的函数没有将地址传递给timelyCall

timelyCall(current_millis, popAMole(), time_interval);
timelyCall(current_millis, toggleBuzer(), 1000);

应该是:

timelyCall(current_millis, popAMole, time_interval);
timelyCall(current_millis, toggleBuzer, 1000);

注意popAMoletoggleBuzer 上没有括号。

【讨论】:

以上是关于无效使用无效表达式,怎么办? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

正则表达式查找带空格的整数中的无效字符

尝试打印匹配表达式时使用 sed 的无效引用 \1

常量表达式包含无效操作[重复]

实现:C#窗体中的文本框只能输入中文汉字,其他输入无效。问:正则表达式怎么用? 分不多,谢谢朋友帮忙!

在javascript中使用时正则表达式无效组错误

Include 中使用的 Lambda 表达式无效。 EF6,导航属性