Problem mit "PlaySound"
-
Hi. Dies ist mein erster Beitrag in diesem Forum (es ist eigentlich generell mein erster Eintrag in einem Froum^^).
Ich habe folgendes Problem: Ich habe vor kurzem angefangen C/C++ zu programmieren und hatte die Idee für einen Timer/Wecker.
#include <stdio.h> #include <stdlib.h> #include <time.h> #include <windows.h> #include <mmsystem.h> #include <shlobj.h> #define AE (unsigned char)142 #define ae (unsigned char)132 #define OE (unsigned char)153 #define oe (unsigned char)148 #define UE (unsigned char)154 #define ue (unsigned char)129 #define ss (unsigned char)225 int main() { SetConsoleTitle("Wecker v0.5 Copyright by *********"); system("color 0a"); int wahl, timer, sound; printf("Was wollen Sie tun?\n"); printf("(1) ZU einer bestimmten Zeit einen Alarm ausl%csen oder (buggy)\n", oe); printf("(2) NACH einer bestimmten Zeit einen Alarm ausl%csen.\n", oe); printf("Variante: "); scanf("%i", &wahl); if(wahl==1) { printf("Diese Variante ist momentan noch nicht verfügbar. Bitte nehmen Sie die 2. Variante\n"); /*.........................Baustelle........................*/ } else { printf("Geben Sie bitte die Zeit(in min) an, nach der der Alarm ausgel%cst werden soll: ", oe); scanf("%i", &timer); system("cls"); printf("Bitte w%chlen Sie aus einem der Alarm-Beispiele\n", ae); printf("(1) normaler Wecker (2) Imperium\n"); printf("(3) R2D2 (4) Schrillen\n"); printf("Welchen Ton wollen Sie abspielen: "); scanf("%i", &sound); system("cls"); if(sound==1) { printf("Wenn das Klingeln ert%cnt, k%cnnen Sie das Klingeln\ndurch das Dr%ccken einer beliebigen Taste beenden.\n", oe, oe, ue); sleep(timer*60000); while(!kbhit()) { PlaySound("Wecker.wav", NULL, SND_FILENAME); } } else { if(sound==2) { printf("Wenn das Klingeln ert%cnt, k%cnnen Sie das Klingeln\ndurch das Dr%ccken einer beliebigen Taste beenden.\n", oe, oe, ue); sleep(timer*60000); while(!kbhit()) { PlaySound("Imperium.wav", NULL, SND_FILENAME); } } else { if(sound==3) { printf("Wenn das Klingeln ert%cnt, k%cnnen Sie das Klingeln\ndurch das Dr%ccken einer beliebigen Taste beenden.\n", oe, oe, ue); sleep(timer*60000); while(!kbhit()) { PlaySound("R2D2.wav", NULL, SND_FILENAME); } } else { if(sound==4) { printf("Wenn das Klingeln ert%cnt, k%cnnen Sie das Klingeln\ndurch das Dr%ccken einer beliebigen Taste beenden.\n", oe, oe, ue); sleep(timer*60000); while(!kbhit()) { PlaySound("Schrillen.wav", NULL, SND_FILENAME); } }}}} } system("PAUSE"); return 0; }
1. Zu aller erst...Das Programm ist noch in der Entwicklungsphase, weswegen die 1. Variante noch nicht fertig ist.
2. ich weiß das es switch.case gibt, aber das mit den vieln "if's" war noch die letze idee die ich hatte.Nun aber das Problem: Egal welchen Klingelton man wählt, es wird nur bei dem ersten der tatsächliche ton abgespielt. bei den anderen kommt eine art windows.fehler.ton. wie kann ich das problem beheben?
gruß 3P!CF41L
PS: OS: Win7 HP 64-bit
IDE: Bloodshed Dev-C++
PS 2: die dateien leigen im selben ordner wie die *.exe. da ist das angeben des pfades doch nicht nötig...oder doch?
-
Hast du denn mal mit dem Debugger angeschaut, ob du wirklich an der richtigen Stelle herauskommst?
PS: Die Code-Wiederholungen kann man auch umgehen, indem man das Programm passend umstrukturiert:
char* files[] = {"Wecker.wav", "Imperium.wav", "R2D2.wav", "Schrillen.wav" }; if(sound>=1 && sound<=4) { printf("Wenn das Klingeln ert%cnt, k%cnnen Sie das Klingeln\ndurch das Dr%ccken einer beliebigen Taste beenden.\n", oe, oe, ue); sleep(timer*60000); while(!kbhit()) { PlaySoundfiles[sound-1], NULL, SND_FILENAME); } } else { printf("unbekannter Klingelton\n"); }
-
Danke für die schnelle Antwort. Ich werde das morgen früh sofort ausprobieren. Ich verstehe aber nicht was das '*' nach dem char für eine Funktion hat.
-
3P!CF41L schrieb:
Ich verstehe aber nicht was das '*' nach dem char für eine Funktion hat.
"files" ist ein Array von char-Zeigern (die jeweils auf ein String-Literal verweisen).
-
Ah. Gut. Jetzt hab ich's verstanden.
Und mal noch für c++: in c kann man ja mit zb system(("%c", string)) etwas einsetzten. Wie geht das in c++?
-
Kannst du die Frage bitte nochmal so formulieren, daß man sie auch versteht?
system() kennt keine Format-String, die man einsetzen könnte - das übernimmt einen einfachen String, der den auszuführenden Befehl enthalten sollte. (und ja, die Funktion existiert wie die restliche ANSI-C Standardbibliothek auch unter C++)
-
Ja ok. Also folgendes:
wenn man zum beispiel den Benutzer des Programmes eine Internetseite öffnen lassen will kann er diese in einem string speichern und man selber kann die dann bei ShellExecute einsetzen
char internet; printf("Bitte geben Sie die Adresse einer Seite ein, die Sie besuchen wollen: "); scanf("%c", &internet); ShellExecute(NULL, ("%c", internet), .....bla bla
meine frage ist nun wie man das mit C++ machen kann (und auch wirklich mit C++ und nicht mit C in C++^^
Aber trotzdem schonmal danke.
-
Also. Ich habe das jetzt ausprobiert und festgestellt das bei allen Klingeltönen außer dem Wecker.wav ein Windows.Fehler.Ton erklingt. Ich weiß echt nicht was ich noch machen soll...=(
die Ordnerstruktur ist übrigensOrdner Wecker
|-Wecker.exe
|-Wecker.wav
|-Imperium.wavusw.
-
Ich hab lange nichts mehr mit c++ gemacht und weiß daher nicht ob das stimmt, aber evt. liegt es deiner if abfragerei. Ich hab die mal auf das vereinfacht:
if(sound==1) { printf("Wenn das Klingeln ert%cnt, k%cnnen Sie das Klingeln\ndurch das Dr%ccken einer beliebigen Taste beenden.\n", oe, oe, ue); sleep(timer*60000); while(!kbhit()) { PlaySound("Wecker.wav", NULL, SND_FILENAME); } } else if(sound==2) { printf("Wenn das Klingeln ert%cnt, k%cnnen Sie das Klingeln\ndurch das Dr%ccken einer beliebigen Taste beenden.\n", oe, oe, ue); sleep(timer*60000); while(!kbhit()) { PlaySound("Imperium.wav", NULL, SND_FILENAME); } } else if(sound==3) { printf("Wenn das Klingeln ert%cnt, k%cnnen Sie das Klingeln\ndurch das Dr%ccken einer beliebigen Taste beenden.\n", oe, oe, ue); sleep(timer*60000); while(!kbhit()) { PlaySound("R2D2.wav", NULL, SND_FILENAME); } } else if(sound==4) { printf("Wenn das Klingeln ert%cnt, k%cnnen Sie das Klingeln\ndurch das Dr%ccken einer beliebigen Taste beenden.\n", oe, oe, ue); sleep(timer*60000); while(!kbhit()) { PlaySound("Schrillen.wav", NULL, SND_FILENAME); } }
Habs nicht getestet, aber vieleicht hilfts. Wie du aber schon gut erkannt hast wäre ein switch/case viel einfacher und übersichtlicher.
Gruß Dimo
-
Danke für deine Mühe. Aber das habe ich alles schon ausprobiert. Das Problem ist das nur einen der Töne erkennt. Es gibt auch keine Probleme beim compilieren. Er erkennt die anderen ainfach nicht =(. Ich werde mal versuchen den ersten Ton in "Schrillen.wav" zu ändern und gucken, ob es etwas damit zu tun hat.
-
OK..Das ist seltsam: egal welcher Ton als erstes definiert (bzw in der switch.case sache vorne) steht, wirklich NUR bei Wecker.wav spielt er den richtigen Ton ab. Auch wenn dieser am Ende definiert ist. Ich verstehe das echt nicht mehr =(.
-
Ok, aber dann würde ich drauf tippen, dass es an deinen Sound-dateien liegt und nicht an deinem Code.
Versuch es doch mal mit anderen Sound-Dateien und schau ob es mit denen funktioniert.
-
3P!CF41L schrieb:
Ja ok. Also folgendes:
wenn man zum beispiel den Benutzer des Programmes eine Internetseite öffnen lassen will kann er diese in einem string speichern und man selber kann die dann bei ShellExecute einsetzen
char internet; printf("Bitte geben Sie die Adresse einer Seite ein, die Sie besuchen wollen: "); scanf("%c", &internet); ShellExecute(NULL, ("%c", internet), .....bla bla
meine frage ist nun wie man das mit C++ machen kann (und auch wirklich mit C++ und nicht mit C in C++^^
Aber trotzdem schonmal danke.
Nimm dir einen Stringstream und bau dir damit den Anweisungsstring zusammen.
(Übrigens sind deine printf()/scanf()-Vorlagen auch in der Liga "C in C++" in "echtem" C++ verwendet man eher cout/cin)
-
CStoll schrieb:
(Übrigens sind deine printf()/scanf()-Vorlagen auch in der Liga "C in C++" in "echtem" C++ verwendet man eher cout/cin)
Das ist ja auch keine C++Anwendung. Die ist absichtlich in C. Ich komme damit besser klar.
Und es hat dann im übrigen auch funktioniert. Ich habe es dann nochmal mit switch.case probiert und dann hat es geklappt.