C编译错误:程序中出现了杂乱的'\200',数字常量之前缺少')'。

10

我复制了这个程序,但是void downFrequency函数有问题(我认为是这个函数)。

这个程序是针对Arduino Uno的。以下是编译器报错:

正在为“Arduino Uno”编译“MY_dds”

MY_dds.ino : stray '\342' in program
MY_dds.ino : stray '\200' in program
MY_dds.ino : stray '\223' in program
MY_dds.ino : stray '\342' in program
MY_dds.ino : stray '\200' in program
MY_dds.ino : stray '\223' in program
MY_dds.ino : stray '\342' in program
MY_dds.ino : stray '\200' in program
MY_dds.ino : stray '\223' in program
MY_dds.ino : stray '\342' in program
MY_dds.ino : stray '\200' in program
MY_dds.ino : stray '\223' in program
MY_dds.ino : stray '\342' in program
MY_dds.ino : stray '\200' in program
MY_dds.ino : stray '\223' in program
MY_dds.ino : stray '\342' in program
MY_dds.ino : stray '\200' in program
MY_dds.ino : stray '\223' in program
MY_dds.ino : stray '\342' in program
MY_dds.ino : stray '\200' in program
MY_dds.ino : stray '\223' in program
MY_dds.ino : stray '\342' in program
MY_dds.ino : stray '\200' in program
MY_dds.ino : stray '\223' in program
MY_dds.ino : stray '\342' in program
MY_dds.ino : stray '\200' in program
MY_dds.ino : stray '\223' in program
MY_dds.ino : : In function 'void downFrequency()':
MY_dds.ino : expected `)' before numeric constant
MY_dds.ino : expected `)' before numeric constant
MY_dds.ino : expected `)' before numeric constant
MY_dds.ino : expected `)' before numeric constant
MY_dds.ino : expected `)' before numeric constant
MY_dds.ino : expected `)' before numeric constant
MY_dds.ino : expected `)' before numeric constant
MY_dds.ino : expected `)' before numeric constant
Error compiling

以下是程序:

#include <stdio.h>
#include <dds.h>
#include <LiquidCrystal.h>

#define RESET 13
#define data_pin 12
#define load_pin A5
#define clock_pin A4
#define clock_hz 120000000LL
#define calibrationValue -0.0400000 // This is a value we change to calibrate
                                    // our particular chip more accurately
#define buttonPin A0

// chip, data_pin, load_pin, clock_pin, clock_hz
dds ddschip(DDS9850, data_pin, load_pin,  // Set my dds up with 120 MHz
            clock_pin, clock_hz);         // onboard crystal

LiquidCrystal lcd(8, 9, 4, 5, 6, 7);

// Some variables to use in our program
long toFrequency = 14070000;
long currentFrequency;
long maxFrequency = 40000000;
long minFrequency = 0;
int incrementNumber = 6;
int maxprogramnumber = 6; // Don't forget to increase the menu numbers here!!
int programnumber = 1;

void setup()
{
  Serial.begin(9600);
  Serial.println("Beginning Setup");

  // Set up the LCD’s number of columns and rows:
  lcd.begin(16, 2);
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("T.Robb V0.1b "); // Print a little message
  lcd.setCursor(0, 1);
  lcd.print(" DDS Sine wave ");
  delay(2000);

  // Set up pins
  pinMode(RESET, OUTPUT);
  pinMode(data_pin, OUTPUT);
  pinMode(load_pin, OUTPUT);
  pinMode(clock_pin, OUTPUT);
  pinMode(buttonPin, INPUT);
  digitalWrite(buttonPin, HIGH);

  ddschip.calibrate(calibrationValue); // This is a value we change to calibrate
                                       // our particular chip more accurately
  ddschip.setfrequency(toFrequency);
  lcd.clear();
}

void loop()
{
  if(toFrequency >= maxFrequency)
  {
    (toFrequency = maxFrequency);
  }

  if(toFrequency <= minFrequency)
  {
    (toFrequency = minFrequency);
  }

  ddschip.setfrequency(toFrequency);
  currentFrequency = toFrequency;

  switch(incrementNumber)
  {
    case 0:
      Serial.println("increment amount is 1 Hz");
      lcd.setCursor(0, 0);
      lcd.print("Change By 1 Hz");
      break;

    case 1:
      Serial.println("increment amount is 10 Hz");
      lcd.setCursor(0, 0);
      lcd.print("Change By 10 Hz ");
      break;

    case 2:
      Serial.println("increment amount is 100 Hz");
      lcd.setCursor(0, 0);
      lcd.print("Change By 100 Hz ");
      break;

    case 3:
      Serial.println("increment amount is 1 000 Hz");
      lcd.setCursor(0, 0);
      lcd.print("Change By 1 kHz");
      break;

    case 4:
      Serial.println("increment amount is 10 000 Hz");
      lcd.setCursor(0, 0);
      lcd.print("Change By 10 kHz");
      break;

    case 5:
      Serial.println("increment amount is 100 000 Hz");
      lcd.setCursor(0, 0);
      lcd.print("Change By 100 kHz");
      break;

    case 6:
      Serial.println("increment amount is 1 000 000hz");
      lcd.setCursor(0, 0);
      lcd.print("Change By 1 MHz");
      break;

    default:
      Serial.println("increment amount is 100 Hz");
      lcd.setCursor(0, 0);
      lcd.print("Change By 100 Hz ");
      break;
  }

  lcd.setCursor(0, 1);
  lcd.print("Freq is "); // Print to LCD
  lcd.setCursor(8, 1);
  lcd.print(currentFrequency);

  Serial.println(incrementNumber); // Temporary for debugging delete me

  Serial.print("Current frequency is set to: ");
  Serial.println(currentFrequency);

  while((analogRead(buttonPin))>=1000) // Do nothing while no buttons pressed to chill out
  {
  }

  delay(5);
  if (analogRead(buttonPin)>=100 && analogRead(buttonPin) <= 200) // We have pushed up
  {
    upFrequency();
    delay(300);
  }

  if(analogRead(buttonPin)>=200 && analogRead(buttonPin) <= 400) // We have pushed down
  {
    downFrequency();
    delay(300);
  }

  if ((analogRead(buttonPin)) <= 50) // We have pushed right
  {
    incrementNumber++;
    delay(300);
  }

  if(analogRead(buttonPin) >= 400 && analogRead(buttonPin)<=600) // We have pushed left
  {
    incrementNumber–;
    delay(300);
  }

  if(incrementNumber > 6) // This is where the menu goes around and around
  {
    incrementNumber = 0;
  }
  if(incrementNumber < 0)
  {
    incrementNumber = 6;
  }

  delay(100);
  lcd.clear();
}

