gcc 4.8.2 ou supérieur ?

Bonjour,
Je rencontre quelques problèmes de compilation qui semblent liés à la version du compilateur gcc actuellement utilisée par le framework Arduino (pour mes librairies portables qui compilent déjà très bien sous Windows, Linux & MacOS) :

TOOLS/gt_cls_string.cpp: In member function 'gt_cls_string& gt_cls_string::str(gt_longlong, gt_cls_string::enm_base)':
TOOLS/gt_cls_string.cpp:418:1: error: unrecognizable insn:
 }
 ^
(insn 228 227 229 9 (parallel [
            (set (reg:HI 66)
                (minus:HI (subreg:HI (subreg:SI (reg:DI 63) 0) 0)
                    (reg:HI 64)))
            (clobber (scratch:QI))
        ]) TOOLS/gt_cls_string.cpp:382 -1
     (nil))
TOOLS/gt_cls_string.cpp:418:1: internal compiler error: in extract_insn, at recog.c:2150
libbacktrace could not find executable to open
Please submit a full bug report,
with preprocessed source if appropriate.
See <http://gcc.gnu.org/bugs.html> for instructions.

J’ai pu lire que le problème est résolu dans les version 4.8.2 et supérieures de gcc… Est-ce-que quelqu’un saurait si l’on peut “mettre à jour soi même” le gcc du framework (qui malheureusement semble être le 4.8.1 !) ? et si oui, comment ?

Bonjour,

Quel est ton OS ? Windows, Linux, Mac OS ?

Sur linux, c'est le paquet "avr-gcc" que tu peux mettre à jour si ta distribution en a une disponible.

(Je suis sous Gentoo Linux, j'ai la 4.9.2)

Merci pour l'info ! Malheureusement je tourne essentiellement sous XCode (Mac) pour l'IDE, mais occasionnellement sous Windows aussi. Si je trouve l'occasion, je tenterai la manip sous Linux, pour l'heure je tente de contourner le problème en attendant... :(

Après une recherche par dichotomie de contournement, j'ai trouvé que c'était ce switch qui faisait planter le compilo :

            switch( loc_ll_tmp )
            {
                case  0 : *this -= '0'; break;
                case  1 : *this -= '1'; break;
                case  2 : *this -= '2'; break;
                case  3 : *this -= '3'; break;
                case  4 : *this -= '4'; break;
                case  5 : *this -= '5'; break;
                case  6 : *this -= '6'; break;
                case  7 : *this -= '7'; break;
                case  8 : *this -= '8'; break;
                case  9 : *this -= '9'; break;
                case 10 : *this -= 'A'; break;
                case 11 : *this -= 'B'; break;
                case 12 : *this -= 'C'; break;
                case 13 : *this -= 'D'; break;
                case 14 : *this -= 'E'; break;
                case 15 : *this -= 'F'; break;
            }

En le mettant en cascade avec pas plus de 6 cases dans chacun, ca compile (!) :

            switch( loc_ll_tmp )
            {
                case  0 : *this -= '0'; break;
                case  1 : *this -= '1'; break;
                case  2 : *this -= '2'; break;
                case  3 : *this -= '3'; break;
                case  4 : *this -= '4'; break;
                case  5 : *this -= '5'; break;
                default :
                    switch ( loc_ll_tmp )
                {
                    case  6 : *this -= '6'; break;
                    case  7 : *this -= '7'; break;
                    case  8 : *this -= '8'; break;
                    case  9 : *this -= '9'; break;
                    case 10 : *this -= 'A'; break;
                    case 11 : *this -= 'B'; break;
                    default :
                        switch (loc_ll_tmp)
                    {
                        case 12 : *this -= 'C'; break;
                        case 13 : *this -= 'D'; break;
                        case 14 : *this -= 'E'; break;
                        case 15 : *this -= 'F'; break;
                    }
                }
            }

Si je mets plus de 6 cas dans un switch, je retombe sur le plantage du compilateur (!) C'est une solution de contournement qui me permet d'avancer, mais ce n'est pas très élégant... :(

"*this -= " me semble bizarre comme construction... je me demande si ce n'est pas ça qui pose problème.

Quel type d'objet est-ce ? A-t-il un opérateur -= de défini ?

oui oui, l'opérateur "-=" est surchargé pour faire une concaténation en tête (préfixe). Il fonctionne très bien, comme dit, sur Mac/iOS, Linux & Windows...

Bonjour, Pour changer de version de compilateur, tu peux t'inspirer de : https://skyduino.wordpress.com/2012/07/07/hack-utiliser-teensyduino-avec-une-carte-arduino-leonardo-ou-compatible-leonardo/

merci icare, ca se tente ! :grin: