首页 > 解决方案 > char参数方法错误Arduino代码

问题描述

当我尝试运行我的代码时,我不断收到以下错误消息。我不知道如何纠正这些错误,所以我可以测试一切。即使这些只是警告消息并且代码说它上传。我在打印任何语句的串行监视器上没有收到任何消息。

代码:

#include <Wire.h> 
#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x3F,16,2);  // set the LCD address for a 16 chars and 2 line display

const int guessPin = 7;

const int switch0Pin =  13;
const int switch1Pin =  12;
const int switch2Pin =  11;
const int switch3Pin =  10;
const int switch4Pin =  9;

int currentLetterIndex = 0;
int currentClueIndex = 0;
int currentGuess = 0;
int lastGuess = 0;

bool debug = false; // set to false to turn off serial output

unsigned long previousMillis = 0;
long restInterval = 20 * 1000; // 20 second time out to conserve battery

char clueBreak[] = "Get clue at the next house :)";
char hintBreak[] = "ah ah ah... must be patient";
char answerBreak[] = "santa";

char clue1[] = "The place we first meet?";
char hint1[] = "Company... not city";
char answer1[] = "pcc";

char clue2[] = "The play we saw in NY";
char hint2[] = "muppets... no...";
char answer2[] = "avenueq";

char clue3[] = "What we worn in Times Square";
char hint3[] = "look me in the eyes...";
char answer3[] = "diapers";

char clue4[] = "Where I said 'I Love You'";
char hint4[] = "And you later threw up on me...";
char answer4[] = "tonys";

char clue5[] = "";
char hint5[] = "+++ ++ ++++ ++++";
char answer5[] = "";

char clue6[] = "When do we do anything?";
char hint6[] = "'bye' 'see you +++++++'";
char answer6[] = "maybe tomorrow";

char clue7[] = "The animal you pet in gatlinburg";
char hint7[] = "spell the numbers...";
char answer7[] = "jellyfish";

char clue8[] = "These are only in California";
char hint8[] = "the one you used to sleep with";
char answer8[] = "seven eleven";

char clue9[] = "Where did you buy your cat?";
char hint9[] = "(-_-)  R-O-B-O-T";
char answer9[] = "japan";

char clue10[] = "The ugliest car color...";
char hint10[] = "your second favorite color";
char answer10[] = "yellow";

char clue11[] = "Our first wine and paint";
char hint11[] = "__ _____ _____";
char answer11[] = "no drama llama";

const int cluesNum = 10; // clues + breaks

char * hints[] = {
  hint1,
  hint2,
  hint3,
  hint4,
  hint5,
  hint6,
  hint7,
  hint8,
  hint9,
  hint10,
  hint11,
};

char * clues[] = {
  clue1,
  clue2,
  clue3,
  clue4,
  clue5,
  clue6,
  clue7,
  clue8,
  clue9,
  clue10,
  clue11,
};

char * answers[] = {
  answer1,
  answer2,
  answer3,
  answer4,
  answer5,
  answer6,
  answer7,
  answer8,
  answer9,
  answer10,
  answer11,
};

char currentLine1[17]; // need extra char for null pointer
char currentLine2[17]; // need extra char for null pointer
bool isDisplayingClue = true;

void setup()
{
  pinMode(guessPin, INPUT);
  pinMode(switch0Pin, INPUT);
  pinMode(switch1Pin, INPUT);
  pinMode(switch2Pin, INPUT);
  pinMode(switch3Pin, INPUT);
  pinMode(switch4Pin, INPUT);

  lcd.init();
  lcd.backlight();
  if (debug)
  {
    Serial.begin(9600);
  }
}

void updateDisplayFromArray(const char *str)
{
  int limit = getCharSize(str)-1;
  for (int i = 0; i >= 16; i++)
  {
    if (i <= limit)
    {
      currentLine1[i] = str[i];
    }
    if (i+16 <= limit)
    {
      currentLine2[i] = str[i+16];
    }
  }
}

int getCharSize(const char *cArray)
{
  return sizeof(cArray) / sizeof(char);
}

void logger(const char *message)
{
  if (debug)
  {
    Serial.println(message);
  }
}

void restLCD()
{  
  lcd.setBacklight(0);
  lcd.noDisplay();
}

void showLCD()
{  
  isDisplayingClue = false;
  previousMillis = millis();
  lcd.setBacklight(50);
  lcd.display();
}

