If-Statement funktioniert nicht richtig [Debuggin hilft nicht] - Logik Fehler ?
-
Hallo leute,
ich habe ein kleines Programmgeschrieben, welches mir alle in der Umgebung verfügbaren Bluetoothgeräte anzeigt.
Es soll nur nach ein bestimmtes Gerät ausschau halten und die zugehörigen Daten ausgeben. Falls diese nicht Verfügbar ist soll es ein kleinen Hinweis geben.
Das Problem ist, dass es jedes mal im ersten durchlauf in den else zwei springt. Würde mich über jede hilfe freuen.
Mein Code:
#include "stdafx.h" #include <iostream> using namespace std; #define WIN32_LEAN_AND_MEAN #include <windows.h> #include <stdlib.h> #include <winsock2.h> #include <bthdef.h> #include <BluetoothAPIs.h> #pragma comment(lib, "Irprops.lib") BLUETOOTH_FIND_RADIO_PARAMS m_bt_find_radio = { sizeof(BLUETOOTH_FIND_RADIO_PARAMS) }; BLUETOOTH_RADIO_INFO m_bt_info = { sizeof(BLUETOOTH_RADIO_INFO), 0, }; BLUETOOTH_DEVICE_SEARCH_PARAMS m_search_params = { sizeof(BLUETOOTH_DEVICE_SEARCH_PARAMS), 1, 0, 1, 1, 1, 15, NULL }; BLUETOOTH_DEVICE_INFO m_device_info = { sizeof(BLUETOOTH_DEVICE_INFO), 0, }; HANDLE m_radio = NULL; HBLUETOOTH_RADIO_FIND m_bt = NULL; HBLUETOOTH_DEVICE_FIND m_bt_dev = NULL; int wmain(int argc, wchar_t **args) { while(true) { m_bt = BluetoothFindFirstRadio(&m_bt_find_radio, &m_radio); int m_radio_id = 0; do { m_radio_id++; BluetoothGetRadioInfo(m_radio, &m_bt_info); wprintf(L"Radio %d:\r\n", m_radio_id); wprintf(L"\tName: %s\r\n", m_bt_info.szName); wprintf(L"\tAddress: %02x:%02x:%02x:%02x:%02x:%02x\r\n", m_bt_info.address.rgBytes[1], m_bt_info.address.rgBytes[0], m_bt_info.address.rgBytes[2], m_bt_info.address.rgBytes[3], m_bt_info.address.rgBytes[4], m_bt_info.address.rgBytes[5]); wprintf(L"\tClass: 0x%08x\r\n", m_bt_info.ulClassofDevice); wprintf(L"\tManufacturer: 0x%04x\r\n", m_bt_info.manufacturer); m_search_params.hRadio = m_radio; ::ZeroMemory(&m_device_info, sizeof(BLUETOOTH_DEVICE_INFO)); m_device_info.dwSize = sizeof(BLUETOOTH_DEVICE_INFO); m_bt_dev = BluetoothFindFirstDevice(&m_search_params, &m_device_info); int m_device_id = 0; do { ++m_device_id; if ( _tcscmp(m_device_info.szName,_T("GERAET 1")) ==0){ wprintf(L"\tDevice %d:\r\n", m_device_id); wprintf(L"\t\tName: %s\r\n", m_device_info.szName); wprintf(L"\t\tAddress: %02x:%02x:%02x:%02x:%02x:%02x\r\n", m_device_info.Address.rgBytes[1], m_device_info.Address.rgBytes[0], m_device_info.Address.rgBytes[2], m_device_info.Address.rgBytes[3], m_device_info.Address.rgBytes[4], m_device_info.Address.rgBytes[5]); wprintf(L"\t\tClass: 0x%08x\r\n", m_device_info.ulClassofDevice); wprintf(L"\t\tConnected: %s\r\n", m_device_info.fConnected ? L"true" : L"false"); wprintf(L"\t\tAuthenticated: %s\r\n", m_device_info.fAuthenticated ? L"true" : L"false"); wprintf(L"\t\tRemembered: %s\r\n", m_device_info.fRemembered ? L"true" : L"false"); } else wprintf(L"Geraet nicht gefunden"); } while(BluetoothFindNextDevice(m_bt_dev, &m_device_info)); BluetoothFindDeviceClose(m_bt_dev); } while(BluetoothFindNextRadio(&m_bt_find_radio, &m_radio)); BluetoothFindRadioClose(m_bt); Sleep(10000); } return 0; }
-
Dieser Thread wurde von Moderator/in SeppJ aus dem Forum C++ (auch C++0x und C++11) in das Forum WinAPI verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
Warum hilft debuggen nicht?
Bist Du sicher dass auch due Groß/Kleinschreibung stimmt?
Was steht denn in dem Feld?Ich kann mir kaum vorstellen, dass _tcscmp hier "nicht" funktioniert.
-
Also beim ersten durchlauf der while-Schleife springt es in den else zweig. Erst bei der zweiten Iteration springt es in den If-Zweig und gibt mir die zugehörigen Daten aus.
Mir ist wichtig, das es in der ersten Iteration in den If-Zweig springt, da das Gerät ja vorhanden ist.
Du kannst den Code mal ausführen und dann wirst du sehen was ich meine.
-
CPPnoob234 schrieb:
Also beim ersten durchlauf der while-Schleife springt es in den else zweig. Erst bei der zweiten Iteration springt es in den If-Zweig und gibt mir die zugehörigen Daten aus.
Dann ist das gesuchte Gerät wohl nicht das einzige, das auf deine Suchparameter passt.
CPPnoob234 schrieb:
Mir ist wichtig, das es in der ersten Iteration in den If-Zweig springt, da das Gerät ja vorhanden ist.
Warum? Wegen der logisch falschen Ausgabe im else-Zweig?
-
Letztlich ist das Bluetooth Gerät ja vorhanden schon bei der ersten Iteration.
Hintergrund der relevanz ist einfach, dass ich in den Else zwei einen Systembefehl ausführen will falls das Gerät nicht vorhanden ist. So wird jedesmal, wenn ich das Programm starte als erstes das Systembefehl ausgeführt.Ja, wegen der logischen falschen Ausgabe. Wie schon erwähnt, statt eine Ausgabe kommt ein Systembefehl hin, sodass es wichtig ist zuerst zu checken, ob das gewünschte Gerät vorhanden ist. Falls das Gerät nicht vorhanden ist, wird das Systembefehl ausgeführt.
-
CPPnoob234 schrieb:
Hintergrund der relevanz ist einfach, dass ich in den Else zwei einen Systembefehl ausführen will falls das Gerät nicht vorhanden ist.
Du kannst im Else-Zweig noch gar nicht wissen, dass das Gerät nicht vorhanden ist, weil du nicht weißt, ob du es bei nachfolgenden Schleifendurchgängen nicht doch noch findest.
Ob das Gerät vorhanden ist, weißt du erst, nachdem die Schleife komplett durchgelaufen ist. Die Behandlung gehört einfach nicht in den Else-Zweig.
-
Glaube wir haben uns missverstanden:
Ich möchte, dass meine Applikation nur ein bestimmtes Bluetooth Gerät anzeigt, falls es vorhanden ist. Falls das Gerät irgendwann nicht mehr vorhanden ist, soll es den Rechner in den Standbymodus überführen.
-
Du durchsuchst in deiner inneren do/while-Schleife eine Liste von Einträgen nach einem ganz bestimmten. Wenn der drin ist, willst du A machen, wenn nicht, B. Was A und B im einzelnen sind, ist völlig wurscht.
Wieviele Listeneinträge musst du prüfen, wenn du wissen willst, ob dein gesuchter Eintrag in der Liste nicht vorhanden ist?
Antwort: Alle
Du darfst also dein B nicht an der Stelle ausführen, an der du feststellst, dass ein einzelner Eintrag nicht der gesuchte ist. Das macht dein Code aber zur Zeit.
Stattdessen musst du dir merken, ob der gesuchte Eintrag gefunden wurde, um dann nach der inneren Schleife B auszuführen, falls nichts gefunden wurde.
-
Müsste ich also alle gefunden Geräte in eine Liste speichern und dann die Liste nach dem Durchgang der inneren Schleife prüfen, ob das Gerät vorhanden ist oder nicht. Falls ja: Mache Aktion A Falls nein: Mache Aktion B ?
Kannst du mir vielleicht konkretere Tipps anhand des Codes geben ?
-
... bool gefunden = false; do{ ... if(name == "geraet") { gefunden = true; break; } ... }while(...); if(gefunden) cout << "gefunden"; else cout << "nicht gefunden"; ...