Knuddelmuddel Geschrieben 13. Oktober 2009 Teilen Geschrieben 13. Oktober 2009 (bearbeitet) 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 13. Oktober 2009 von Knuddelmuddel Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
TDM Geschrieben 13. Oktober 2009 Teilen Geschrieben 13. Oktober 2009 Das sieht eher nach einer Mischung von C/C++ statt C# aus. btw: mit printf/cout kann man formatiert im jeweiligen Zahlensystem ausgeben. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Knuddelmuddel Geschrieben 13. Oktober 2009 Autor Teilen Geschrieben 13. Oktober 2009 Ja kann gut sein Ja das weiß ich aber darf ich nicht benützen ich muss es aufm herkömmlichen weg machen Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Knuddelmuddel Geschrieben 13. Oktober 2009 Autor Teilen Geschrieben 13. Oktober 2009 Ach stimmt ja C# heißt ja C Sharp xd hatte ich verwechselt! das man nicht direkt die ganze Zeit editieren darf ist ja doof Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
TDM Geschrieben 13. Oktober 2009 Teilen Geschrieben 13. Oktober 2009 (bearbeitet) Deine Integervariablen sind nicht unsigned. Bearbeitet 13. Oktober 2009 von TDM Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Knuddelmuddel Geschrieben 13. Oktober 2009 Autor Teilen Geschrieben 13. Oktober 2009 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; } } Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
TDM Geschrieben 13. Oktober 2009 Teilen Geschrieben 13. Oktober 2009 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. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Knuddelmuddel Geschrieben 13. Oktober 2009 Autor Teilen Geschrieben 13. Oktober 2009 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); } Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
TDM Geschrieben 13. Oktober 2009 Teilen Geschrieben 13. Oktober 2009 (bearbeitet) 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 13. Oktober 2009 von TDM Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Knuddelmuddel Geschrieben 13. Oktober 2009 Autor Teilen Geschrieben 13. Oktober 2009 Ah vielen Dank nu versteh ich den Code ! 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 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
TDM Geschrieben 14. Oktober 2009 Teilen Geschrieben 14. Oktober 2009 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 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Knuddelmuddel Geschrieben 14. Oktober 2009 Autor Teilen Geschrieben 14. Oktober 2009 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!) Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Knuddelmuddel Geschrieben 14. Oktober 2009 Autor Teilen Geschrieben 14. Oktober 2009 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 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Empfohlene Beiträge
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.