void upFrequency()
{
  Serial.println("Going UP Frequency");
  switch(incrementNumber)
  {
    case 0:
      toFrequency = (toFrequency + 1);
      break;

    case 1:
      toFrequency = (toFrequency + 10);
      break;

    case 2:
      toFrequency = (toFrequency + 100);
      break;

    case 3:
      toFrequency = (toFrequency + 1000);
      break;

    case 4:
      toFrequency = (toFrequency + 10000);
      break;

    case 5:
      toFrequency = (toFrequency + 100000);
      break;

    case 6:
      toFrequency = (toFrequency + 1000000);
      break;

    default:
      toFrequency = (toFrequency + 10);
      break;
  }

}


void downFrequency()
{
  Serial.println("Going DOWN Frequency");
  switch(incrementNumber)
  {
    case 0:
      toFrequency = (toFrequency – 1);
      break;

    case 1:
      toFrequency = (toFrequency – 10);
      break;

    case 2:
      toFrequency = (toFrequency – 100);
      break;

    case 3:
      toFrequency = (toFrequency – 1000);
      break;

    case 4:
      toFrequency = (toFrequency – 10000);
      break;

    case 5:
      toFrequency = (toFrequency – 100000);
      break;

    case 6:
     toFrequency = (toFrequency – 1000000);
     break;

    default:
      toFrequency = (toFrequency – 10);
      break;
  }

}

以上源文件的名称是什么,您正在使用什么确切命令来尝试编译它? - Paul R
3
当你说“复制”时,你的意思是什么?比如说从PDF文件中按Ctrl-C复制? - trojanfoe
ino是什么类型的扩展名?源文件不应该具有扩展名cCC,以便编译器知道要期望哪种语言吗? - Klas Lindbäck
1
尽管在这种情况下你确实得到了答案,请注意以备将来参考:发布超过200行格式不良的代码,并期望我们浏览它以找到错误不明确的问题是不好的。 - Nik Bougalis
是的,这个错误说明得很差,因为如果我知道错误,我会自己纠正它。怪错误代码,不要怪我。 - Marc Howard
显示剩余7条评论
4个回答

23

downFrequency 函数中,你不知怎么出现了“en dash”字符,而不是普通的减号。

确保你使用文本编辑器进行编辑,而不是使用文字处理软件;对于以下每一点:

toFrequency = (toFrequency – 1);
                           ^

删除标记的字符,并重新输入普通减号。

(如果您对细节感兴趣,“短划线”字符是Unicode 2013,以UTF-8编码为三个字节,其八进制值为324,200,223,这就是为什么您会在错误消息中看到这些数字。)


当我将代码从StackOverflow帖子复制到vim中时,发生了这种情况。 - JohnMerlino

13

编译器抱怨你的源文件中有非ASCII字符。

我的八进制技巧有点生疏,但看起来像UTF-8。342 200 2230xE2 0x80 0x93,它是Unicode代码点"EN DASH。"这段代码被一个学习美容的文本编辑器修改成了减号。


5

可能你的双引号符号(")是错误的。请检查它们是否实际上是",而不是


我也遇到了一个与“.”相关的相同问题。 - user-ag
关于“可能你的双引号符号(")有误”的问题:不是这个原因。只有EN DASH,也就是Unicode代码点U+2013(九个实例)。还有一个单个RIGHT SINGLE QUOTATION MARK,也就是Unicode代码点U+2019。它们可以在任何现代文本编辑器或IDE中使用正则表达式\x{2013}\x{2019}进行搜索(和替换)。注意:在Visual Studio Code(以及其他一些软件)中,\u2013(而不是\x{2013})是不同的。 - Peter Mortensen
单个右撇号位于注释中(// 设置LCD的列数和行数:),可能不会影响编译。 - Peter Mortensen

1

简单的复制粘贴常常会弄乱源代码。

可以通过cat -A yoursrc.c检查“偏离”问题。

对我来说,我通常通过Vim两步重新格式化代码。

vim yoursrc.c
:%!tr -cd '[:print:]\n'

然后编译,gcc yoursrc.c

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接