expected primary-expression before 'for'



  • Hallo Leute,
    ich habe erst vor zwei Tagen angefangen zu Programmieren also vergibt mir Anfängerfehler.

    Ich habe den unten sichtbaren Code geschrieben, denn ich wollte ein Lied mithilfe eines Arduino UNO R3 auf einem Piezo und einem Active Buzzer spielen lassen. Wenn ich die beiden einzeln angesteuert habe, haben sie funktioniert, aber als ich sie gemeinsam Ansteuern wollte, kamm die Fehlermeldung im Titel in [46].

    Ich würde mich sehr freuen wenn jemand eine Lösung für das Problem hat.

    Mfg

    [code]
    #include "pitches.h"
    
    int melody[] = {
    
      NOTE_D2, NOTE_D2, NOTE_D3, NOTE_A2, 0, NOTE_GS2, 0, NOTE_G2, NOTE_F2, NOTE_D2, NOTE_F2, NOTE_G2,
      NOTE_C2, NOTE_C2, NOTE_D3, NOTE_A2, 0, NOTE_GS2, 0, NOTE_G2, NOTE_F2, NOTE_D2, NOTE_F2, NOTE_G2,
      NOTE_B1, NOTE_B1, NOTE_D3, NOTE_A2, 0, NOTE_GS2, 0, NOTE_G2, NOTE_F2, NOTE_D2, NOTE_F2, NOTE_G2,
      NOTE_AS1, NOTE_AS1, NOTE_D3, NOTE_A2, 0, NOTE_GS2, 0, NOTE_G2, NOTE_F2, NOTE_D2, NOTE_F2, NOTE_G2,
      
      
    };
    
    int noteDurations[] = {
    
      16, 16, 8, 8, 16, 16, 16, 8, 8, 16, 16, 16,
      16, 16, 8, 8, 16, 16, 16, 8, 8, 16, 16, 16,
      16, 16, 8, 8, 16, 16, 16, 8, 8, 16, 16, 16,
      16, 16, 8, 8, 16, 16, 16, 8, 8, 16, 16, 16,
    };
    
    int melody2[] = {
    
      NOTE_D2, NOTE_D2, NOTE_D3, NOTE_A2, 0, NOTE_GS2, 0, NOTE_G2, NOTE_F2, NOTE_D2, NOTE_F2, NOTE_G2,
      NOTE_C2, NOTE_C2, NOTE_D3, NOTE_A2, 0, NOTE_GS2, 0, NOTE_G2, NOTE_F2, NOTE_D2, NOTE_F2, NOTE_G2,
      NOTE_B1, NOTE_B1, NOTE_D3, NOTE_A2, 0, NOTE_GS2, 0, NOTE_G2, NOTE_F2, NOTE_D2, NOTE_F2, NOTE_G2,
      NOTE_AS1, NOTE_AS1, NOTE_D3, NOTE_A2, 0, NOTE_GS2, 0, NOTE_G2, NOTE_F2, NOTE_D2, NOTE_F2, NOTE_G2,
      
      
    };
    
    int noteDurations2[] = {
    
      16, 16, 8, 8, 16, 16, 16, 8, 8, 16, 16, 16,
      16, 16, 8, 8, 16, 16, 16, 8, 8, 16, 16, 16,
      16, 16, 8, 8, 16, 16, 16, 8, 8, 16, 16, 16,
      16, 16, 8, 8, 16, 16, 16, 8, 8, 16, 16, 16,
    };
    
    
    void setup() {
    
    
      while (
    
       for (int thisNote = 0; thisNote < 48; thisNote++) {
    
        int noteDuration = 2000 / noteDurations[thisNote];
    
        tone(8, melody[thisNote], noteDuration);
    
        int pauseBetweenNotes = noteDuration * 1.30;
    
        delay(pauseBetweenNotes);
    
        noTone(8);
       } ) {
    
       for (int thisNote2 = 0; thisNote2 < 48; thisNote2++) {
    
        int noteDuration2 = 2000 / noteDurations2[thisNote2];
    
        tone(9, melody2[thisNote2], noteDuration2);
        
        int pauseBetweenNotes2 = noteDuration2 * 1.30;
    
        delay(pauseBetweenNotes2);
    
        noTone(9);
       }
    
    } }
    
    [/code]
    


  • @TW1TTER was hast du mit dem while vor?



  • @TW1TTER Der Compiler liefert i.A.Angaben, in welcher Zeile und Spalte der Fehler auftaucht.

    Warum macht setup() schon die ganze Arbeit?
    Das widerspricht dem Namen (und damit der Aufgabe) der Funktion.



  • @TW1TTER sagte in expected primary-expression before 'for':

      while (
    
       for (int thisNote = 0; thisNote < 48; thisNote++) {
    
        int noteDuration = 2000 / noteDurations[thisNote];
    
        tone(8, melody[thisNote], noteDuration);
    
        int pauseBetweenNotes = noteDuration * 1.30;
    
        delay(pauseBetweenNotes);
    
        noTone(8);
       } ) {
    

    while (for (...) {...}) { ..
    Das for (...) {...} als "Bedingung" für die while Schleife macht überhaupt keinen Sinn. Also ich verstehe nichtmal was du damit erreichen wolltest. Also abgesehen davon dass es halt falsch ist.



  • @DirkB @hustbaer @Schlangenmensch,

    Ich wollte mit dem while es so machen, dass zwei unterschiedlich Buzzer gleichzeitig etwas spielen.



  • @TW1TTER
    Die Syntax von while ist halt

    while(condition)
    {
    // do something
    }
    

    Und auch Sachen die in einer while Schleife stehen, werden sequentiell hintereinander ausgeführt.

    Also: Ursache der Fehlermeldung: Syntaktisch falscher Code.
    Wie man es richtig macht, kann ich dir nicht sagen, dafür verstehe ich deine eigentliche Idee noch nicht gut genug.



  • OK.
    Das geht aber so nicht.

    Dein Vorhaben umzusetzen ist schon möglich, aber du musst den Code dazu stärker umschreiben, so dass beide Melodien in der selben Schleife abgespielt werden.

    Dazu musst du dir für beide Melodien jeweils merken:

    • Welche Note gerade gespielt wird -> nennen wir diese Werte noteIndex1 und noteIndex2
    • Wie lange sie noch gespielt werden soll -> remainingTime1 und remainingTime2

    Dann ermittelst du die kleinere der beiden Zeiten -> waitTime
    Dann wartest du: delay(waitTime)
    Dann ziehst du die gewartete Zeit von remainingTime1 und remainingTime2 ab.
    Entweder remainingTime1 oder remainingTime2 oder beide sind dadurch 0 geworden.

    Wenn remainingTime1 jetzt 0 ist, dann erhöhst du noteIndex1. Wenn noteIndex1 dann >= 48 ist, dann stoppst du den 1. Buzzer. Andernfalls setzt du die neue Frequenz für den 1. Buzzer und speicherst die Dauer für die neue Note in remainingTime1.

    Das selbe dann nochmal für remainingTime2, noteIndex2 und den 2. Buzzer.

    Das ganze wiederholst du so lange bis noteIndex1 und noteIndex2 >= 48 sind.

    EDIT: Ne, sorry, so einfach geht's wohl doch nicht. Hab übersehen dass die tone Funktion ja synchron ist. Damit das überhaupt geht brauchst du eine asynchrone Funktion um die Buzzer anzusteuern. Also wo du die Frequenz setzen kannst und der Buzzer dann anfängt diese Frequenz auszugeben während das restliche Programm weiter läuft. Falls es so eine Funktion nicht gibt müsstest du die Buzzer "manuell" ansteuern, z.B. mit einem Timer-Interrupt. Dann wird's aber nochmal ein gutes Stück komplizierter.



  • Ok danke für all eure Antworten und Tipps.
    Ich glaube und hoffe dass ich es jetzt selbst hinbekomme und wenn nicht melde ich mich wieder.

    Mfg TW1TTER


Anmelden zum Antworten