【问题标题】:Getting an error in C saying that function definition is not allowed here before '{' token在 C 中出现错误,表示在 '{' 标记之前不允许函数定义
【发布时间】:2020-11-11 22:17:43
【问题描述】:

我为 Arduino 板制作了一个小型 C 程序,通过压电蜂鸣器播放一些音调。我对其进行了调整,尝试从串行监视器获取输入,使用 for 循环遍历输入并使用 if/if else 播放相应的音调。

不幸的是,我遇到了一个我无法弄清楚的问题,因为我对 C 还是很陌生。如果你有时间,你介意给我指出正确的方向来解决它吗?

提前致谢。

我收到一个错误:

/Assignment_02_V2.ino:在函数'void loop()'中: /Assignment_02_V2.ino:38:16: 错误:在“{”标记之前不允许函数定义

int main() { ^ 退出状态 1

代码如下:

#define noisyPin 11    // set pin 11 to "noisyPin"

// define notes
#define NOTE_A4 440   // set frequency of A
#define NOTE_B4 494   // set frequency of B
#define NOTE_C4 262   // set frequency of C
#define NOTE_D4 294   // set frequency of D
#define NOTE_E4 330   // set frequency of E
#define NOTE_F4 349   // set frequency of F
#define NOTE_G4 392   // set frequency of G
#define NOTE_C5 523   // set frequency to high C

// set strings for serial monitor input
String msgToUsr = "Enter your note selection (A-G). A space indicates a pause of 0.5 seconds: ";
String usrMelody;

void setup() {
    pinMode(13, OUTPUT);  // set the onboard LED to indicate when a sound is playing
    pinMode(noisyPin, OUTPUT);  // directs noisyPin (pin 3) to output
    Serial.begin(9600);
}

void loop() {
    Serial.println(msgToUsr);
    while (Serial.available()==0) { 
    }
  
    usrMelody = Serial.readString();
    melodyLength = strlen(usrMelody);
  
    int main() { 
        int i=0; 
        for (i = 1; i < melodyLength; i++) {
            if (i == c || i == C) {
                buzzer(noisyPin, NOTE_C4, 500);   // activate buzzer to play NOTE_C4 for 0.5 seconds
            }
            // delay(500);                       // set delay between HIGH to 0.5 seconds
            else if (i == d || i == D) {
                buzzer(noisyPin, NOTE_D4, 500);   // activate buzzer to play NOTE_D4 for 0.5 seconds
            }
            // delay(500);                       // set delay between HIGH to 0.5 seconds
            else if (i == e || i == E) {
                buzzer(noisyPin, NOTE_E4, 500);   // activate buzzer to play NOTE_E4 for 0.5 seconds
            }
            // delay(500);                       // set delay between HIGH to 0.5 seconds
            else if (i == f || i == F) {
                buzzer(noisyPin, NOTE_F4, 500);   // activate buzzer to play NOTE_F4 for 0.5 seconds
            }
            // delay(500);                       // set delay between HIGH to 0.5 seconds
            else if (i == g || i == G) {
                buzzer(noisyPin, NOTE_G4, 500);   // activate buzzer to play NOTE_G4 for 0.5 seconds
            }
            // delay(500);                       // set delay between HIGH to 0.5 seconds
            else if (i == a || i == A) {
                buzzer(noisyPin, NOTE_A4, 500);   // activate buzzer to play NOTE_A4 for 0.5 seconds
            }
            // delay(500);                       // set delay between HIGH to 0.5 seconds
            else  if (i == b || i == B) {
                buzzer(noisyPin, NOTE_B4, 500);   // activate buzzer to play NOTE_B4 for 0.5 seconds
            }
            // delay(500);                       // set delay between HIGH to 0.5 seconds
            else if (i == " ") {
            delay(500)
            }
        } 
    return 0; 
    }
} 

void buzzer(int targetPin, long frequency, long length) {
    digitalWrite(13, HIGH); // turn the onboard LED on
    long delayValue = 1000000 / frequency / 2; // calculate delay value
    // 1 second (in microseconds) divided by frequency divided into 2 (two phases in every cycle)
    long cycleCount = frequency * length / 1000; // calculate the total number of cycles
    // frequency (cycles per second) multiply by the number of seconds divded by 1 second
    for (long t = 0; t < cycleCount; t++) { // for loop to play sound based on the calculations above
        digitalWrite(targetPin, HIGH); // set pin to HIGH to play sound
        delayMicroseconds(delayValue);  // delay sound based on calculated delay value above
        digitalWrite(targetPin, LOW); // set pin to HIGH to stop sound
        delayMicroseconds(delayValue);  // delay sound based on calculated delay value above
    }
    digitalWrite(13, LOW); // turn the onboard LED off
}

【问题讨论】:

  • 你从哪里得到你需要甚至可以在loop 函数中定义一个main 函数的想法?这不是有效的 C++ 语法 - 错误消息甚至清楚地告诉您:function-definition is not allowed here
  • if (i == c || i == C) { :: i 是一个整数(你可能想用它作为索引)c是一个未定义的标识符,C也是一个
  • @kaylum 正如我所提到的,我是 C 的新手,但仍在试图弄清楚这一切。搜索后我意识到我不能有嵌套函数。
  • @wildplasser 所以我通过设置 I = 0 然后使用它进行迭代的方式是错误的?
  • [除了嵌套函数故障] 你可能想要if (usrMelody[i] == 'c' || usrMelody[i] == 'C') {...} BTW 之类的东西:这是switch() 语句的好例子。

标签: c arduino microcontroller


【解决方案1】:

您不能在 C 中使用嵌套函数。在您的代码中,主函数写在循环函数中。

查看Nested function in C 了解更多相关说明。

【讨论】:

  • 谢谢,试图弄清楚整个结构的事情,并在发布这个问题的同时意识到这一点。我会看看那个链接。
  • @Andy 完美!请记住,即使您正在编程 arduino,也不能违反 C 的规则。 (如果您可以将答案标记为已解决会很棒)
  • @LorenzoZane 不仅是 C 规则,还有 C++ :)
  • @KIIV 当然是一般的编程和语言规则
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-02-13
  • 2016-08-31
  • 1970-01-01
  • 1970-01-01
  • 2011-07-17
相关资源
最近更新 更多