Bloody C Noob [help]

  • Hi Leute, helft einem blutigen C Anfänger


    ich habe folgendes Programm, welches ein AudioFile abspielen soll



    Ich erhalte folgende Fehlermeldung:

    Code
    1. Compiling...
    2. WAVPlayer.c
    3. d:\eigene dateien\unizh\diplomarbeit\workspace\wavplayer\src\wavplayer.c(24) : error C2065: 'Lurl' : undeclared identifier
    4. d:\eigene dateien\unizh\diplomarbeit\workspace\wavplayer\src\wavplayer.c(24) : warning C4047: 'function' : 'const unsigned short *' differs in levels of indirection from 'int '
    5. d:\eigene dateien\unizh\diplomarbeit\workspace\wavplayer\src\wavplayer.c(24) : warning C4024: 'PlaySoundW' : different types for formal and actual parameter 1


    Das bedeutet der Parameter url ist nicht mit dem verlangten Datentyp von PlaySound kompatibel, right?
    Original sieht der Methodenaufruf so aus:

    Code
    1. PlaySound(_T("\\Windows\\empty.wav"), NULL, SND_ASYNC | SND_FILENAME);


    wie zum Kuckuck muss ich die Datentypen konvertieren?
    und warum kann das nicht so übersichtlich sein wie in java? ;)

    A fine is a tax for doing wrong.
    A tax is a fine for doing well.

    2 Mal editiert, zuletzt von 2cool4u ()

  • kann hier jemand C coden?
    Ok, hab noch was rausgefunden. _T("pfad\\zum\\file.wav") ist ein Makro.

    A fine is a tax for doing wrong.
    A tax is a fine for doing well.

    Einmal editiert, zuletzt von 2cool4u ()

  • Zitat

    Original von 2cool4u
    Ok, hab noch was rausgefunden. _T("pfad\\zum\\file.wav") ist ein Makro.


    Und was macht das Makro genau?
    Bzw. was erwartet denn PlaySound() für einen Dateityp? Hast du da evt. den Prototyp oder so?

    "It really is as useful as a snooze button on a smoke alarm" Jeremy Clarkson


    "Wennsd den Baum siehst, in den du rein fährst, hast untersteuern. Wennsd ihn nur hörst, hast übersteuern" Walter Röhrl

  • eben, das weiss ich nicht so genau
    _T() konvertiert anscheinend ANSI String zu UNICODE Strings

    A fine is a tax for doing wrong.
    A tax is a fine for doing well.

  • hmmmm, und dieses PlaySound(), was steckt da dahinter? Eine C-Funktion? Die kann mit Unicode wohl nicht wirklich etwas anfangen.
    Ich blicke bei diesem Mix aus Java und C nicht mehr wirklich durch....

    "It really is as useful as a snooze button on a smoke alarm" Jeremy Clarkson


    "Wennsd den Baum siehst, in den du rein fährst, hast untersteuern. Wennsd ihn nur hörst, hast übersteuern" Walter Röhrl

  • PlaySound ist eine WinAPI Systemfunktion und verlangt eben wohl einen Unicode String.

    A fine is a tax for doing wrong.
    A tax is a fine for doing well.

  • noch ein bisschen weiter


    habe nun sowas:


    Code
    1. JNIEXPORT void JNICALL Java_sound_WAVPlayer_playSound
    2. (JNIEnv *env, jobject obj, jstring jstr)
    3. {
    4. const char* url = (*env)->GetStringUTFChars( env, jstr, 0 );
    5. (*env)->ReleaseStringUTFChars( env, jstr, url );
    6. PlaySound(url, NULL, SND_ASYNC | SND_FILENAME);
    7. return;
    8. }


    und bekomme den Fehler:

    Code
    1. D:\Eigene Dateien\Unizh\Diplomarbeit\workspace\WAVPlayer\src\WAVPlayer.c(22) : warning C4133: 'function' : incompatible types - from 'const char *' to 'const unsigned short *'


    heisst das jetzt, dass PlaySound einen DatenTyp const unsigned short * haben möchte?

    A fine is a tax for doing wrong.
    A tax is a fine for doing well.

    Einmal editiert, zuletzt von 2cool4u ()

  • Nimm mal den zweiten parameter von PlaySound raus (der NULL) scheint eine überladene funktion zu sein



    #Edit


    PlaySound((LPCWSTR)L"hit3.wav", NULL, SND_FILENAME | SND_SYNC);


    fand ich nur kurz mit google, andere typenkonvertierung als deine



    #Edit2


    BOOL16 WINAPI sndPlaySound(LPCSTR lpszSoundName, UINT16 uFlags);
    BOOL WINAPI sndPlaySoundA(LPCSTR lpszSound, UINT fuSound);
    BOOL WINAPI sndPlaySoundW(LPCWSTR lpszSound, UINT fuSound);
    #define sndPlaySound WINELIB_NAME_AW(sndPlaySound)
    BOOL WINAPI PlaySoundA(LPCSTR pszSound, HMODULE hmod, DWORD fdwSound);
    BOOL WINAPI PlaySoundW(LPCWSTR pszSound, HMODULE hmod, DWORD fdwSound);
    #define PlaySound WINELIB_NAME_AW(PlaySound)


    |---> it MUST be a spoon! <---|


      

    3 Mal editiert, zuletzt von Xoood ()

  • aktueller Stand der Forschung ist folgender


    laufen tuts aber immer noch nicht.
    Problem ist wohl die Konvertierung von jstring in LPCTSTR
    dummerweise kann ich auch schlecht debuggen, ich weiss nicht wie mit emeddedvc++ und auf pocketpcs gibs keine konsole


    Edit, ich probier jetzt mal mit cast nach LPCWSTR
    Edit 1, hilft leider auch nicht. Würde ja zugern wissen, was da für Werte rauskommen.
    Edit 2, hab ne Konsole für PocketPC gefunden
    printf(str); bringt ganz lieb \java\audio\ringin.wav. sollten wohl \\ sein. da geht unterwegs einer verloren.

    A fine is a tax for doing wrong.
    A tax is a fine for doing well.

    3 Mal editiert, zuletzt von 2cool4u ()

  • ja, IMMER wenn du \ in eine zeichenkette füllen willst, musst du einer mehr als gewollt nehmen. mit \ alleine interpretiert er ja den "Befehl" mit dem nächsten zeichen, aus \\ wird \...


    |---> it MUST be a spoon! <---|


      

  • jo richtig, aber auch wenn ich \\\\ mache hab ich zwar am schluss \\java\\audio\\ringin.wav, aber kein ton. Funktioniert also irgendwas immer noch nicht.


    wie könnte ich denn diesen gecasteten wert (LPCWSTR)str ausgeben?

    A fine is a tax for doing wrong.
    A tax is a fine for doing well.

    Einmal editiert, zuletzt von 2cool4u ()

  • hast dus schon mal mit dem eclipse editor versucht??


    und vieleicht wäre noch ein fehler handling ({try""catch}) angebracht...falls du eins hast kann ich es momentan grad ned entdecken ;)

  • das Problem ist eben ein bisschen, dass ich von C/C++ null Ahnung hab. Und daher auch nicht weiss, welches die besten Editoren usw. sind. Was ich jetzt da zusammenbastle hab ich mir mühsam zusammengesucht.


    Ich benutze jetzt EmbeddedVisualC++, weil es das von MS gratis gibt und weil da auch grad alles dabei ist um für die PocketPC Umgebung zu kompilieren.


    Fehlerhandling, naja es muss einfach funktionieren. Auftretende Fehler werde ich nie zu Gesicht bekommen. Die eigentliche Anwendung läuft in Java. Ich brauche nur diese dll als Schnittstelle zu dieser Playsound Systemfunktion.

    A fine is a tax for doing wrong.
    A tax is a fine for doing well.

    Einmal editiert, zuletzt von 2cool4u ()

  • hmm, also cout wird wohl nicht unterstützt, da keine Console vorhanden.


    Ich habe mal ein try catch rundum gebaut. Aber es scheint kein Fehler aufzutreten. Jedenfalls rennt er da nicht rein.

    A fine is a tax for doing wrong.
    A tax is a fine for doing well.

  • hab mal noch sowas eingefügt
    MessageBox( 0, (LPCTSTR)str,_T("Message box from VC++ "), 0 )


    die MessageBox zeigt quadrätchen statt irgend einem text.
    Stimmt einfach was mit den casts nicht.


    hab noch dieses Beispiel gefunden,
    das kompiliert aber bei mir so nicht, für PocketPC scheint ein anderer Datentyp verlangt zu werden als für Win32


    A fine is a tax for doing wrong.
    A tax is a fine for doing well.