void TypeAnimation(const char *line1, const char *line2, int delayTime)
{
  lcd.clear();  
  for (int i = 0; i <= getCharSize(line1)-1; i++) {
    lcd.setCursor(i,0);
    lcd.print(line1[i]);
    delay(delayTime);
  }
  for (int i = 0; i <= getCharSize(line2)-1; i++) {
    lcd.setCursor(i,1);
    lcd.print(line2[i]);
    delay(delayTime);
    if (i == getCharSize(line2)-1) {
      delay(1000);
    }
  }
}

void DelayAnimation(const char *line1, const char *line2, int delayTime)
{
  setScreen(line1, line2);
  delay(delayTime);
}

void setScreen(const char *line1, const char *line2) 
{ 
  lcd.clear(); 
  lcd.setCursor(0,0);
  lcd.print(line1);
  lcd.setCursor(0,1);
  lcd.print(line2);  
}

void TestAnimations()
{ 
  showLCD();
  PlayGuessingAnimation();
  PlayCorrectAnimation();
  PlayIncorrectAnimation();
  ResetClues();
  CurrentStatus();
  ShowCurrentGuess();
  DisplayClue(5000);
  restLCD();
  delay(5000);  
  currentLetterIndex++;  
}

void ResetClues() 
{  
  DelayAnimation("Resetting...", "",1500);
  DelayAnimation("Merry Christmas!", "My Love :)",4000);
  TypeAnimation("Old Man Turtle", "has been taken",250);
  TypeAnimation("again...", ":(",250);
  TypeAnimation("Solve the clues", "to find him",250);
  TypeAnimation("Use the button 2", "submit da letter",250);
  DelayAnimation("Now for your 1st", "clue",4000);
  TypeAnimation("Goodluck my love", ":)",250);
  NextClue();
  currentLetterIndex = 0;
  currentClueIndex = 0;  
}

void ShowFinalAnimation()
{
  TypeAnimation("You did it!", "",250);
  TypeAnimation("You saved", "Old Man Turtle",250);
  TypeAnimation("Old Man Turtle", "has left yo",250);
  TypeAnimation("Use the button 2", "submit da letter",250);
  DelayAnimation("Now for your 1st", "clue",4000);
  TypeAnimation("Goodluck my love", ":)",250);
}

void loop()
{
  logger("************* NEW LOOP *************");
  //PlayGuessingGame();
  TestAnimations();
}

void PlayGuessingGame()
{
  bool buttonState = digitalRead(guessPin);  
  char *state = char(buttonState);
  logger(state);
  ConvertGuess();
  if (buttonState)
  {
    logger("made it inside button guess clicked");
    showLCD();
    CheckGuess();
  }
  else
  {
    if (lastGuess != currentGuess)
    {
      logger("The guess has changed");
      showLCD();   
      ShowCurrentGuess();   
      lastGuess = currentGuess;
    }
    else
    {
      logger("The guess hasn't changed :(");
      if (!isDisplayingClue)
      {
        DisplayClue(1);
      }
      unsigned long currentMillis = millis();
      if(currentMillis - previousMillis > restInterval * .7) 
      {
        DelayAnimation(" About to enter ", "-- Rest  Mode --",1500);
      }
      if(currentMillis - previousMillis > restInterval) 
      {
        logger("...REST MODE ACTIVATED...");
        restLCD();
      }
    }
  }
  if (currentClueIndex > cluesNum)
  {
    ShowFinalAnimation();
  }
}

void ConvertGuess()
{
  bitWrite(currentGuess,0, !digitalRead(switch0Pin));
  bitWrite(currentGuess,1, !digitalRead(switch1Pin));
  bitWrite(currentGuess,2, !digitalRead(switch2Pin));
  bitWrite(currentGuess,3, !digitalRead(switch3Pin));
  bitWrite(currentGuess,4, !digitalRead(switch4Pin));
  logger("Beginning conversion of guess");
  logger("Pin 0:" + char(!digitalRead(switch0Pin)));
  logger("Pin 1:" + char(!digitalRead(switch1Pin)));
  logger("Pin 2:" + char(!digitalRead(switch2Pin)));
  logger("Pin 3:" + char(!digitalRead(switch3Pin)));
  logger("Pin 4:" + char(!digitalRead(switch4Pin)));
  logger("new guess is " + char(ConvertIntToLetter(currentGuess)));
}

