Abfrage Bit und if Abfrage

Move

Level-2
Beiträge
511
Reaktionspunkte
59
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Leute,

habe folgendes Problem:
Ich frage ein DWORD ab ob dort Bit0 =1 oder =0 ist.
Wenn 1 dann mache dies und wenn nicht (also 0) mache was anderes.
Aber die Abfrage funktioniert nicht, ich denke mal wieder Unwissenheit:confused:
TAG_2 wird immer auf 1 gesetzt egal was die Abfrage TAG_3 ergibt.

Gruß
Move
Das Script sieht so aus:
#include "apdefap.h"
void OnClick(char* lpszPictureName, char* lpszObjectName, char* lpszPropertyName)
{
// WINCC:TAGNAME_SECTION_START
// syntax: #define TagNameInAction "DMTagName"
#define Tag_1 "_AUTO"
#define TAG_2 "_BEIN"
#define TAG_3 "_EIN"
DWORD dwHelp3;
dwHelp3 = GetTagDWordWait(TAG_3); // Information Antrieb läuft / steht
// next TagID : 1
// WINCC:TAGNAME_SECTION_END
// WINCC:PICNAME_SECTION_START
// syntax: #define PicNameInAction "PictureName"
// next PicID : 1
// WINCC:PICNAME_SECTION_END
if (dwHelp3 & 1 !=0) // Antrieb steht
{
DWORD dwHelp1,dwHelp2;
dwHelp1=GetTagDWordWait(TAG_2);
dwHelp2=dwHelp1&(0xFFFFFFFF^1);
SetTagDWordWait(TAG_2, dwHelp2); // Wert 0 schreiben (Nachführung)
}
else // Antrieb läuft
{
DWORD dwHelp1,dwHelp2;
dwHelp1=GetTagDWordWait(TAG_2);
dwHelp2=dwHelp1|1;
SetTagDWordWait(TAG_2, dwHelp2); // Wert 1 schreiben (Nachführung)
}
SetTagBit(Tag_1,1-(GetTagBit(Tag_1))); // Befehl Hand setzen
 
dann lass doch mal das != 0 weg
das ergebnis der und-verknüpfung ist ja schon eine boolscher wert

if (dwHelp3 & 1)
{
...
}
else
{
...
}

sollte funktionieren.
 
Code:
if ((dwHelp3 & 1) != 0) 
{
...
sollte aber funktioneren.

Das Problem haben die C-Erfinder Kernighan & Ritchie schon erkannt und es in der C-Bibel entsprechend aufgeschrieben:
Programmieren in C schrieb:
Zu beachten ist, dass der Vorrang der Operatoren zur Bit-Manipulation &, ^ und | geringer ist als der Vorrang der Vergleiche == und !=. Daraus folgt, dass beim Überprüfen bestimmter Bits, wie etwa
if ((x & MASK) == 0) ...
die Bit-Verknüpfungen in Klammern eingeschlossen werden müssen, damit korrekte Resultate entstehen.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hi Leute,

so, nur diese Variante funzt jetzt:

Gruß
Move

#define Tag_1 "_AUTO"
#define TAG_2 "_BEIN"
#define TAG_3 "_EIN"
DWORD dwHelp3;
dwHelp3 = GetTagDWordWait(TAG_3); // Information Antrieb läuft / steht

if (dwHelp3 & 1) // Antrieb läuft
{
DWORD dwHelp1,dwHelp2;
dwHelp1=GetTagDWordWait(TAG_2);
dwHelp2=dwHelp1|1;
SetTagDWordWait(TAG_2, dwHelp2); // Wert 1 schreiben (Nachführung)
}
else // Antrieb steht
{
DWORD dwHelp1,dwHelp2;
dwHelp1=GetTagDWordWait(TAG_2);
dwHelp2=dwHelp1&(0xFFFFFFFF^1);
SetTagDWordWait(TAG_2, dwHelp2); // Wert 0 schreiben (Nachführung)
}
SetTagBit(Tag_1,1-(GetTagBit(Tag_1))); // Befehl Hand setzen
}
 
Zurück
Oben