Probleme mit char



  • Hallo zusammen,

    meine Anwendung soll die aktuelle Uhrzeit mit einem Wechsel von Buchstaben 'a''ab' in der Statusleiste ausgeben.

    Das Resultat soll der Ausgabe in folgendem Format entsprechen:
    "[ 09:52:31 ] [ a Working ]" =>Maske: "[ status_X1 ] [ status_X2 Working ]"

    Mein Problem ist, dass der Compiler folgenden Fehler ausspuckt:

    error C2440: '=': 'const char [2]' kann nicht in 'char [2]' konvertiert werden
    

    und ich nicht weiß, wie ich die Uhrzeit und die Buchstaben wie in der Maske formatiert ausgeben kann. 😞

    VOID CALLBACK Status_Message(HWND hWnd, UINT uMsg, UINT_PTR idEvent, DWORD dwTime)
    {
    	static char status_X1[9], status_X2[2];
    	switch (idEvent)
    	{
    	case Timer_Time:
    		GetTimeFormatA(LOCALE_USER_DEFAULT, 0, NULL, NULL, status_X1, _countof(status_X1));
    	case Timer_Slash:
    		if(status_X2 == "a"){
    			status_X2 = "ab";
    		}
    		else{
    			//status_X2 = "a";
    		}
    	}
    	char status_text[] = "[ 09:52:31 ] [ / Working ]";  :arrow_right: Muster
    	SetDlgItemTextA(hWnd, IDC_STATUS, status_text);
    }
    

    Ich hoffe, ihr könnt mir helfen 🙂

    Mfg, echo<delta>



  • Du kannst nicht an Arrays (status_X2) zuweisen und auch nicht direkt vergleichen!

    Du könntest:
    - einen std::string benutzen // Beste Wahl, IMHO
    - die einzelnen Elemente zuweisen (status_X2[0] = 'a'; status_X2[1] = 'b'; ) und auch vergleichen
    - strcpy() u. strcmp() benutzen, wenn du status_X2 groß genug machst ("ab" enthält 3 Zeichen!)

    Den std::string könntest Du zuweisen und vergleichen:

    std::string status_X2;
    if(status_X2 == "ab")
      status_X2 = "a";
    

    EDIT: Fehlen bei dir die 'break's nach dem 'case' ?



  • Danke für deine schnelle Antwort, nur leider kann ich damit nur die Hälfte anfangen :). => Schreibe erst seit kurzem in C++.

    Am besten wäre ein Codebeispiel. So, wie ich das verstanden habe, kann dann

    case Timer_Slash:
    	if(status_X2 == "a"){
    		status_X2 = "ab";
    	}
    	else{
    		status_X2 = "a";
    	}
    

    so bleiben, wie es ist.

    Folgende fragen sind noch offen:

    1. Ich brauche eine static Variable, von welchem Typ? (String 😕)
    2. Was muss ich dann in GetTimeFormatA ändern?
    3. Und wie kann ich dann die Daten, wie in der Maske ausgeben?

    Mfg, echo<delta>



  • Der case-Zweig kann nicht so bleiben. Du musst jeden case-Zweig mit einem "break;" abschließen, sonst wird der darauf folgende Zweig ebenfalls ausgeführt.

    //wenn var==0 ist, werden die Zweige für 0 und 1 ausgeführt, da case 0 nicht mit einem break beendet wird.
    switch(var) {
      case 0:
        //mache was
      case 1:
        //mache was anderes
        break;  //bei var==1 wird nur dieser Zweig ausgeführt und danach aus dem switch gesprungen
      case 2:
        //mache wieder was
        break;
    }
    

    std::string ist ein C++-Datentyp, der komfortabler ist als die alten char-Arrays. Damit kannst du, wie schon erwähnt wurde, Variablen einfach wie z.B. ints vergleichen (so, wie man es aus anderen Sprachen gewöhnt ist).


Anmelden zum Antworten