Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (WinAPI, Konsole) » skipped by "case" label -hä?

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
13.08.2006, 14:22 Uhr
~Gunnibeard
Gast


hallo,

hab folgendes Problem bei meinem winapi programm:

hier mal der codeschnipsel um des geht:


C++:
    case WM_COMMAND:
        switch(LOWORD(wParam))
        {
            case OK_CHILD:

                TCHAR* buffer = NULL;
                int iLength = 0;

                iLength = GetWindowTextLength(hNam);

                if (iLength > 0)
                {
                    buffer = (TCHAR*) malloc(iLength * sizeof(TCHAR)+1);

                    GetWindowText(hNam, buffer, iLength);

                    g_pKtbch = new Kontaktbuch(buffer);

                    //SendMessage einbauen
                    
                    if (buffer != NULL)
                        free(buffer); buffer = NULL;
                }
                return 0;

            case ABORT_CHILD:
                //SendMessage(hwnd, WM_CLOSE, 0, 0);
                break;
        }

        return 0;


Wenn ich in die switch Anweisung ein case: ABORT_CHILD einbauen, bekomme ich folgende kompilierungsfehler


Zitat:

cdocuments and settings\souljumper\my documents\visual studio 2005\projects\adressbuch\adressbuch\kontaktverwaltung.cpp(279) : error C2360: initialization of 'iLength' is skipped by 'case' label
cdocuments and settings\souljumper\my documents\visual studio 2005\projects\adressbuch\adressbuch\kontaktverwaltung.cpp(277) : see declaration of 'iLength'
cdocuments and settings\souljumper\my documents\visual studio 2005\projects\adressbuch\adressbuch\kontaktverwaltung.cpp(279) : error C2360: initialization of 'buffer' is skipped by 'case' label
cdocuments and settings\souljumper\my documents\visual studio 2005\projects\adressbuch\adressbuch\kontaktverwaltung.cpp(276) : see declaration of 'buffer'
cdocuments and settings\souljumper\my documents\visual studio 2005\projects\adressbuch\adressbuch\kontaktverwaltung.cpp(300) : error C2360: initialization of 'iLength' is skipped by 'case' label
cdocuments and settings\souljumper\my documents\visual studio 2005\projects\adressbuch\adressbuch\kontaktverwaltung.cpp(277) : see declaration of 'iLength'
cdocuments and settings\souljumper\my documents\visual studio 2005\projects\adressbuch\adressbuch\kontaktverwaltung.cpp(300) : error C2360: initialization of 'buffer' is skipped by 'case' label
cdocuments and settings\souljumper\my documents\visual studio 2005\projects\adressbuch\adressbuch\kontaktverwaltung.cpp(276) : see declaration of 'buffer'


lass ich

C++:
            case ABORT_CHILD:
                //SendMessage(hwnd, WM_CLOSE, 0, 0);
                break;


komplett weg, krieg ich es fehlerfrei kompiliert. woran kann das liegen?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
13.08.2006, 14:28 Uhr
xXx
Devil



C++:
// Raus aus der switch-case ...
TCHAR* buffer = NULL;
int iLength = 0;

// Und ab in die case...
case WM_COMMAND:
    {
        switch(LOWORD(wParam))
        {
            case OK_CHILD:
                {
                    iLength = GetWindowTextLength(hNam);

                    if (iLength > 0)
                    {
                        buffer = (TCHAR*) malloc(iLength * sizeof(TCHAR)+1);

                        GetWindowText(hNam, buffer, iLength);

                        g_pKtbch = new Kontaktbuch(buffer);

                        //SendMessage einbauen
                    
                        if (buffer != NULL)
                            free(buffer); buffer = NULL;
                     }
                     return 0;
                } break;
            case ABORT_CHILD:
                {
                    //SendMessage(hwnd, WM_CLOSE, 0, 0);
                } break;
        }
    }
    return 0;
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
13.08.2006, 16:18 Uhr
~Gunnibeard
Gast



Zitat von xXx:

C++:
// Raus aus der switch-case ...
TCHAR* buffer = NULL;
int iLength = 0;

// Und ab in die case...
case WM_COMMAND:
    {
        switch(LOWORD(wParam))
        {
            case OK_CHILD:
                {
                    iLength = GetWindowTextLength(hNam);

                    if (iLength > 0)
                    {
                        buffer = (TCHAR*) malloc(iLength * sizeof(TCHAR)+1);

                        GetWindowText(hNam, buffer, iLength);

                        g_pKtbch = new Kontaktbuch(buffer);

                        //SendMessage einbauen
                    
                        if (buffer != NULL)
                            free(buffer); buffer = NULL;
                     }
                     return 0;
                } break;
            case ABORT_CHILD:
                {
                    //SendMessage(hwnd, WM_CLOSE, 0, 0);
                } break;
        }
    }
    return 0;



hm...ich bin davon ausgegangen das die {} bei switch/case konstruktionen optional sind.

Danke.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
13.08.2006, 18:03 Uhr
xXx
Devil


... das wichtige ist ja auch das die Variable außerhalb der case angelegt wird
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
14.08.2006, 08:59 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


Ohne { } kann man in dem case-Block keine Variablen (an erster Stelle) anlegen, das meint Devil damit. Ansonsten ists normalerweise egal wo man die deklaration hinschreibt, der compiler reserviert den speicherbereich ja normalerweise schon beim betreten der funktion.
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
14.08.2006, 10:50 Uhr
ao

(Operator)



Zitat von FloSoft:
Ansonsten ists normalerweise egal wo man die deklaration hinschreibt ...

... es kann die Lesbarkeit des Codes aber enorm verbessern, wenn jeder case-Block seine eigenen lokalen Variablen deklariert.

Wenn man sich einmal an die Idee gewöhnt hat, dass Variablen nur so lange existieren sollten, wie sie gebraucht werden, dann empfindet man die case-Schreibweise ohne geschwungene Klammern als störenden Stilbruch, weil sie dazu zwingt, Variablen lange vor ihrer ersten Benutzung zu deklarieren und weil es große Codeteile gibt (nämlich alle case-Blöcke bis auf einen), in denen die Variable überhaupt nicht benutzt wird.

ao
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
14.08.2006, 15:13 Uhr
FloSoft
Medialer Over-Flow
(Administrator)



Zitat von ao:

Zitat:
Ansonsten ists normalerweise egal wo man die deklaration hinschreibt ...

... es kann die Lesbarkeit des Codes aber enorm verbessern, wenn jeder case-Block seine eigenen lokalen Variablen deklariert.

Wenn man sich einmal an die Idee gewöhnt hat, dass Variablen nur so lange existieren sollten, wie sie gebraucht werden, dann empfindet man die case-Schreibweise ohne geschwungene Klammern als störenden Stilbruch, weil sie dazu zwingt, Variablen lange vor ihrer ersten Benutzung zu deklarieren und weil es große Codeteile gibt (nämlich alle case-Blöcke bis auf einen), in denen die Variable überhaupt nicht benutzt wird.

ao

klar stilistisch ist das natürlich sinnvoll (mach ich auch so, immer die variablen in dem block definieren in dem sie auch wirklich gebraucht werden). rein syntaktisch her mein ich ists egal
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (WinAPI, Konsole) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: