wie kann man variable ausgeben?



  • früher bei C++ debuggen, "cout<<" war meine Liebling...
    aber jetzt... 😞 😞 😞

    z.B.

    for (int i=0;i<9;i++) 
    cout<<i<<endl;
    

    wie kann man das bei API realisieren? danke vorher.



  • Dafür gibt es in WinAPI den Befehl TextOut. Um TextOut Benutzen zu können, musst du voher den Gerätekontext ermitteln(dafür gibt es glaub ich 3 Möglichkeiten). Die Variable kannst du dann einfach mit sprintf umwandeln.

    HDC hdc;
    int i;
    char c[2];
    hdc=GetDC(hwnd);
    for(i=0;i<9;i++)
    {
       sprintf(c, "%i", i);
       TextOut(hdc, i*10, i*10, c, 1);
    }
    ReleaseDC(hwnd, hdc);
    

    hwnd ist dabei das Handle zu dem Fenster, in das gezeichnet werden soll und hdc der Handle zum Gerätekontext, den man mit GetDC ermitteln und mit ReleaseDC wieder freigeben kann.

    Genauere Informationen sollte dir die msdn liefern können.

    Mit freundlichen Grüßen
    Moadeh



  • Macht aber mehr Sinn, die WM_PAINT-Nachricht zu bearbeiten, den hDC mit BeginPaint zu ermitteln und dann den Test auszugeben (mit EndPaint abschließen!). Sonst wird Dein Text nämlich bei jeder anderen Aktion (Fenstergröße ändern, Menü aufrufen o. ä.) gelöscht.



  • vielen dank Moadeh, Es funktioniert!!!:D 😃 😃
    vorher habe ich in google für 1 Stunde erfolglos gebraucht!

    aber bei meine vc muss die Code so sein:

    TextOut(hdc, i*10, i*10, (LPCWSTR)c, 1);
    

    ich finde, dass C-kenntnisse ist viel wichtiger als C++, oder? 😃



  • Elektronix , ich danke dir auch.

    Die Grundkenntnisse für API habe ich ein bisschen schon.

    mfG
    damo



  • Gerne doch! 👍

    ich finde, dass C-kenntnisse ist viel wichtiger als C++, oder?

    Richtig. Die WinAPI ist in reinem C geschrieben und folgt auch dieser Syntax. C++ brauchst Du erst, wenn Du mit MFC oder VCL arbeitest. Das sind objektorientierte Kapselungen (daher C++) der WinAPI.



  • Zum Debuggen kann man einfach OutputDebugStringA/W nehmen.
    Oder auch einfach das TRACE Makro wenn man MFC verwendet.



  • Der Vollständigkeit halber ist vllt. noch der Weg über wsprintf zu erwähnen:

    int iValueToShow = 555;
    TCHAR szBuf[100];
    wsprintf(szBuf, TEXT("Wert: %d"), iValueToShow);
    MessageBox(NULL, szBuf, NULL, 0);
    


  • CodeFinder:
    danke für Hilfe.
    ich glaube, dass wsprintf nicht andere als sprintf ist.
    und MessageBox ist ein interessante Ding. aber wie kann ich die Code einfügen? habe auch probiert, z.B. die Code im Bereich von WM_PAINT message liegen, aber ungünstig...

    mfG
    damo



  • @CodeFinder: Die Funktion heisst swprintf nicht wsprintf.
    Und wenn du schon TEXT() verwendest solltest du auch _stprintf verwenden. Ansonsten wsprintf und L"" und MessageBoxW 😉

    @damo: In einem Message Handler für WM_PAINT würde ich wohl nicht MessageBox verwenden sondern eher TRACE bzw. OutputDebugString.

    Sieht so aus:

    int v = 555;
    char buffer[100];
    sprintf(buffer, "Wert: %d\n", v);
    OutputDebugStringA(buffer);
    

    Die TRACE Variante:

    int v = 555;
    TRACE("Wert: %d\n", v);
    

    Angucken kannst du diese Debug Outputs dann z.B. mit DebugView, welches du z.B. hier bekommst: http://technet.microsoft.com/en-us/sysinternals/bb896647.aspx
    Oder natürlich wenn du das Programm im Debugger laufen lässt siehst du die auch im "Output" Fenster.



  • @hustbaer : danke schön!!! 👍

    int v = 555;
    char buffer[100];
    sprintf(buffer, "Wert: %d\n", v);
    OutputDebugStringA(buffer);
    

    Aber bei meine vc2005 Express wirft es gar nix. wahrscheinlich gibt es kein Debugger. Aber bei VC2008 Express ist besser?
    frage: bei VC2008 Express, wenn man API programmieren möchste, braucht der auch SDK zusätzlich download ? und bei VC2008 Standard?

    jetzt habe ich dich endlich verstanden! früher du geschrieben:

    Zum Debuggen kann man einfach OutputDebugStringA/W nehmen.
    Oder auch einfach das TRACE Makro wenn man MFC verwendet.

    dachte ich, dass es mir eine out_of_rang oder ähnliche Dinge werfen wird. 😕



  • hustbaer schrieb:

    @CodeFinder: Die Funktion heisst swprintf nicht wsprintf.
    Und wenn du schon TEXT() verwendest solltest du auch _stprintf verwenden. Ansonsten wsprintf und L"" und MessageBoxW 😉

    Nop, ich meinte schon die Funktion: http://msdn2.microsoft.com/en-us/library/ms647550.aspx 😉 . Ist auch sowohl für UNICODE als auch ANSI 😉 .



  • @CodeFinder: Ah. Eine USER32 Funktion. Hm. Da hab' ich wohl nicht genau genug geguckt... zzz.

    @damo: Der wirft garnix mit dem Code (also keine Exceptions wenn du das meinst), der schreibt bloss eine Meldung in den Debug Output Stream (oder wie auch immer das heisst) raus. Diese Meldungen kannst du eben mitlesen wenn du das Programm im Debugger laufen lässt, oder wenn du parallel zu dem Programm das "DebugView" startest welches ich dir verlinkt habe.

    Das ist natürlich nicht sinnvoll wenn man dem User etwas mitteilen möchte, aber es eignet sich oft gut um Programmierfehler zu suchen.

    Aber bei meine vc2005 Express wirft es gar nix. wahrscheinlich gibt es kein Debugger.

    Ich arbeite nicht mit der Express Version, aber AFAIK hat die Express Version schon auch einen Debugger dabei. Wenn du nur willst dass das Programm im Debugger stehenbleibt reicht es wenn du einfach auf die Zeile hingehst wo er stehenbleiben soll (also dem Text-Cursor reinsetzen), und F9 drückst. Dadurch setzt du einen sog. "Breakpoint" ("Haltepunkt"), und das nächste mal wenn das Programm im Debugger läuft und an die Stelle kommt bleibt es dort stehen. Dann kannst du z.B. die ganzen Inhalte von Variablen einsehen etc.

    frage: bei VC2008 Express, wenn man API programmieren möchste, braucht der auch SDK zusätzlich download ?

    Keine Ahnung. Beim 2005 Express ist das Platform SDK nicht dabei, daher nehme ich an dass es beim 2008 Express auch nicht dabei ist. Du solltest aber für 2005 Express und 2008 Express dasselbe Platform SDK verwenden können. (Heisst übrigens jetzt "Windows SDK" statt "Platform SDK".)

    und bei VC2008 Standard?

    Bei den "Standard" Versionen war bis jetzt immer ein Platform SDK mit dabei, wird also beim 2008er wohl auch so sein.



  • Die VC2008 Express-Edition hat das PSDK dabei...



  • @hustbaer

    der schreibt bloss eine Meldung in den Debug Output Stream...

    also, verstanden. vielen Dank für so viele Infos.

    Dadurch setzt du einen sog. "Breakpoint" ("Haltepunkt"), und das nächste mal wenn das Programm im Debugger läuft und an die Stelle kommt bleibt es dort stehen. Dann kannst du z.B. die ganzen Inhalte von Variablen einsehen etc.

    😃 es funktioniert! DU bist Genie!!!

    @Jochen Kalmbach
    Juhu!!!! danke sehr. Das ist ideal. ich habe auch Professional dabei, aber 3G groß...


Anmelden zum Antworten