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 byte sein? Ein typedef auf char ? Ein char -Array besteht bereits aus einzelnen Bytes. Wenn du deren Zahlenwerte willst, brauchst du noch zu int (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 byte sein? Ein typedef auf char ? Ein char -Array besteht bereits aus einzelnen Bytes. Wenn du deren Zahlenwerte willst, brauchst du noch zu int (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_string noch die Templateparameter angeben (und natürlich die Funktionsklammern, die ich hier vergessen habe).

    Auf www.cplusplus.com findest du dazu auch Beispielcodes...


Anmelden zum Antworten