Vector ausgabe ---> crash???
-
warum crasched mir da mein programm :?
und zwar an dieser zeile(#42,43)
:
** `for (int pv=0;pv<hexx.size();pv++){cout << hexx[pv];` **int za=154,e=0xff,r; vector<const char *>hexx(4); char _thexx[4]={0}; char *__thexx=_thexx; while(e>0){ e=(za / 16); r=(e*16) - za; if(r<0){ r=r*-1; } // translate to hexx if(r>=10){ switch (r){ case(10): *_thexx='A'; break; case(11): *_thexx='B'; break; case(12): *_thexx='C'; break; case(13): *_thexx='D'; break; case(14): *_thexx='E'; break; default: *_thexx='F'; } } else { _itoa(r,_thexx,10); // into char | base: 10(dezimal) 16(hex) 8(okt) } hexx.push_back(_thexx); za=e; } for (int pv=0;pv<hexx.size();pv++){ cout << hexx[pv]; }
-
Ah. Das konkrete Problem wird sein, dass du einen Null-Zeiger als String zu interpretiern und auszugeben versuchst - mit
vector<const char *>hexx(4);erzeugst du einen Vektor, der vier NULL-Zeiger enthält (ich bin der Meinung, dass die hier null-initialisiert werden; womöglich dangeln sie aber auch). Nach
hexx.push_back(_thexx);enthält der Vektor dann fünf Zeiger, von denen erst der fünfte auf etwas zeigt. Übrigens zeigen alle Zeiger, die du auf diese Weise in den Vektor pushst, auf den selben Speicherbereich. Ich glaube nicht, dass es das ist, was du willst.
Warum arbeitest du eigentlich nicht mit std::string und sparst dir dieses ganze Gefummel?
-
na ich bin neu im vector und wusste nicht wie ich der reihe nach ein element in den vector gebe dachte wenn ich immer an letzter stelle ein element hinzugebe wird das letzte automatisch nach eins nach vorn geschoben, aber dem ist wohl nicht so!
ääh apropo wie fügt mein elment hinzu ?mit der string klasse also ja werd mir die mal anschauen...
danke!übrigens lag eigentlich am :
hexx.push_back(_thexx);
-
Wenn du hinten etwas an den Vektor anfügst, ändert sich vorne überhaupt nichts (sofern der ganze Vektorinhalt nicht verlegt werden muss, aber danach steht vorne immer noch der selbe Kram drin).
Was meinst du mit der Reihe nach ein Element in den Vektor geben? Es handelt sich dabei doch nicht um eine Queue.
-
denkfehler meinerseits dachte so ähnlich wie bei einer liste.. aber egal hab das ganze jezt mit char gelöst ohne vector ist besser, bzw funktioniert nun !
/* DEZ 100_______________ 100 /16 = 6 --> 4 rest 4 6 /16 = 0 --> 6 rest --> 6 --> HEX 0x64 = DEZ 100 DEZ 241_________________ 241 /16 = 15 --> 1 rest > 1 15 /16 = 0 --> 15 rest --> F --> HEX 0xf1 = DEZ 241 DEZ 354________________ 354 /16 = 22 --> 2 rest > 2 formel dez zu hexx: z /16 = e -- rest r=e*16-z | z=Dezimale,e=ergebnis,r=rest 22 /16 = 1 --> 6 rest > 6 1 /16 = 0 --> 1 rest --> 1 --> HEX 0x162 = DEZ 354 */ #include "stdafx.h" #include <iostream> using namespace std; void DezToHexx(int dez); int _tmain(int argc, _TCHAR* argv[]) { int dez=0; while(1){ system("CLS"); cout << "< HXXClaC V1.0 A > " << endl << "Gib eine Dezimale Zahl ein (minuswert beendet das Programm):" << endl; cin >> dez; if(dez<=0){ break; //exit(1); } DezToHexx(dez); } return 0; } void DezToHexx(int dez){ int za=0,e=0xff,r,cc=0; // vector<char *>hexx(4); char hexx[16]={0}; char _thexx[16]={0}; char *__thexx=_thexx; za=dez; while(e>0){ /* Formel zum umrechnen von dez in hexx */ e=(za / 16); r=(e*16) - za; /* --------------- */ if(r<0){ // vorzeichen entfernen r=r*-1; } // translate to hexx if(r>=10){ switch (r){ case(10): *_thexx='A'; break; case(11): *_thexx='B'; break; case(12): *_thexx='C'; break; case(13): *_thexx='D'; break; case(14): *_thexx='E'; break; default: *_thexx='F'; } } else { _itoa(r,_thexx,10); // into char | base: 10(dezimal) 16(hex) 8(okt) } hexx[cc]=(*_thexx); cc++; za=e; } cout << "<Dezimal> " << dez << " <Hexadezimal> " << "0x"; for (int ii=cc;ii>=0;ii--){ cout << hexx[ii]; } cout << endl; system("PAUSE"); }
-
Naja, wenn es dir um die hexadezimale Darstellung einer Zahl < 256 geht, das geht auch einfacher:
#include <iostream> int main() { char const *const hex_digits = "0123456789ABCDEF"; char buffer[3] = ""; unsigned wert = 154; buffer[0] = hex_digits[wert / 16 % 16]; buffer[1] = hex_digits[wert % 16]; std::cout << buffer << std::endl; }Und natürlich kann man das auch über die Standardbibliothek machen:
#include <iomanip> #include <iostream> #include <sstream> #include <string> int main() { std::ostringstream formatter; formatter << std::hex << 154; std::string s = formatter.str(); std::cout << s << std::endl; }Das dürfte aber in diesem einfachen Fall weit weniger effizient sein.