void CheckGuess()
{
  PlayGuessingAnimation();
  char guessLetter = ConvertIntToLetter(currentGuess);
  char cLetter = clues[currentClueIndex][currentLetterIndex];
  if (guessLetter == '-')
  {
    ResetClues();
  }
  else if (guessLetter == '+')
  {
    CurrentStatus();
  }
  else if (guessLetter == '?')
  {
    DisplayHint(5000);
  }
  else if (guessLetter == cLetter)
  {
    currentLetterIndex++;
    if (currentLetterIndex > getCharSize(clues[currentClueIndex])-1)
    {
      PlayNextClueAnimation();
      currentLetterIndex = 0;
      currentClueIndex++;
    }
    PlayCorrectAnimation();
  }
  else
  {
    PlayIncorrectAnimation();
  }
}

void ShowCurrentGuess() 
{  
  char guess = char(ConvertIntToLetter(currentGuess));
  if (guess == '-')
  {
    DelayAnimation("   DANGER!!!   ", "THIS WILL RESET!",5000);
    DelayAnimation("Press the button", "will reset",2000);
  }
  else if (guess == '+')
  {    
    DelayAnimation("This will", "Show current status",2000);
  }
  else if (guess == '?')
  {    
    DelayAnimation("This will", "Show you a hint",2000);
  }
  else if (guess == ' ')
  {    
    DelayAnimation("You're Guessing ", "'_' (space)",1500);
  }
  else
  {
    DelayAnimation("You're Guessing ", char(guess),1500);
  }
}

void CurrentStatus()
{  
  char currentAnswer[17] = "";
  if (currentLetterIndex == 0)
  {
    strcpy(currentAnswer, "nothing yet :(");
  }
  else
  {
    strcpy(currentAnswer, GetCorrectGuesses());
  }
  DelayAnimation("You've Guessed ", strcat(char(currentClueIndex), " Clues"), 2000);
  DelayAnimation("The Current", "Clues Is...", 2000);
  DisplayClue(2000);
  DelayAnimation("You've got right", currentAnswer, 3000);
}

char GetCorrectGuesses()
{
  char result[17];
  for(int i = 0; i >= currentLetterIndex; i++)
  {
    result[i] = answers[currentClueIndex][i];
  }
  return result;
}

void DisplayClue(int delayTime)
{
  updateDisplayFromArray(clues[currentClueIndex]);
  DelayAnimation(currentLine1,currentLine1,delayTime);
  isDisplayingClue = true;
}

void DisplayHint(int delayTime)
{
  updateDisplayFromArray(hints[currentClueIndex]);
  TypeAnimation(currentLine1,currentLine1,delayTime);
}

void NextClue()
{  
  DelayAnimation(" Are you ready?? ", " Clue #" + char(currentClueIndex+1),3000);
  DisplayClue(5000);
}

void PlayGuessingAnimation()
{
  TypeAnimation("That is...", "",200);
}

void PlayNextClueAnimation()
{
  TypeAnimation("HOORAY!!!", "",200);
  DelayAnimation("You Got It Right", "   Go You ;)   ",2000);
  TypeAnimation("On to the next", "",200);
  NextClue();
}

void PlayCorrectAnimation()
{
  DelayAnimation("   CORRECT!!!!  ", "",1500);
}

void PlayIncorrectAnimation()
{
  DelayAnimation("    Wrong :(    ", "   Try Again   ",2000);
}

char ConvertIntToLetter(int number)
{
  int result = '0';
  switch (number)
  {
    case 0:
      result = 'a';
      break;
    case 1:
      result = 'b';
      break;
    case 2:
      result = 'c';
      break;
    case 3:
      result = 'd';
      break;
    case 4:
      result = 'e';
      break;
    case 5:
      result = 'f';
      break;
    case 6:
      result = 'g';
      break;
    case 7:
      result = 'h';
      break;
    case 8:
      result = 'i';
      break;
    case 9:
      result = 'j';
      break;
    case 10:
      result = 'k';
      break;
    case 11:
      result = 'l';
      break;
    case 12:
      result = 'm';
      break;
    case 13:
      result = 'n';
      break;
    case 14:
      result = 'o';
      break;
    case 15:
      result = 'p';
      break;
    case 16:
      result = 'q';
      break;
    case 17:
      result = 'r';
      break;
    case 18:
      result = 's';
      break;
    case 19:
      result = 't';
      break;
    case 20:
      result = 'u';
      break;
    case 21:
      result = 'v';
      break;
    case 22:
      result = 'w';
      break;
    case 23:
      result = 'x';
      break;
    case 24:
      result = 'y';
      break;
    case 25:
      result = 'z';
      break;
    case 26:
      result = '!';
      break;
    case 27:
      result = '%';
      break;
    case 28:
      result = ' ';
      break;
    case 29:
      result = '?';
      break;
    case 30:
      result = '-';
      break;
    case 31:
      result = '+';
  }
  return result;
}

