- Labornetzteil AliExpress         
Ergebnis 1 bis 6 von 6

Thema: Binär-Dezimal Präprozessor für Linux gcc

  1. #1
    Benutzer Stammmitglied
    Registriert seit
    09.05.2004
    Ort
    Mannheim
    Beiträge
    79

    Binär-Dezimal Präprozessor für Linux gcc

    Anzeige

    LiFePo4 Akku selber bauen - Video
    Hallo,

    ich bin gerade auf Linux umgestiegen und mir gefällt die Einschränkung des neuen Compilers, dass ich keine Binären Zahlen (alla "0b") mehr verwenden kann, nicht, daher habe ich einen Präprozessor in Python geschrieben, mit dem man Binärwerte in den Quelldateien automatisch in Dezimalwerte umwandeln kann.

    Ich werde ihn mir noch in mein Makefile einbauen, damit ich mich darum nicht mehr zu kümmern brauche, ein vorläufiger Entwurf sieht so aus:

    [...]
    convert:
    @echo "Backup alter Source-Dateien machen..."
    mkdir ConvBackup
    cp $(PRJSRC) ConvBackup/
    @echo "Konvertieren..."
    /pfad/zur/datei/bindec.py $(PRJSRC) >> /dev/null

    convbackupback:
    @echo "Backup zurück..."
    cp ConvBackup/* .
    rm -R ConvBackup/
    [...]

    Wichtig ist dabei vor allem das Backup der Original Quelldateien, Binärwerte sind nunmal (vor allem bei Bitmasken, o.ä) einfach besser zu lesen, nicht vergessen dieses dann wiederherzustellen!

    Noch ein paar Anmerkungen:
    Leider hat das Programm (noch) keine Fehlererkennung, es unterstützt zudem nur exakt 8bit lange Binärwerte (z.B.: 0b10101010) und sie müssen auch genauso geschrieben werden, alles andere führt zu unerwünschten Ergebnissen. Aber das könnt ihr ja gerne ändern. Wäre super, wenn ihr verbesserte Versionen wieder hier einstellt!

    Natürlich kann ich keine Haftung für verlorene oder kaputte Dateien übernehmen...

    Ich hoffe, irgendwer kann das Programm gebrauchen,

    viele Grüße,

    Daniel
    Angehängte Dateien Angehängte Dateien

  2. #2
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    04.04.2005
    Ort
    Hamburg
    Alter
    35
    Beiträge
    826
    Ich kenn mich zwar nciht mit Python aus, aber das oben sind mir nicht danach aus.

    Kann es sein, dass du das Script vergessen hast?
    www.subms.de
    Aktuell: Flaschcraft Funkboard - Informationssammlung

  3. #3
    Benutzer Stammmitglied
    Registriert seit
    09.05.2004
    Ort
    Mannheim
    Beiträge
    79
    danke hab ich ja fast vergessen!

  4. #4
    Neuer Benutzer Öfters hier
    Registriert seit
    22.10.2005
    Beiträge
    16
    Für diese Problematik habe ich mal ein präprozessor-makro geschrieben, welches wie folgt aussieht. (Es ist jedoch nur für 8-Bit Werte(unsigned char))

    Code:
    #define CATHREL_BIN8(a,b,c,d,e,f,g,h) ((a)*128+(b)*64+(c)*32+(d)*16+(e)*8+(f)*4+(g)*2+(h))
    und angewandt kann es dann so werden:
    Code:
      unsigned char y;
      y = CATHREL_BIN8(1,1,1,0,1,0,1,0);

  5. #5
    Erfahrener Benutzer Robotik Einstein Avatar von SprinterSB
    Registriert seit
    09.06.2005
    Ort
    An der Saar
    Beiträge
    2.802

    Re: Binär-Dezimal Präprozessor für Linux gcc

    Zitat Zitat von danst
    Hallo,

    ich bin gerade auf Linux umgestiegen und mir gefällt die Einschränkung des neuen Compilers, dass ich keine Binären Zahlen (alla "0b") mehr verwenden kann, nicht, daher ...
    Nun denn, packen wir einfach das Übel an der Wurzel und lehren gcc, wie er mit 0b* umzugehen hat. Wenn wir schon Open Source verwenden, dann sind wir ja Master of Code
    Und sooo viel zu patchen ist's wirklich nicht! Schau selbst:

    Zitat Zitat von <GCC>/gcc/cpplib.h
    Code:
    #define CPP_N_RADIX	0x0F00
    #define CPP_N_DECIMAL	0x0100
    #define CPP_N_HEX	0x0200
    #define CPP_N_OCTAL	0x0400
    #define CPP_N_BINARY	0x0800
    Zitat Zitat von <GCC>/gcc/cppexp.c
    Code:
    unsigned int
    cpp_classify_number (cpp_reader *pfile, const cpp_token *token)
    {
    ...
      /* First, interpret the radix.  */
      if (*str == '0')
      {
          radix = 8;
          str++;
          
          /* Require at least one hex digit to classify it as hex.  */
          if ((*str == 'x' || *str == 'X')
              && (str[1] == '.' || ISXDIGIT (str[1])))
          {
              radix = 16;
              str++;
          }
          /* Require at least one binary digit to classify it as binary.  */
          else if ((*str == 'b' || *str == 'B')
              && (str[1] == '0' || str[1] == '1'))
          {
              radix = 2;
              str++;
          }
      }
    ...
      
      if (max_digit >= radix)
          if (radix == 2)
              SYNTAX_ERROR2 ("invalid digit \"%c\" in binary constant", '0' + max_digit);
          else
              SYNTAX_ERROR2 ("invalid digit \"%c\" in octal constant", '0' + max_digit);
    
    ...
    
      if (radix == 10)
        result |= CPP_N_DECIMAL;
      else if (radix == 16)
        result |= CPP_N_HEX;
      else if (radix == 2)
        result |= CPP_N_BINARY;
      else
        result |= CPP_N_OCTAL;
    
      return result;
    
     syntax_error:
      return CPP_N_INVALID;
    }
    
    cpp_num
    cpp_interpret_integer (cpp_reader *pfile, const cpp_token *token, unsigned int type)
    {
    ...
          if ((type & CPP_N_RADIX) == CPP_N_OCTAL)
    	{
    	  base = 8;
    	  p++;
    	}
          else if ((type & CPP_N_RADIX) == CPP_N_HEX)
    	{
    	  base = 16;
    	  p += 2;
    	}
          else if ((type & CPP_N_RADIX) == CPP_N_BINARY)
    	{
    	  base = 2;
    	  p += 2;
    	}
    ...
    }
    Dabei sind das nicht alles Änderungen, sondern teilweise noch der Originalcode, damit die Stellen besser zu finden sind.
    Disclaimer: none. Sue me.

  6. #6
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    05.11.2004
    Ort
    Karlsruhe
    Beiträge
    223
    Wenn du WinAVR installierst kriegst du auch alle patches die in dem Paket drin sind mitgeliefert -- liegen in irgendeinem Unterordner, und dann kannst du die einfach in deinen avr-gcc unter Linux reinbauen. Also keine wirkliche Notwendigkeit für einen Preprocessor ...

Berechtigungen

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

Labornetzteil AliExpress