2016-04-08 9 views
0

このコードはavr-g ++コンパイラではコンパイルされません。見出しにエラーが表示されます。 15行か16行のいずれかをコメントアウトすると、コンパイルされます。 15行目と16行目の右側にある「colourArray」または「blackArray」を削除すると、コンパイルされます。また、15行目と16行目の '' greyDiff ''を変数代入のそれぞれの右側に置き換えた場合。 forループにない場合はコンパイルされます。それはコンパイラのバグではありませんか?クラス 'POINTER_REGS'(おそらくコンパイラのバグ)に流出するレジスタを見つけることができません

float colourArrayL[3] = {0, 0, 0}; 
float whiteArrayL[3] = {0, 0, 0}; 
float blackArrayL[3] = {0, 0, 0}; 
float colourArrayR[3] = {0, 0, 0}; 
float whiteArrayR[3] = {0, 0, 0}; 
float blackArrayR[3] = {0, 0, 0}; 

void setup() 
{ 
    for (byte i = 0; i < 3; i++) 
    { 
    float greyDiffL = whiteArrayL[i] - blackArrayL[i]; //the highest possible return minus the lowest returns the area for values in between 
    float greyDiffR = whiteArrayR[i] - blackArrayR[i]; 

    colourArrayL[i] = (colourArrayL[i] - blackArrayL[i])/greyDiffL; 
    colourArrayR[i] = (colourArrayR[i] - blackArrayR[i])/greyDiffR; 
    } 
} 

void loop() {}; 
+0

どのコンパイラバージョンですか? – TriskalJM

+0

[Arduino issue 3972](https://github.com/arduino/Arduino/issues/3972)、[GCC 60040](https://gcc.gnu.org/bugzilla/show_bug.cgi?id=60040) )、[Stackoverflow question 39255127](http://stackoverflow.com/questions/39255127/arduino-error-unable-to-find-a-register-to-spill-in-class-no-regs) – rwong

答えて

0

私はAVR-G ++(GCC)4.8.1での作業とカスタムクラスrgbscenario00のためのコピーコンストラクタを書くときに似たような経験を持ってきました。このエラーは、コピーコンストラクタ内に5つ以上のrgbledオブジェクトをコピーするときに発生します。私は2つのプライベートメソッド(&の征服を使用して)を追加することでこれを解決しました。したがって、コンパイラはすべてのレジスタを使用しようとしているようですが、それらがすべて使用されると、エラーで停止するだけです。ここに私の解決策(重要な部分だけを示しています:)

void rgbscenario00::copyrgb123(const rgbscenario00& orig) { 
    magenta   = orig.magenta; 
    rood   = orig.rood; 
    geel   = orig.geel; 
} 

void rgbscenario00::copyrgb456(const rgbscenario00& orig) { 
    groen   = orig.groen; 
    blauw   = orig.blauw; 
    oranje   = orig.oranje; 
    // uncommenting this last oranje line resulted in 
    // "error: unable to find a register to spill 
    // in class 'POINTER_REGS' " 
} 

rgbscenario00::rgbscenario00(const rgbscenario00& orig) { 
    // I have to split up this copy constructor to avoid 
    // getting a very silly error on the lack of registers 
    copyrgb123(orig); 
    copyrgb456(orig); 
    //magenta = orig.magenta; rood = orig.rood; geel = orig.geel; 
    //groen = orig.groen; blauw = orig.blauw; 
    //oranje = orig.oranje; 
    // uncommenting this oranje line resulted in 
    // "error: unable to find a register to spill 
    // in class 'POINTER_REGS' " 
    inputString   = orig.inputString; 
    stringComplete  = orig.stringComplete; 
    iteller    = orig.iteller; 
    huedeviation  = orig.huedeviation; 
    lumdeviation  = orig.lumdeviation; 
    uiteller   = orig.uiteller; 
    ujchosen   = orig.ujchosen; 
    usbspeed   = orig.usbspeed; 
    currentmillis  = orig.currentmillis; 
    prevmillis   = orig.prevmillis; 
    millisperloop  = orig.millisperloop; 
    millisperstep  = orig.millisperstep; 
    tfuture    = orig.tfuture; 
    tstep    = orig.tstep; 
    copyboolarray(&(computed[0]),&(orig.computed[0]),maxuirgblednum); 
    copyboolarray(&(done[0]), &(orig.done[0]), maxuirgblednum); 
    copyuliarray(&(nexttime[0]),&(orig.nexttime[0]),maxuirgblednum); 
    copyuiarray(&(uilumvalues[0]),&(orig.uilumvalues[0]), 
       maxuilumvalues); 
} 
関連する問題