错误信息:

C:\Users\jb090\Documents\Arduino\ChristmasBoxV3\ChristmasBoxV3.ino: In function 'void PlayGuessingGame()':

C:\Users\jb090\Documents\Arduino\ChristmasBoxV3\ChristmasBoxV3.ino:263:17: warning: invalid conversion from 'char' to 'char*' [-fpermissive]

   char *state = char(buttonState);

                 ^~~~~~~~~~~~~~~~~

C:\Users\jb090\Documents\Arduino\ChristmasBoxV3\ChristmasBoxV3.ino: In function 'void ShowCurrentGuess()':

C:\Users\jb090\Documents\Arduino\ChristmasBoxV3\ChristmasBoxV3.ino:378:40: warning: invalid conversion from 'char' to 'const char*' [-fpermissive]

     DelayAnimation("You're Guessing ", char(guess),1500);

                                        ^~~~~~~~~~~

C:\Users\jb090\Documents\Arduino\ChristmasBoxV3\ChristmasBoxV3.ino:198:6: note:   initializing argument 2 of 'void DelayAnimation(const char*, const char*, int)'

 void DelayAnimation(const char *line1, const char *line2, int delayTime)

      ^~~~~~~~~~~~~~

C:\Users\jb090\Documents\Arduino\ChristmasBoxV3\ChristmasBoxV3.ino: In function 'void CurrentStatus()':

C:\Users\jb090\Documents\Arduino\ChristmasBoxV3\ChristmasBoxV3.ino:391:44: warning: invalid conversion from 'char' to 'const char*' [-fpermissive]

     strcpy(currentAnswer, GetCorrectGuesses());

                           ~~~~~~~~~~~~~~~~~^~

In file included from C:\Program Files (x86)\Arduino\hardware\arduino\avr\cores\arduino/Arduino.h:25:0,

                 from sketch\ChristmasBoxV3.ino.cpp:1:

c:\program files (x86)\arduino\hardware\tools\avr\avr\include\string.h:305:14: note:   initializing argument 2 of 'char* strcpy(char*, const char*)'

 extern char *strcpy(char *, const char *);

              ^~~~~~

C:\Users\jb090\Documents\Arduino\ChristmasBoxV3\ChristmasBoxV3.ino:393:44: warning: invalid conversion from 'char' to 'char*' [-fpermissive]

   DelayAnimation("You've Guessed ", strcat(char(currentClueIndex), " Clues"), 2000);

                                            ^~~~~~~~~~~~~~~~~~~~~~

In file included from C:\Program Files (x86)\Arduino\hardware\arduino\avr\cores\arduino/Arduino.h:25:0,

                 from sketch\ChristmasBoxV3.ino.cpp:1:

c:\program files (x86)\arduino\hardware\tools\avr\avr\include\string.h:248:14: note:   initializing argument 1 of 'char* strcat(char*, const char*)'

 extern char *strcat(char *, const char *);

              ^~~~~~

C:\Users\jb090\Documents\Arduino\ChristmasBoxV3\ChristmasBoxV3.ino: In function 'char GetCorrectGuesses()':

C:\Users\jb090\Documents\Arduino\ChristmasBoxV3\ChristmasBoxV3.ino:406:10: warning: invalid conversion from 'char*' to 'char' [-fpermissive]

   return result;

          ^~~~~~

C:\Users\jb090\Documents\Arduino\ChristmasBoxV3\ChristmasBoxV3.ino:401:8: warning: address of local variable 'result' returned [-Wreturn-local-addr]

   char result[17];

        ^~~~~~

标签: arduino

解决方案


char而且char*很不一样!

const char*可能有点棘手,但您首先必须了解文本和字符之间的区别。

“Hello World”是一个文本,通常被视为一个指针或 [const] 数组。

'A' 是一个字符,其内部存储方式与类型变量中的数字 65 相同char

更多的:

c#(或 java)和 c++ 也非常不同。“c++ 是为受虐狂们准备的”这句话有很多道理:)

你的第一个问题

警告:从 'char' 到 'char*' 的无效转换

char *state = char(buttonState);

来自以下几行:

bool buttonState = digitalRead(guessPin);  
char *state = char(buttonState);
logger(state);

logger(const char*)需要一个文本来记录,但你有一个布尔值。不确定你是如何用 c# 编写的,并且强制转换无济于事。你最终可能想要类似的东西

bool buttonState = digitalRead(guessPin);  
logger(buttonState? "guessPin is set": "guessPin is LOW");

推荐阅读