Zum Inhalt springen

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


Knuddelmuddel

Empfohlene Beiträge

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
Link zu diesem Kommentar
Auf anderen Seiten teilen

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;

	}

}	

Link zu diesem Kommentar
Auf anderen Seiten teilen

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);

}

Link zu diesem Kommentar
Auf anderen Seiten teilen

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
Link zu diesem Kommentar
Auf anderen Seiten teilen

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 :(

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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!)

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...