Fehler bei strcmp()

Cappaja

Erfahrenes Mitglied
hallo,

ich lege zwei 14bit große zeichenketten an welche mit einsen gefüllt werden. nValue ist der wert der zweierpotenz - 1. so erhalte ich in binärdarstellung nach meinem algorithmus in der while-schleife weiterhin lauter einsen in der zeichenkette. wenn keine zweierpotenz vorliegt entstehen in der binärdarstellung nullen. in der if-abfrage prüfe ich ob der comp und der bits gleich sind (= zweierpotenz). für gleichheit sollte laut msdn 0 zurück geliefert werden. trotz gleicher strings läuft mein programm dennoch in die if-abfrage.
beim debuggen standen im speicher sowohl in comp als auch in bits nur einsen drin. ich verstehe da den zusammenhang nicht mehr.

kann mir jemand weiterhelfen oder benötige ich eine zusätzliche bibliothek?

C++:
void CDisplayControl::OnSpectrum() 
{	
	int nValue = ((CWiwoDlg*)GetParent())->GlPar.nNperB-1;

	char bits[14];
	char comp[14];
	int i;

	for(i=0; i < 14; i++)
	{
		bits[i] = '1';
		comp[i] = '1';
	}
	
	i = 0;	
	while(nValue != 0)
	{
		bits[14-i] = '0' + nValue%2;
		nValue = nValue/2;
		i++;
	}

	// NSamples must be a potenz of 2, from 2^7 until 2^e14!
	if(strcmp(comp, bits) != 0)
	{
		CString msg = "N Samples muss 2er Potenz sein!\nGültigkeitsbereich von +2e7 bis +2e14.";
		MessageBoxEx(((CWiwoDlg*)GetParent())->GetSafeHwnd(), msg, "Hinweis", MB_ICONWARNING, LANG_GERMAN);
		m_ctrlSpectrum.SetCheck(0);
		return;
	}
}
 
strcmp funktioniert nur richtig mit Zeichenketten, die nullterminiert sind.

Sehe ich das richtig, dass du nur überprüfen willst, ob es sich beim eingegebenen Wert um eine Zweierpotenz handelt?
 

Cappaja

Erfahrenes Mitglied
hallo matthias,

ja das ist richtig, ich möchte nur vergleichen ob es sich bei der eingegebenen zahl um eine zweierpotenz handelt und im fehlerfall eine meldung ausgeben.

gruß cappaja
 

deepthroat

Erfahrenes Mitglied
Hi.

Bitte halte dich an die Netiquette, insbesondere Punkt 15 Groß-/Kleinschreibung. Danke!

Bei einem Integer handelt es sich genau dann um eine Zweierpotenz, wenn genau 1 Bit gesetzt ist (abgesehen vom Vorzeichenbit natürlich).

\edit: Es geht zwar auch besser, aber du könntest es z.B. in einer Schleife machen:
C++:
for (int i = 1 << 6; i < (1 << 14); i <<= 1) {
  if (value == i) 
     /* Zweierpotenz */
}
Gruß
 
Zuletzt bearbeitet: