Fehler bei switch



  • Hallo zusmmen,

    leider erhalte ich folgenden Fehler:

    Run-Time Check Failure #2 - Stack around the variable 'write_buffer' was corrupted.

    char write_buffer[10] = {' '};
    
    ...
    
    // Der Write funktioniert, die Variable wird geschrieben und später kommt auch ein Wert per Read zurück, d.h. der Wert wird geschrieben und gelesen
    
    	if(!WriteFile(hSerial, &write_buffer, n, &dwBytesWrite, NULL))
    	{
    		//error occurred. Report to user
    		msgboxIDss = MessageBox(NULL, (LPCWSTR)L"Fehler bei WriteFile!",
    			(LPCWSTR)L"Fehler", MB_OK | MB_ICONEXCLAMATION);
    		EndDialog(hwnd, 1);
    	}
    
    // Nach dem switch, der am Ende der Funktion steht knallt es, wieso?
    	switch ( buffer_ende[2] )
    	{
    	case 'lX':
    		newsize = strlen(read_buffer) + 1;
    		origsize = wcslen(a_buffer_lX_co) + 1;
    		mbstowcs_s(&convertedChars,a_buffer_lX_co,newsize,read_buffer,_TRUNCATE);
    		break;
    
    	case 'Y':
    		i++;
    		break;
    	}
    

    Hier die ganze Funktion:

    void ReadAndWrite(HWND hwnd, wchar_t p_wchar_T[10])
    {
    	char write_buffer[10] = {' '};
    	char read_buffer[10] = {' '};
    	char buffer_ende[2] = {' '};
    	size_t newsize = strlen(write_buffer) + 1;
    	size_t origsize = wcslen(p_wchar_T) + 1;
    	size_t convertedChars = 0;
    	int i = 0;
    
    	wcstombs_s(&convertedChars, write_buffer, origsize, p_wchar_T, _TRUNCATE);
    	//wcstombs_s(&convertedChars, write_buffer, origsize, buffer_lX, _TRUNCATE);
    
    	if(!WriteFile(hSerial, &write_buffer, n, &dwBytesWrite, NULL))
    	{
    		//error occurred. Report to user
    		msgboxIDss = MessageBox(NULL, (LPCWSTR)L"Fehler bei WriteFile!",
    			(LPCWSTR)L"Fehler", MB_OK | MB_ICONEXCLAMATION);
    		EndDialog(hwnd, 1);
    	}
    
    	if(!ReadFile(hSerial, &read_buffer, n, &dwBytesRead, NULL))
    	{
    		//error occurred. Report to user.
    		msgboxIDss = MessageBox(NULL, (LPCWSTR)L"Fehler bei ReadFile!",
    			(LPCWSTR)L"Fehler", MB_OK | MB_ICONEXCLAMATION);
    		EndDialog(hwnd, 1);
    	}
    
    	// Da man nicht genau weiß, welcher Joystickwert zurück kommt, muss man auf die letzten beiden Stellen abfragen, 
    	// dort steht welcher Joystickwert gelesen wurde	
    
    	buffer_ende[0] = read_buffer[5];
    	buffer_ende[1] = read_buffer[6];
    
    	switch ( buffer_ende[2] )
    	{
    	case 'lX':
    		newsize = strlen(read_buffer) + 1;
    		origsize = wcslen(a_buffer_lX_co) + 1;
    		mbstowcs_s(&convertedChars,a_buffer_lX_co,newsize,read_buffer,_TRUNCATE);
    		break;
    
    	case 'Y':
    		i++;
    		break;
    	}
    }
    

    Hat jemand eine Idee?

    Vielen Dank

    datatom



  • Und wo hast du n definiert? Hast du sichergestellt, daß der Wert nicht zu groß ist, um in deine Arrays zu passen?



  • Ich weiß gar nicht wozu n da ist:-(

    int n = 10;
    


  • datatom schrieb:

    Ich weiß gar nicht wozu n da ist:-(

    Du benutzt es aber in Zeile 14 und 22 😉

    Ansonsten liegt der Wert buffer_ende[2] , den du im switch abfragst, außerhalb des erlaubten Index - und die Größenangabe für den Funktionsparameter wird btw vom Compiler nicht berücksichtigt.



  • Können die Compiler heute auch so was:

    switch ( buffer_ende[2] )
        {
        case 'lX':
    

    😕

    MfG f.-th.



  • Wenn du mir erklärst, was 'lX' ist.

    Edit: Ach sorry, du hast das kopiert.



  • Früher war das einfach - switch konnte Werte von -1 bis 255 (?)

    Kann switch in entsprechendem Umfeld auch Unicode?
    Microsoft kann da scheint es mehr:
    http://msdn.microsoft.com/en-us/library/k0t5wee3(v=vs.80).aspx

    Wie sieht das da aus bezüglich C++0x
    oder was machen die anderen Compilerlieferanten?

    MfG f.-th.



  • f.-th. schrieb:

    Früher war das einfach - switch konnte Werte von -1 bis 255 (?)

    Hast du dazu auch eine offizielle Aussage? Ich finde zwar die Festlegung, daß der Compiler mindestens 257 case-Marken unterstützen muß, aber nichts zum erlaubten Wertebereich der case-Konstanten



  • Offiziell nein.

    2^8 + 1 = 257

    Ich unterstelle mal das 0 bis 255 von allen Compilern verstanden wird.
    Da ist halt die 257ste Marke, wo sollen wir damit hin? Die passt ja nicht mehr in ein Byte. Irgend woher benötigen wir mindestens noch ein Bit.

    Da mir so etwas keine Ruhe lässt:
    http://std.dkuug.dk/JTC1/SC22/WG14/www/docs/n843.htm
    sagt 1023 case labels.

    Aber vielleicht findet oder kennt ja jemand noch eine andere Variante 😕

    MfG f.-th.



  • Oh, die 1023 gehören ja zum C99 Entwurf.

    Gilt da bei C++0whatever das gleiche oder noch 257 case label 😕

    MfG f.-th.


Anmelden zum Antworten