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 (...) {...}) { ..
Dasfor (...) {...}
als "Bedingung" für diewhile
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 vonwhile
ist haltwhile(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
undnoteIndex2
- Wie lange sie noch gespielt werden soll ->
remainingTime1
undremainingTime2
Dann ermittelst du die kleinere der beiden Zeiten ->
waitTime
Dann wartest du:delay(waitTime)
Dann ziehst du die gewartete Zeit vonremainingTime1
undremainingTime2
ab.
EntwederremainingTime1
oderremainingTime2
oder beide sind dadurch 0 geworden.Wenn
remainingTime1
jetzt 0 ist, dann erhöhst dunoteIndex1
. WennnoteIndex1
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 inremainingTime1
.Das selbe dann nochmal für
remainingTime2
,noteIndex2
und den 2. Buzzer.Das ganze wiederholst du so lange bis
noteIndex1
undnoteIndex2
>= 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.
- Welche Note gerade gespielt wird -> nennen wir diese Werte
-
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