Pointer auf char-array
-
Hallo zusammen,
ich hoffe mir kann hier geholfen werden, denn ich sitze jetzt schon ein paar Stunden an der Sache und komm einfach nicht auf die Lösung.
Ich habe folgendes Pascal-Programm geschrieben:type buchstabe = 'a' .. 'z'; buchstmenge = set of buchstabe; TSetArray = array[0..31] of byte; PSetArray = ^TSetArray; //Zeiger auf ein ByteArray var wort : string; menge, schnitt : buchstmenge; i : byte; stock : integer; SetArray : PSetArray; BitSet : TSetArray; procedure drucke( menge : buchstmenge ); var c : buchstabe; leer : boolean; begin leer := true; for c := 'a' to 'z' do begin if c in menge then begin write( c ); leer := false; end (* of if *) end; (* of for *) if leer then writeln( ' leere Menge ' ); end; (* of drucke *) begin repeat stock := 0; schnitt := ['a'..'z']; menge := []; SetArray := @menge; (* Zuweisung unseres ByteArray-Zeigers durch einen * Zeiger auf "menge" *) writeln( 'Bitte Wort eingeben' ); readln( wort ); (* Zunächst werden die Buchstaben des eingegebenen Wortes (wort:string) * in unseren Mengentyp (set of) "menge" geschrieben *) for i := 1 to length( wort ) do begin menge := menge + [wort[i]]; end; writeln; writeln; (* Jetzt wird überprüft, ob an der per Pointer verwiesenen Speicherstelle * das entsprechende Byte (durch "i" gegeben) einen Wert hat oder nicht. * Dabei gilt für die untenstehende Ausgabe die Bedingung, dass der Wert * ausschließlich 1 oder 2 oder 4 [...] Betragen darf, um zu überprüfen, * ob wirklich nur EIN BIT gesetzt wurde *) for i := 0 to 3 do begin //if ((SetArray^[i] and 255) <> 0) then if ((SetArray^[i] and (1 or 2 or 4 or 8 or 16 or 32 or 64 or 128)) <> 0) then begin BitSet[i] := 1; writeln( 'Byte ', (i+1), ' = ', BitSet[i] ); end (* of if *) else begin BitSet[i] := 0; writeln( 'Byte ', (i+1), ' = ', BitSet[i] ); end; (* of else *) end; (* of for *) writeln; (* Der Wert der gesetzten Bytes wird ausgegeben *) for i := 0 to 3 do begin if (BitSet[i] = 1) then begin write( 'Byte ', (i+1), ' = ' ); if (SetArray^[i] <> 0) then begin write( SetArray^[i], ' Bit , ' ); stock := stock + 1; end; (* of if *) end; (* of if *) end; (* of for *) (* Jetzt wird noch geprüft, wieviele Buchstaben sich noch im Speicher * befinden *) case stock of 0: begin; writeln; writeln; writeln( 'Kein Buchstabe mehr vorhanden' ) end; (* of 0 *) 1: begin writeln; writeln; writeln( 'Nur noch ein Buchstabe vorhanden' ); end; (* of 1 *) 2..100: begin writeln; writeln; writeln( 'Noch mehr als ein Buchstabe vorhanden' ); end; (* of 2..100 *) else begin writeln; writeln; writeln( 'Fehler bei Berechnung' ); end; (* of else *) end; (* of case *) writeln; writeln; schnitt := schnitt * menge; drucke( menge ); writeln; drucke( schnitt ); readln; writeln; writeln; writeln; until wort = 'exit'; end.Es geht mir hier darum, dass ich anhand der Speicheradresse auslesen kann, welche Bits im allokierten Speicher "gesetzt" sind.
Jetzt möchte ich selbiges in C++ umsetzen, jedenfalls ähnlich. Alle meine bisherigen Versuche sind gescheitert.
char chr[32]; int main() { cout << "Bitte Wort eingeben" << endl; cin >> chr; byte *myBytes[32]; myBytes[32] = (byte*)&chr; int *x = (int*)chr; byte *y = (byte*)x; for( int i = 0; i < 19; i++ ) { myBytes[i] = (byte*)y; cout << *x << "\t" << *y << endl; *x = *x +1; } }Ich kann natürlich die Adresse im Speicher auslesen und die Werte verändern. Explizit die Bits auszulesen will mir aber einfach nicht gelingen. Wahrscheinlich stelle ich mich auch einfach zu blöd an, aber ...
Ich würde mich freuen, wenn ihr mir helfen könntet.
-
Was soll
bytesein? Eintypedefaufchar? Einchar-Array besteht bereits aus einzelnen Bytes. Wenn du deren Zahlenwerte willst, brauchst du noch zuint(z.B.) umzuwandeln, damit auf der Konsole Ziffern und nicht Zeichen ausgegeben werden.Um an die einzelnen Bits zu kommen, kannst du std::bitset verwenden.
Hier mal das Beispiel für ein Byte:
char* Text = "Hallo"; // weist das Bitmuster des ersten Zeichens von Text ('H') zu std::bitset<8> Byte = static_cast<unsigned long>(Text[0]); // gibt dir die Binärfolge als std::string aus. std::cout << Byte.to_string << std::endl;
-
Nexus schrieb:
Was soll
bytesein? Eintypedefaufchar? Einchar-Array besteht bereits aus einzelnen Bytes. Wenn du deren Zahlenwerte willst, brauchst du noch zuint(z.B.) umzuwandeln, damit auf der Konsole Ziffern und nicht Zeichen ausgegeben werden.Um an die einzelnen Bits zu kommen, kannst du std::bitset verwenden.
Hier mal das Beispiel für ein Byte:
char* Text = "Hallo"; // weist das Bitmuster des ersten Zeichens von Text ('H') zu std::bitset<8> Byte = static_cast<unsigned long>(Text[0]); // gibt dir die Binärfolge als std::string aus. std::cout << Byte.to_string << std::endl;Byte ist ein typedef auf unsigned char ja ... Ich schau es mir gleich mal an.
-
Eventuell musst du bei
to_stringnoch die Templateparameter angeben (und natürlich die Funktionsklammern, die ich hier vergessen habe).Auf www.cplusplus.com findest du dazu auch Beispielcodes...