Format-Probleme mit übergabe eines Strings an eine Funktion. (Auch Heap-Block Problem)



  • FreakySmiley schrieb:

    Früher sah das so aus:

    if(zc<=9)
    	sprintf(spa[zc], " %i", zc++);
    else										
    	sprintf(spa[zc], "%i", zc++);
    

    Heute geht nur noch das:

    if(zc<=9)
    {
    	sprintf(spa[zc], " %i", zc);
    	zc++;
    }
    else
    {
    	sprintf(spa[zc], "%i", zc);
    	zc++;
    }
    

    Das nehme ich dir nicht ab.
    Je nachdem, wie spa und zc konkret definiert sind, muss dass jeder C Compiler übersetzen.
    Schreibe mal ein eigenes main mit nur o.g. Code, übersetze dann und nenne die konkreten Compilerausgaben.



  • Hi,

    was für Compilerausgaben willst du denn sehen? Zu dem Problem mit "sprintf" gibt es keine Compilerausgaben. Nur zu dem Problem mit "strcat".
    Ich könnte den Code hier hin schreiben

    Ich könnte mal den komletten alten Code, der früher funktioniert hat (Wo ich nur <stdlib.h> includiert habe damit diese "system" Aufrufe noch funktionieren.) und denk kompletten neuen Code hier reinschreiben, damit ihr das selbst testen könnt.

    Aber das wird ein langer Post.

    MfG

    PS: Schon eine Idee zu dem Problem im Post vom 12:53:16 30.10.2011 ?



  • FreakySmiley schrieb:

    PS: Schon eine Idee zu dem Problem im Post vom 12:53:16 30.10.2011 ?

    Vielleicht ist es einfacher, wenn Du bei der Version davor bleibst. Reserviere einfach genug Speicher für den UNICODE-String, wie ich es Dir gezeigt habe und lass den Rest im MBCS-Format:

    int ausgabe(const char *ansistr)
    {
        int i=0;
        int len = MultiByteToWideChar(CP_ACP, 0, ansistr, -1, NULL, 0);
        LPWSTR unicodestr = (LPWSTR)malloc(len * sizeof(WCHAR)); // free() nicht vergessen!??
        MultiByteToWideChar(CP_ACP, 0, ansistr, -1, unicodestr, len);
        ISpVoice * pVoice = NULL;
    
        if (FAILED(::CoInitialize(NULL)))
            return FALSE;
    
        HRESULT hr = CoCreateInstance(CLSID_SpVoice, NULL, CLSCTX_ALL, IID_ISpVoice, (void **)&pVoice);
        if( SUCCEEDED( hr ) )
        {
            hr = pVoice->Speak(unicodestr, 0, NULL);
            pVoice->Release();
            pVoice = NULL;
        }
        free(unicodestr); //Verursacht Heap-Block fehler.
        ::CoUninitialize();
        return TRUE;
    }
    


  • Hm, das mag wohl stimmen.
    Nachdem ich wieder einmal mein C-Buch zu rate gezogen habe, verstehe ich auch was genau deine Lösung macht.
    Danke.

    Dann gibts jetzt nur noch das Problem mit den veränderten strcat und sprintf. Kann es sein das ich schon mit C++11 arbeiten und sich deshalb was geändert hat? Ich habe Visual c++ Express nämlich erst vor einer Woche oder so intalliert, da war das ja schon draußen.
    Allerdings, fällt mir ein, lautet der Name der Sourcecode-Dateien xxxx.c und nicht xxxx.cpp. Da ändert sich doch auch das Verhalten von Visual c++, oder? ALos soltle doch die umstellung auf c++11 keine Auswirkung ahben auf .c Programme. Und darin ist nur C, kein C++.

    MfG


Anmelden zum Antworten