- LiTime Speicher und Akkus         
Ergebnis 1 bis 4 von 4

Thema: C: Zeichen aus String entfernen (Keil, XE164)

  1. #1
    Erfahrener Benutzer Robotik Einstein Avatar von Jaecko
    Registriert seit
    16.10.2006
    Ort
    Lkr. Rottal/Inn
    Alter
    41
    Beiträge
    2.009

    C: Zeichen aus String entfernen (Keil, XE164)

    Anzeige

    Praxistest und DIY Projekte
    Moin.

    Bin gerade dabei, mit einem XE164 (Infineon) anzufangen. Als Compiler wird Keil mit C verwendet. Problem an der Sache ist nun, dass ich Registern Werte nur als Dezimalzahl oder per hex angeben kann; eine Angabe im Stil von x = &b00110100 geht nicht.
    Ich habe darum eine function gebaut, die es über
    x = bin2dec("00110100") doch ermöglicht (s.u.).

    Da es bei 16-Bit-Zahlen aber leicht unübersichtlich wird, wollte ich es so machen, dass man in dem Bit-String Punkte als Trennzeichen einfügen kann:
    x = bin2dec("0001.1001.0010.1001")

    Nur scheiterts da nun am Entsorgen der Punkte.
    Bisherige Suchen über Google etc brachten keine Ergebnisse, da die Beispiele (z.B. strtok) nicht funktionieren.

    Hat hier jemand ne Idee dazu?

    MfG

    Bisheriger Code:
    Code:
    int bin2dec(char *bin)
    // Converts a binary string into a decimal value
    // e.g. to set control registers directly via single bits
    {  	int  b, k, m, n;  
    	int  len, sum = 0; 
    	len = strlen(bin) - 1;  			// determine length of binary value
    	for(k = 0; k <= len; k++)   
    	{    
    		n = (bin[k] - '0'); 			// char to numeric conversion
    		if ((n > 1) || (n < 0))     	// If Bit neither 1 nor 0
    			{return (0);}    			//  quit function and return 0
    		for(b = 1, m = len; m > k; m--) 
    		{ b *= 2; }						// 1 2 4 8 16 32 64 ... place-values, reversed here      
    			sum = sum + n * b;    		// add all results
    	}  return(sum);						// return decimal value
    }
    #ifndef MfG
    #define MfG

  2. #2
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.842
    Mach das doch direkt:
    Code:
    int Ziel = 0;
    char  Inp[32] = "0001.0010.0100.1000";
    
    
    int iX;
              for (iX = 0; iX < strlen(Inp); iX++)
              {
                   if (Inp[iX] != '.')
                   {
                           Ziel <<= 1;               // ein links
                           Ziel |= (Inp[iX] & 1);  // Null oder Eins
                   }
              }
    Ich hoffe, verständlich. Man müßt noch ev. checken, ob wirklich nur Nullen und Einsen im String sind etc.

    Remark:
    Ziel != (Inp[iX] & 1); // Null oder Eins
    beruht darauf, das der Ascii-Code von "0/1" = 0x30 / 0x31 ist, d.h. ich kann das low Bit direkt übernehmen
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  3. #3
    Erfahrener Benutzer Robotik Einstein Avatar von Jaecko
    Registriert seit
    16.10.2006
    Ort
    Lkr. Rottal/Inn
    Alter
    41
    Beiträge
    2.009
    Perfekt, läuft so. Thx.
    Und ist natürlich auch kürzer als mein bisheriger Ansatz.
    #ifndef MfG
    #define MfG

  4. #4
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    25.10.2007
    Ort
    41462 Neuss
    Alter
    55
    Beiträge
    375
    wie wärs mit:
    Code:
    #define .oooo 0
    #define .oooI 1  // kleinbuchstabe o, grossbuchstabe I
    #define .ooIo 2
    ...
    #define .IIIo E
    #define .IIII F
    
    ...
    
    int binaer=0x.oooI.ooIo.IoIo.IIoo
    habs nicht ausprobiert, und defines sollte man eigentlich nach möglichkeit vermeiden.
    und natürlich sollte man tunlichst vermeiden die .bbbb kombinationen irgendwo anders (versehentlich) zu verwenden !!!
    hat aber den vorteil, das keine funktion aufgerufen werden muss (was nicht an jeder stelle geht)

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

LiTime Speicher und Akkus