Mit Ausgabe weiterarbeiten



  • Hallo liebe Programmierer!

    Ich habe eine Frage zu dem Thema Ausgabe und wie ich diese wieder in mein Programm "einlese".
    Und zwar möchte ich eine Zahl in mein Programm eingeben und in binärer Schreibweise Ausgeben (BCD Code).
    Beispiel:
    ./prog 87654321
    Ausgabe: 111001110110010010100001100100001

    Das funktioniert schon einmal. Jetzt würde ich noch gerne diese Binärzahl wieder in mein Programm holen, um mit ihr Bitoperationen durchzuführen. Die Ausgabe erfogt mittels while-Schleife, d.h. das Programm gibt nur 8*4Bits aus, hat aber diese Zahl nicht gespeichert. Ist es möglich, und wenn ja mit welchen Befehl, diese Ausgabe als Binärzahl oder als Dezimalzahl in meinem Programm zu speichern?

    Würde mich über eure Hilfe sehr freuen,
    Danke im Voraus!



  • mfour0 schrieb:

    [...] hat aber diese Zahl nicht gespeichert.

    Der Wert 87654321 deines Beispiels steht in argv[1] ...



  • Danke für die schnelle Antwort.
    In argv[1] steht 87654321, aber die ausgegebene (untere) Binärzahl ist schon bearbeitet.
    00000101001110010111111110110001 (binär für 87654321)
    11100111011001010100001100100001 (binär für 8 7 6 5 4 3 2 1) d.h. die ersten vier Bits sind 8, die zweiten vier Bits sind 7, ...., die letzeten vier Bits sind 1.

    Die zweite Binärzahl hat also nicht den Wert 87654321 sondern 3882173217.
    Jetzt würde ich gerne diese Zahl in meinem Programm einlesen/ berechnen.

    LG



  • Zeig' mal Code.



  • void printBCD(unsigned int number);
    printBCD(input);
    
    void printBCD(unsigned int number)
    {  
        int a = number;
        int b;
        int digits [8];
    
        for( i = 7; i >= 0; --i )
        {
          const div_t tenth = div(a,10);
          digits[i] = tenth.rem;
          a = tenth.quot;
        }
      for( i = 0; i < 8; ++i )
          if (digits[i]==1)
          {
            printf("0001");
          }
          else
          if (digits[i]==2)
             {
             printf("0010");
             }
             else ....
    

    Ich weiß, dass es sehr stümperhaft ist, ich "programmiere" aber erst seit einer Woche...
    Ist es jetzt möglich die Ausgabe als Zahl bzw. Wert zu speichern?
    Danke schön!



  • Hi!
    Guckst du:

    #include <stdio.h>
    
    void bcd8421 ( char* p )
    {
    	while ( *p ) {
    		int i;
    		for ( i = 7; i >= 0; i-- )
    			if ( *p - '0' >> i & 1 )
    				printf ( "1" ); 
    			else 
    				printf ( "0" );
    		putchar ( ' ' );
    		p++;
    	}
    	puts ( "" );
    }
    
    int main ( int argc, char* argv[] )
    {
    	char* p = "123456789"; // Demo number;
    	if ( 2 == argc )
    		p = argv [ 1 ];
    	bcd8421 ( p );
    	return 0;
    }
    


  • yo, bro, hast fast verstanden was OP will 😉

    #include <stdlib.h>
    #include <stdio.h>
    
    long unsigned to_bcd( int unsigned value )
    {
    	long unsigned bcd = 0;
    	int unsigned digit = 0;
    
    	for( ; value; ++digit ) {
    
    		bcd += ( value % 10 ) << ( digit * 4 );
    		value /= 10;
    	}
    
    	return bcd;
    }
    
    void print_bin_64( long unsigned value )
    {
    	int unsigned i = 32;
    	for( ; i > 0; --i )
    		putchar( value & ( 1 << ( i - 1 ) ) ? '1' : '0' );
    }
    
    int main(int argc, char *argv[] )
    {
    	int unsigned arg = 0;
    	long unsigned bcd = 0;
    	if( argc < 2 ) {
    
    		fprintf( stderr, "Too few arguments!\n\n" );
    		return EXIT_FAILURE;
    	}
    
    	if( sscanf( argv[ 1 ], "%u", &arg ) != 1 || arg > 99999999 ) {
    
    		fprintf( stderr, "Invalid argument!\n\n" );
    		return EXIT_FAILURE;
    	}
    
    	bcd = to_bcd( arg );
    	print_bin_64( bcd );
    }
    

    In bcd ist die BCD-Code repräsentation von arg .



  • Hahahaha!
    Fisch, das ist ein Ansatz zum selbständigen weiterdenken.



  • Vielen Danke für eure Hilfe!!!!

    Ich habe nur ein Verständnisproblem mit:

    ? '1' : '0'
    

    Könnte mir jemand das kurz erklären?
    Danke im Voraus!



  • Hallo,

    das ist eine Art kompaktes if-then-else, siehe:

    http://de.wikipedia.org/wiki/%3F:#Auswahloperator

    MfG,

    Probe-Nutzer



  • Perfekt, dankeschön!!!
    So einfach ist es 🙂

    Liebe Grüße



  • Hallo!
    Ich bin ziemlicher Anfänger und gerade über diesen Code gestolpert.
    Kann mir jemand erklären, was

    ( !sscanf( argv[ 1 ], "%u", &arg )
    

    macht. Vor allem das Rufzeichen und das zweite s (hab schon gegooglet, aber das funktioniert mit den Sonderzeichen so schlecht)

    und
    wie diese Zuweisung zu verstehen ist:

    bcd = to_bcd( arg );
    

    würde mich sehr über eine Antwort freuen...
    MfG



  • sscanf ist eine Standardfunktion string scanf formated.
    Die liest die Werte nicht von der Standardeingabe (stdio) sondern aus einer Zeichenkette.
    Das hättest du finden können, z.B.: da: http://www.cplusplus.com/reference/clibrary/cstdio/sscanf/

    sscanf gibt einen Wert zurück. Und zwar die Anzahl erfolgreich gelesener Elemente.
    Da du nur einen Wert lesen willst, kann das nur 0 oder 1 sein.

    ! ist da logische Nicht. Aus Wahr wird Unwahr und umgekehrt.

    In C ist 0 Unwahr, alles andere ist Wahr.

    Wenn sscanf also einen Wert erfolgreich gelesen hat ist der Ausdruck in den () unwahr.

    bcd = to_bcd( arg );
    

    ist ein Aufruf der Funktion to_bcd mit dem Wert der Variable arg als Argument.
    Der Rückgabewert der Funktion wird in der Variable bcd abgelegt.



  • DirkB schrieb:

    Wenn sscanf also einen Wert erfolgreich gelesen hat ist der Ausdruck in den () unwahr.

    Gerade bei sscanf und Konsorten ist das aber nicht so. Liefert sscanf EOF, dann liefert der Ausdruck wahr, weil EOF als <0 definiert ist und somit !=0 == true liefert.
    Deshalb sind alle solchen Abfragen !sscanf bzw. häufiger zu sehen !fscanf laienhaft und potentielle Fehlerquellen.



  • Danke, oben korrigiert.


Anmelden zum Antworten