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.

[C++]Dezimal in Dual Converter Hilfe benötigt!

Empfohlene Antworten

Veröffentlicht

Hallo,

und zwar hab ich ein kleines Problem mit meinem Programm,

ich soll ein Konsolenprogramm schreiben welches die als Parameter übergebene Zahl in eine Dual Zahl umwandelt (auch in Hex wo ich übrigens das selbe Problem habe da gleicher Lösungsweg)

Er soll nur Positive Zahlen bis zur Zahl 4 294 967 295 umwandeln. Im Binär Fall darf er auch nur max 32 Zeichen ausgeben :3

(Visual Studio 2008)

Mein Programm rechnet es zwar richtig bis jetzt aus nur lässt der immer eine Eins aus also statt 32 Einsen werden es einfach 31 ( Im moment übergibt der Parameter die Zahl 4 294 967 295)

Wenn ich den Array vergrößer wird durch meine For-Schleife einfach eine Null eingefügt :(


bool IntToBin(int zahl,TCHAR* BinString,int BinStringLen);


int _tmain(int argc, _TCHAR* argv[])

{

	int zzahl = _tstoi(argv[1]);

	TCHAR len[12];

	int lenh = sizeof(*len);

	IntToBin(zzahl,len,lenh);


        return 0;

}

bool IntToBin(int zahl,TCHAR* BinString,int BinStringLen)

{


	int length=sizeof(BinString);

	TCHAR zzahl[33];

	int i = 0;

	if (zahl>0)

	{

		for (i = 0;zahl != 0;i++)

		{

			zzahl[i] = 48+zahl%2;

			zahl/=2;

		}

		for (int z = i; z<33;z++)

			zzahl[z]='0';

		zzahl[32]=0;

		_tcsrev(zzahl);


		printf("%s",zzahl);

		return true;

	}

	else 

	{

		return false;

	}

}


Ich glaube ja der Fehler liegt irgendwo am Modulo

also so wie der Code jetzt ist gibt er

0111 1111 1111 1111 1111 1111 1111 1111

das aus :x

Könntet ihr mir erklären wieso?

wäre super nett von euch :3

Bearbeitet von Knuddelmuddel

  • Autor

OK wurde geändert und Code wurde auch etwas verkürzt


bool IntToBin(unsigned int zahl,TCHAR* BinString,int BinStringLen);


int _tmain(int argc, _TCHAR* argv[])

{

	int zzahl = _tstoi(argv[1]);

	TCHAR len[12];

	int lenh = sizeof(*len);

	IntToBin(zzahl,len,lenh);


        return 0;

}



bool IntToBin(unsigned int zahl,TCHAR* BinString,int BinStringLen)

{

	int length=sizeof(BinString);

	TCHAR zzahl[33];

	int i = 0;

	if (zahl>0)

	{

		for (i = 0;i<32;i++)

		{

			zzahl[i] = 48+zahl%2;

			zahl/=2;

		}

		zzahl[32]=0;

		_tcsrev(zzahl);


		printf("%s",zzahl);

		return true;

	}

	else 

	{

		return false;

	}

}	


int _tmain(int argc, _TCHAR* argv[])

{

	[COLOR="Red"]int zzahl = _tstoi(argv[1]);[/COLOR]

	TCHAR len[12];

	int lenh = sizeof(*len);

	IntToBin(zzahl,len,lenh);


        return 0;

}

:mod:

Ansonsten: Die Shift-Operatoren wirken hier wahre Wunder.

  • Autor

Leider weiß ich nicht worauf du hinaus willst :(

und shift operatoren hab ich selber noch nie benützt hab mich aber reingelesen damit ich wenigstens weiß was sie tun

Die verschieben die jeweilige BIt Anzahl nach links bzw rechts und schieben eine 0 nach jedoch wie man das direkt anwendet hab ich noch nicht verstanden.

In dem Code unten wird auch dieser shift Operator angezeigt und ich denke wenn ich das richtig in meinen einbaue funkioniert das auch jedoch verstehe ich die hervorgehobene Zeile noch nicht

	

void dez_bin(long int z)

{

      char str[33];

      str[32] = '\0';

      for( int i=31; i>=0; i--, z>>=1)

      [B]str[i] = (z&1)+ '0';[/B]

      printf( str, 0);

}

Leider weiß ich nicht worauf du hinaus willst :(

zzahl ist noch ein signed int. Dürfte aber weiter keine allzugroßen Fehler verursachen (Schönheitssache und so).

In dem Code unten wird auch dieser shift Operator angezeigt und ich denke wenn ich das richtig in meinen einbaue funkioniert das auch jedoch verstehe ich die hervorgehobene Zeile noch nicht

	

void dez_bin(long int z)

{

      char str[33];

      str[32] = '\0';

      for( int i=31; i>=0; i--, z>>=1)

      [B]str[i] = (z&1)+ '0';[/B]

      printf( str, 0);

}

'0' = Charcode 30 = 0 als char.

Wenn das 0. Bit nicht gesetzt ist, dann -> 0 + 30 -> 30 -> '0'

Wenn das 0. Bit gesetzt ist, dann -> 1 + 30 -> 31 -> '1'

Bearbeitet von TDM

  • Autor

Ah vielen Dank nu versteh ich den Code :D!

Also hab eben meinen Code kurz Kommentiert und den Code mal eingearbeitet und als ergebnis kam das selbe raus wie bei mir dh 31 Einsen und ne Null vorne dran die eigentlich eine 1 sein sollte :(

Aber wieso ist das so?

Mittlerweile hab ich mehrere Sachen ausprobiert

also bei zzahl[32] den hab ich nun durch verschiedene Wege auf 0 gesetzt die afaik alle genau das selbe bedeuten also zzahl[32] = 0; zzahl[32] = '\0'; zzahl[32] = NULL;

Ich dachte dadurch das tcsrev danach kam das deswegen die 0 vorne dran ist statt der 1 aber das war ein Irrtum :(

Also hab eben meinen Code kurz Kommentiert und den Code mal eingearbeitet und als ergebnis kam das selbe raus wie bei mir dh 31 Einsen und ne Null vorne

Wenn du "den Code", die Sache mit dem Shift-Operator meinst, dann ist es das gleiche Problem wie vorher.

Bei signed Integer wird das höchste Bit zur Vorzeichendarstellung verwendet.

(Daher speichern sie auch nur kleinere [(2^32)/2-1] Zahlen.)

Vielleicht solltest du dir den Wikipedia-Artikel dazu mal durchlesen:

Integer

  • Autor

Also hab nun bissl debugged und dann ist mir aufgefallen das

tstoi ein signed int ist :x (vllt meintest das ja direkt mit dem Hinweis)

da ich eine 4 milliarden zahl atm als parameter übergebe und die kann ein signed int natürlich nicht annehmen

dann hab ihc mal gegoogled und die funktion

strtol gefunden jedoch weiß ich nicht genau wie ich die benutzen kann bzw ich weiß nicht was ein EndPointer ist (mein Ausbilder läuft grad hier irgendwo rum und ich find den net!)

  • Autor

Das Problem war wie ich oben schon erwähnte

_tstoi

mein chef gab mir endlich!! dieses Lösung zu meinem problem

bzw so sieht das dann aus!

int _tmain(int argc, _TCHAR* argv[])

{

	unsigned int zzahl = 0; 

        	sscanf(argv[1], _T("%u"), &zzahl);

	TCHAR len[12];

	int lenh = sizeof(*len);

	IntToBin(zzahl,len,lenh);


	return 0;

}

falls mal jemand das selbe Problem oder so habne sollte xd

Archiv

Dieses Thema wurde archiviert und kann nicht mehr beantwortet werden.

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.