Ausgabe falsch



  • Hallo,

    ich habe folgende Probleme mit meiner Ausgabe und würde mich über schnelle Hilfe Eurerseits freuen

    Problem Nr1:

    // Insert SSID (Column 1)
    m_BssidListCtrl.SetItemText( i, 1, (LPCTSTR ) zPtr->Ssid.Ssid  );
    

    Ich bekomme zwar eine Ausgabe, aber leider nur chinesische Zeichen. Die Werte sind aber laut debugger richtig in dem Array Ssid abgespeichert.
    Ssid -> ist ein UCHAR[32] Array

    Problem Nr2:

    // Insert RSSI (Column 2)
    strTemp.Format( "%d dBm", zPtr->Rssi );
    m_BssidListCtrl.SetItemText( i, 2, strTemp );
    

    Die Rssi ist eine LONG Variable, und soll natürlich als Zahl ausgegeben werden.
    Folgenden Fehler bekomme ich wenn ich kompiliere:

    error C2664: 'void ATL::CStringT<BaseType,StringTraits>::Format(const wchar_t *,...)': Konvertierung des Parameters 1 von 'const char [7]' in 'const wchar_t *' nicht möglich

    Leider kann ich nicht erkennen, warum es dort den Fehler gibt.

    Ich bedanke mich schon mal im Voraus für Eure Hilfe.

    Gruß mark



  • @1: Arbeitest du mit ANSI- oder UNICODE-Einstellungen? Wenn letzteres der Fall ist, mußt du die auszugebenden Daten mit A2T() in UNICODE-Zeichen umrechnen (such mal nach "String Conversion Macros" in der MSDN).

    (der explizite Typ-Cast verhindert, daß dort eine ähnliche Meldung kommt wie im zweiten Fall)

    @2: Das ist ganz offensichtlich ein UNICODE-Problem - die Lösung lautet _T() oder TEXT():

    // Insert RSSI (Column 2)
    strTemp.Format( _T("%d dBm"), zPtr->Rssi );
    m_BssidListCtrl.SetItemText( i, 2, strTemp );
    


  • Hi,

    vielen Dank. So direkt mal registriert.
    Ich verwende UNICODE.

    Ich habe mal folgendes geändert:

    // Insert SSID (Column 1)
    m_BssidListCtrl.SetItemText( i, 1, (LPCTSTR )(TEXT( "%.*s" ), zPtr->Ssid.SsidLength, zPtr->Ssid.Ssid  ) );
    

    Aber leider immer noch komische Zeichen als Ausgabe 😞

    Auch das zweite Problem bleibt weiterhin eins:

    strTemp.Format( "%d dBm", _T(zPtr->Rssi) );
    m_BssidListCtrl.SetItemText( i, 2, strTemp );
    

    error C2065: 'LzPtr': nichtdeklarierter Bezeichner
    error C2227: Links von "->Rssi" muss sich ein Zeiger auf Klassen-/Struktur-/Union-/generischen Typ befinden.
    error C2664: 'void ATL::CStringT<BaseType,StringTraits>::Format(const wchar_t *,...)': Konvertierung des Parameters 1 von 'const char [7]' in 'const wchar_t *' nicht möglich

    Vlt sehe ich im mom auch den Wald vor lauter Bäumen nicht, weil ich mich so darüber ärgere.
    Vlt muss ich auch noch eine bestimmte Einstelluung in den Projekteigenschaften vornehmen ?!

    EDIT:

    Wenn ich das ganze auf "MultiByte" umstelle bekomme ich folgenden Fehler:

    mt.exe : general error c101008a: Failed to save the updated manifest to the file ".\Debug\MFC_Test.exe.embed.manifest". Falscher Parameter.



  • LosWebos schrieb:

    vielen Dank. So direkt mal registriert.
    Ich verwende UNICODE.

    OK, das erklärt einiges 😉

    Ich habe mal folgendes geändert:

    // Insert SSID (Column 1)
    m_BssidListCtrl.SetItemText( i, 1, (LPCTSTR )(TEXT( "%.*s" ), zPtr->Ssid.SsidLength, zPtr->Ssid.Ssid  ) );
    

    Aber leider immer noch komische Zeichen als Ausgabe 😞

    Der Cast dort ist immer noch falsch* - TCHAR ist ein wchar_t (also >=2 Byte groß), UCHAR dürfte 'unsigned char' sein (1 Byte) - durch den Cast werden jeweils 2+ Zeichen deines Arrays zu einem wchar_t zusammengefasst und das ergibt dann normalerweise irgendwelche Sonderzeichen jenseits des normalen ASCII-Zeichensatzes.

    Du mußt dein Array manuell und zeichenweise in wchar's umwandeln, um etwas für SetItemText() verwertbares herauszubekommen:

    //am Anfang der Funktion
    USES_CONVERSION;
    ...
    m_BssidListCtrl.SetItemText( i, 1, A2CT(zPtr->Ssid.Ssid  ) );
    

    Auch das zweite Problem bleibt weiterhin eins:

    strTemp.Format( "%d dBm", _T(zPtr->Rssi) );
    m_BssidListCtrl.SetItemText( i, 2, strTemp );
    

    wlkikiv - du mußt den ersten Parameter von Format() (das String-Literal) in _T() einklammern.

    (*) diese Ausführungen beziehen sich nur auf UNICODE-Einstellungen.



  • wlkikiv - du mußt den ersten Parameter von Format() (das String-Literal) in _T() einklammern.

    das stimmt wohl 🙂 Jaja der Wald

    Leider habe ich immer noch chinesische Zeichen.
    Aber ich habe nun eine Lösung gefunden:

    Ich habe das Projekt neu angelegt, und bei der Erstellung den hacken bei
    "UNICODE Bibliotheck verwenden" weggemacht.

    Nun läßt sich mein Projekt wunderbar kompilieren und meine Ausgabe funktioniert wie gewollt.

    // Insert SSID (Column 1)
    m_BssidListCtrl.SetItemText( i, 1, (LPCTSTR )(TEXT( "%.*s" ), zPtr->Ssid.SsidLength, zPtr->Ssid.Ssid  ) );
    
    // Insert RSSI (Column 2)
    strTemp.Format( _T("%d dBm"), zPtr->get_RSSI() );
    m_BssidListCtrl.SetItemText( i, 2, strTemp );
    

    Vielen Lieben Dank.

    Gruß Mark Weber



  • Hast du mal diese Variante ausprobiert? Wenn ja, was hatte dein Compiler dagegen?

    CStoll schrieb:

    //am Anfang der Funktion
    USES_CONVERSION;
    ...
    m_BssidListCtrl.SetItemText( i, 1, A2CT(zPtr->Ssid.Ssid  ) );
    

    PS: Das Gebastel', das du als letzten Parameter an SetItemText übergibst, ist (sanft formuliert) unsinnig. Nachdem der Komma-Operator dort durchgerannt ist, wird der Wert '(LPCTSTR )(zPtr->Ssid.Ssid)' weitergegeben - und damit stehst du auch wieder am Anfang.



  • Hallo,

    die Variante hatte ich probiert und folgende Fehlermeldung wurde ausgegeben:

    error C2440: '=': 'UCHAR [32]' kann nicht in 'LPCSTR' konvertiert werden

    Das zweite "gebastel" werde ich nochmal überdenken, aber ich bin erst einmal froh, dass überhaupt was ausgegeben wird 🙂



  • Das ist ja auch normal ... LPCSTR ist ein konstanter signed char bzw. ein char(wird ja hier nochmal unterschieden, d.h. es gibt 3 chars 😉 ) Zeiger ... du hast aber einen unsigned ...

    m_BssidListCtrl.SetItemText(i, 1, /*(LPCTSTR) AH. Wenn du jetzt UNICODE an hast steht da nen Cast zu const wchar_t .. so nen cast zu const char* */
    /*(TEXT( "%.*s" ), sinfrei ... */zPtr->Ssid.SsidLength, zPtr->Ssid.Ssid  /*) */);
    

    ...
    =>

    #ifdef UNICODE
        USES_CONVERSION;
        m_BssidListCtrl.SetItemText(i, 1, A2CT(reinterpret_cast<char*>(zPtr->Ssid.Ssid))); // Wir müssen erstmal in char casten und dann noch in wchar_t umwandeln lassen.
    #else // !UNICODE
        m_BssidListCtrl.SetItemText(i, 1, reinterpret_cast<char*>(zPtr->Ssid.Ssid)); // einfach in char casten ...
    #endif
    

    ...

    strTemp.Format(TEXT("%d dBm"), zPtr->get_RSSI()); // _T liegt normal in tchar.h ... nen extra Header => unnötig, lieber TEXT() ... das liegt in windows.h :)
    m_BssidListCtrl.SetItemText(i, 2, strTemp);
    

    So und wenn de das so hast stellst du dein Projekt wieder schön auf UNICODE um und es geht trotzdem 🙂



  • Gut dass es Leute gibt, die sich damit auskennen 🙂

    Vielen lieben Dank, es funktioniert.


Anmelden zum Antworten