Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Klotzkopp

User
  • Registriert

  • Letzter Besuch

Alle Beiträge von Klotzkopp

  1. Das ist nicht die gleiche Stelle, an der die erste Assertion fehlschlug. In welcher Datei und Zeile steht der Debugger? Ist das der gesamte Callstack?
  2. Wir brauchen den Callstack zum Zeitpunkt der fehlgeschlagenen Assertion. Wenn also die Assertion-Meldung kommt, klick auf Wiederholen / Retry, dann sollte der Debugger auf dem ASSERT stehen.
  3. In einem C/C++-Programm rufen immer wieder irgendwelche Funktionen andere Funktionen auf. Das beginnt beim Einsprungspunkt des Programms (main, Winmain, etc) und baut sich von dort aus auf. Irgendwann führt das bei deinem Programm zum Aufruf von CWnd::OnCommand. Der Callstack gibt nun wieder, durch welche anderen Funktionen hindurch es zu diesem Aufruf gekommen ist. Ganz oben auf dem Aufrufstapel steht CWnd::OnCommand, darunter steht die Funktion, die CWnd::OnCommand aufgerufen hat, darunter die Funktion, die die darüber aufgerufen hat usw. Über den Callstack lässt sich möglicherweise darauf schließen, was den Fehler verursacht. MSVC kann den Callstack anzeigen, wenn ein "gedebugtes" Programm angehalten ist (durch Breakpoint oder auch Assertion). Eine Assertion ist eine Prüfung von etwas, das eigentlich nicht fehlschlagen darf. Man baut so etwas ein, um Programmierfehler zu finden. Ein Debug-Build bricht mit der bekannten Fehlermeldung ab, wenn eine Assertion fehlschlägt, bei einem Release-Build wird die Prüfung aus dem Programm entfernt. In deinem Fall bedeutet die Zeile ASSERT(nID == 0 || ::IsWindow(hWndCtrl)); dass das Programm prüft, on nId Null ist ODER hWndCtrl ein gültiges Fensterhandle ist. Wenn beides nicht zutrifft, bricht das Programm ab. Es gibt keine dummen Fragen. Wer nicht fragt, ...
  4. Klotzkopp hat auf einen Beitrag in einem Thema geantwortet in C++: Compiler, IDEs, APIs
    Dann musst du eine Klasse von CDialog ableiten, weil du sonst keine Möglichkeit hast, auf diese Steuerelemente zuzugreifen. Das macht aber der Klassenassistent für dich. Starte den Klassenassistent, während die Dialogresource des Wecker-Dialogs angezeigt wird (z.B. über das Kontextmenü), dann sollte er dich fragen, ob er für diese Dialogresource eine Klasse anlegen soll. Von dieser Klasse legst du dann eine Instanz an (an Stelle von CDialog), ohne Dialog-ID als Parameter.
  5. Klotzkopp hat auf einen Beitrag in einem Thema geantwortet in C++: Compiler, IDEs, APIs
    Normalerweise verwendet man nicht CDialog selbst, sondern leitet eine Klasse davon ab. Mit der Basisklasse kann man nicht viel machen, außer statische Texte anzuzeigen und abzufragen, ob der Benutzer OK, Abbrechen oder Schließen betätigt hat. Das sollte kein Problem sein. Meinst du damit, die Anwendung reagiert nicht mehr? Das liegt dann vermutlich daran, dass DoModal nie zurückkommt. Verstehe ich nicht. Was soll das heißen? Nicht ohne weitere Information darüber, wie der Dialog aussieht, und warum du keine Klasse von CDialog abgeleitet hast.
  6. Eigentlich sollte das kein Problem sein. Benutzt das Programm seinen eigenen Pfad? Ändert sich das Verhalten, wenn du über ein Netzlaufwerk auf das Programm zugreifst?
  7. Das ist in CWnd::OnCommand: BOOL CWnd::OnCommand(WPARAM wParam, LPARAM lParam) // return TRUE if command invocation was attempted { UINT nID = LOWORD(wParam); HWND hWndCtrl = (HWND)lParam; int nCode = HIWORD(wParam); // default routing for command messages (through closure table) if (hWndCtrl == NULL) { // zero IDs for normal commands are not allowed if (nID == 0) return FALSE; // make sure command has not become disabled before routing CTestCmdUI state; state.m_nID = nID; OnCmdMsg(nID, CN_UPDATE_COMMAND_UI, &state, NULL); if (!state.m_bEnabled) { TRACE1("Warning: not executing disabled command %d\n", nID); return TRUE; } // menu or accelerator nCode = CN_COMMAND; } else { // control notification [color=red]ASSERT(nID == 0 || ::IsWindow(hWndCtrl));[/color] [/CODE]Es kommt also eine Nachricht von einem Steuerelement, das kein gültiges Fenster (mehr) ist. Nein. Kannst du das mal Debuggen, und den Callstack posten, wenn die Assertion auftritt?
  8. Klotzkopp hat auf einen Beitrag in einem Thema geantwortet in C++: Compiler, IDEs, APIs
    Wo hast du _WIN32_IE definiert, und ist es vielleicht nochmal irgendwo definiert (z.B. in stdafx.h)?
  9. Klotzkopp hat auf einen Beitrag in einem Thema geantwortet in C++: Compiler, IDEs, APIs
    Also bei mir steht in ShellApi.h ab Zeile 645: #if (_WIN32_IE >= 0x0500) #define NIF_STATE 0x00000008 #define NIF_INFO 0x00000010 #endif Bei dir nicht?
  10. <Gebetsmühle> Fehlermeldungen sind für die Diagnose da, nicht zum Wegklicken! Also bitte genau angeben, was da stand. </Gebetsmühle> P.S.: Du kannst den Text einer MessageBox mit Strg-C in die Zwischenablage kopieren.
  11. Klotzkopp hat auf einen Beitrag in einem Thema geantwortet in C und C++
    Bitte die Boardregeln beachten, besonders Punkt 1. Jetzt hast du sie. Thema bis auf weiteres geschlossen. Wenn jemand noch etwas beitragen möchte, PN an mich.
  12. Klotzkopp hat auf einen Beitrag in einem Thema geantwortet in Datenbanken
    Da haben wir's doch: Wenn das zutrifft, werden die anderen drei "Sonderfälle" gar nicht mehr geprüft, denn die werden von diesem hier vollständig abgedeckt. Entweder schreibst du die drei Sonderfälle davor, oder du änderst diesen in ELSIF v_zehner = 1 AND v_einer > 2 THEN, oder du verschachtelst die IFs.
  13. Dann kommt's wohl darauf an, was für ein BASIC du benutzt...
  14. Wenn du die Windows-typischen Hotkeys meinst, dann setz mal ein & vor den Buchstaben.
  15. Klotzkopp hat auf einen Beitrag in einem Thema geantwortet in Datenbanken
    Ja, aber nicht zwangsläufig alle. Wenn die IF-Bedingung nicht wahr ist, werden die ELSIF-Bedingungen der Reihe nach geprüft. Sobald eine gefunden wird, die wahr ist, wird der dazu gehörende Block ausgeführt, und danach nichts mehr, weder weitere ELSIFs noch ELSE. Zeig doch einfach mal alle Bedingungen bis zu dem betreffenden ELSIF.
  16. Klotzkopp hat auf einen Beitrag in einem Thema geantwortet in Datenbanken
    Schon klar, aber wenn die IF-Bedingung wahr ist, wird kein ELSIF ausgeführt. ELSE wird nur ausgeführt, wenn die IF-Bedingung und alle ELSIF-Bedingungen falsch waren.
  17. Klotzkopp hat auf einen Beitrag in einem Thema geantwortet in Datenbanken
    Wie sieht denn die Bedingung bei "IF" aus? Ein "ELSIF" wird ja vermutlich nur dann ausgeführt, wenn diese nicht wahr war.
  18. Klotzkopp hat auf einen Beitrag in einem Thema geantwortet in Algorithmik
    for(int i=0;i<feld.length;i++) Die äußere Schleife läuft von vorn nach hinten, d.h. das Feld wird auch von vorn nach hinten sortiert. Insertion Sort bedeutet, dass man das erste Element aus dem unsortierten Bereich an der passenden Stelle im sortierten Bereich einfügt. Das hat zur Folge, dass alle Elemente, die im sortierten Bereich dahinter liegen, um eine Position nach hinten verschoben werden müssen, um dem neu einsortierten Element Platz zu machen: int marker=i; Marker ist die "Einfügemarke", die nach der richtigen Einfügeposition sucht. i ist die Position des ersten Elements im unsortierten Bereich. Hier startet der Marker. int temp=feld; Das ist der einzusortierende Wert. while(marker>0 && feld[marker-1]>temp) Solange der Marker noch nicht am Anfang angekommen ist, und das Element vor dem Marker größer ist als unser einzusortierendes Element... (übrigens, beim ersten Durchlauf der äußeren Schleife wird die innere gar nicht ausgeführt, weil marker == 0) feld[marker]=feld[marker-1]; ... wird das Element vor dem Marker nach hinten verschoben... marker--; ... und der Marker nach vorn gesetzt. Man könnte diese beiden Schritte auch trennen, d.h. man sucht zuerst nach der richtigen Position und verschiebt dann die größeren Elemente eine Position nach hinten. feld[marker]=temp; Nach dem Ende der inneren Schleife sind wir entweder am Anfang des Bereichs angekommen, oder der Marker zeigt auf das Element, das gerade eben noch größer ist als das Einzufügende. Da wir ersteres aber eben noch nach hinten verschoben haben, können wir einfach unseren gespeicherten Wert an der Stelle des Markers einsetzen.
  19. Klotzkopp hat auf einen Beitrag in einem Thema geantwortet in C und C++
  20. Klotzkopp hat auf einen Beitrag in einem Thema geantwortet in C++: Compiler, IDEs, APIs
    Stehen die Include-Verzeichnisse des Platform SDK vor denen des Visual Studio? Der Compiler nimmt den Header, den er als ersten findet. Außerdem:
  21. Klotzkopp hat auf einen Beitrag in einem Thema geantwortet in Algorithmik
    http://forum.fachinformatiker.de/showthread.php?s=&threadid=52079 Darum hier zu.
  22. Klotzkopp hat auf einen Beitrag in einem Thema geantwortet in C++: Compiler, IDEs, APIs
    ::TrackPopupMenu verlangt ein HMENU, dass du aus CreatePopupMenu oder GetSubMenu erhalten hast. Hol dir das nullte SubMenu des geladenen Menüs und verwende dessen HMENU für TrackPopupMenu.
  23. Gar nicht. Wenn du nicht BuildCommDCB verwenden willst, musst du die Elemente der DCB-Struktur von Hand setzen: dcb.BaudRate = CBR_9600; dcb.fParity = FALSE; dcb.ByteSize = 8; dcb.StopBits = ONESTOPBIT; SetCommState musst du in beiden Fällen aufrufen.
  24. // ... HANDLE hSerial = CreateFile( "COM1", GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL ); if( INVALID_HANDLE_VALUE == hSerial ) { return GetLastError(); } DCB dcb; if( !GetCommState( hSerial, &dcb ) ) { CloseHandle( hSerial ); return GetLastError(); } if( !BuildCommDCB( "9600,n,8,1", &dcb ) ) { CloseHandle( hSerial ); return GetLastError(); } if( !SetCommState( hSerial, &dcb ) ) { CloseHandle( hSerial ); return GetLastError(); } // ... [/CODE]
  25. Ich nehme an, dass im "richtigen" Code BuildCommDCB steht. Bist du sicher (sprich: hast du mit dem Debugger geprüft), dass genau an dieser Stelle eine Exception auftritt, und nicht irgendwann später? Bei mir läuft das nämlich einwandfrei.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.