Konvertierung von int zu LPCTSTR



  • Hallo zusammen

    ich habe sowas:

    #define SAMPLESTATUS UNKNOWN 0
    

    und moechte hier aus dem integer wieder auf das UNKNOWN schliessen, bzw mir anzeigen lassen:

    GetDlgItem(IDC_SAMPLENAME_TF)->SetWindowText(pSample->m_sStatus);
    

    Mein Problem ist jetzt, wie ich von dem Integer, das in m_sStatus steht, wieder auf den eigentlichen Status (also zum Beispiel unknown) komme. Geht das ueberhaupt?

    Danke fuer eure Hilfe



  • Nein.



  • Du könntest bestenfalls eine Funktion schreiben, die alle möglichen Werte einer Textausgabe zuordnet:

    LPCTSTR to_str(int val)
    {
      switch(val)
      {
      case UNKNOWN: return _T("Unknown");
      case STATE1 : return _T("Status 1");
      ...
      default:      return _T("...");
      }
    }
    
    GetDlgItem(IDC_SAMPLENAME_TF)->SetWindowText(to_str(pSample->m_sStatus));
    

    (PS: Irgendwas sieht an deiner #define-Zeile seltsam aus)



  • CStoll schrieb:

    ...
    (PS: Irgendwas sieht an deiner #define-Zeile seltsam aus)

    Bin ich auch drüber gestolpert ... und kann mir nicht vorstellen, dass das sinnvoll einsatzbar ist (mal ganz davon abgesehen, dass der Präprozessor sowieso vom Teufel ist ! 😉

    Gruß,

    Simon2.



  • o.k., dann weiter:

    ich habe eine switch-case Anwendung und moechte gerne auf dem Bildschirm was anzeigen. Wenn ich allerdings meinen jeweiligen String in der case Anwendung initialisieren will, bekomme ich den Fehler dass es nicht initialisiert werden konnte wegen den nachfolgenden cases.

    switch(pSample->m_nStatus)
    				{
    					case 0:
    						CString s = "unknown";
    						GetDlgItem(IDC_SAMPLESTATUS_TF)->SetWindowText(s);
    						break;
    					case 2:
                              CString t = "sealed";
    						GetDlgItem(IDC_SAMPLESTATUS_TF)->SetWindowText(t);
    						break;
    					case 3:
                              CString g = "loading";
    						GetDlgItem(IDC_SAMPLESTATUS_TF)->SetWindowText(g);
    						break;
    

    Die Fehlermeldung lautet dann:

    error C2360: initialization of 's' is skipped by 'case' label
    


  • Du musst den string vor dem switch Deklarieren.



  • DAS DA ist ein sehr gutes Beispiel, wie man es nicht machen sollte. Abgesehen von dem geänderten Wert für deine Strings passiert in jedem case-Block das selbe, also kannst du diesen Teil auch auslagern:

    CString str;
    switch(pSample->m_nStatus)
    case 0:
      str = "unknown";
      break;
    case 2:
      str = "sealed";
      break;
    case 3:
      str = "loading";
      break;
    ...
    }
    GetDlgItem(IDC_SAMPLESTATUS_TF)->SetWindowText(str);
    

    Ansonsten noch etwas zu deinem Symptom: Variablen existieren im kompletten Block, in dem sie deklariert wurden (bis zur schließenden Klammer } ). Allerdings umgeht in deinem Fall das 'case 2:' den Abschnitt, in dem s initialisiert wurde (daß s in dem zugehörigen Block nicht verwendet wird, ist für den Compiler erstmal unerheblich - es existiert und hat nun einen undefinierten Wert). Als Lösung solltest du entweder die Deklarationen aus dem switch auslagern oder jeden case-Abschnitt in einen eigenen Block verpacken:

    switch(test)
    {
    case 0:
      {
        CString s0 = "Wert 0";
        ...
        break;
      }
    case 1:
      {
        int v1 = 4711;
        ...
        break;
      }
    }
    


  • CStoll schrieb:

    ...Allerdings umgeht in deinem Fall das 'case 2:' den Abschnitt, ...

    💡 💡 💡
    Also das war mir definitiv auch neu ! Danke für die Erläuterung.

    Wenn ich das also richtig verstehe, "meckert" der Compiler, dass man in den Scope der Variable "durch eine Hintertür hineinspringen" kann ... was dann das Abräumen (bei der "}" vom switch) uneindeutig macht.

    CStoll schrieb:

    ...(daß s in dem zugehörigen Block nicht verwendet wird, ist für den Compiler erstmal unerheblich ...

    ... vor Allem, weil der Dtor auf jeden Fall aufgerufen wird, egal, ob man sie nun verwendet oder nicht.

    Fühle mich bestätigt, da der Compiler kein Problem damit hat, wenn man die Variable in den letzten Block packt (ohne Klammern) ... da kann ja nicht mehr "reingesprungen" werden.

    switch(i) {
       case 0:
          cout << " 0\n";
          break;
       case 1:
          string s("Simon");
          cout << s << " default: " << i << "\n";
       }
    

    Seeehr interessant !

    Gruß,

    Simon2.


Anmelden zum Antworten