奇妙なスタック破損

私がこれを行うならば:

uint32_t THRESH_12DBU[8] = { 
    2729,// +6 dBu 
    ... 
};  

... 

int 
vuled8_set_bits(struct vuled8 *vu,
        uint8_t *bits,
        uint32_t val,
        int mode)
{   
    int ti; 

    for (ti = 0; val < THRESH_12DBU[ti] && ti < 8; ti++) {
        ;   
    }   

    if (ti < 8) {
Serial.println(ti);
        ... 

値8がモニターに表示されます。明らかに、if条件が期待どおりに実行されていないか、またはtiの値が破損しています。

しかし、もし私が最初にしたら:

struct vuled8 {
    ... 
    uint32_t thresh[8];
};  

... 

    int ti; 
    for (ti = 0; ti < 8; ti++) {
        vu->thresh[ti] = THRESH_12DBU[ti];
    }   

配列にアクセスするコードを次のように変更します。

    for (ti = 0; val < vu->thresh[ti] && ti < 8; ti++) {
        ;   
    }   

期待どおりに動作します。 (顕著な)腐敗はありません。静的配列に直接アクセスするだけで直接破損することがあります。

私はgccで多くのコードを書いていますが、g ++の経験はほとんどありません。これはC ++コンパイラで普通のCをコンパイルしようとすると問題になるのですか?

配列staticまたはconstを宣言することは効果がありません。

0
ミショニー、それだった!私が受け入れることができるように答えとして再投稿してください。
追加された 著者 jblocksom,
最小限で完全で検証可能な例を投稿してください。このようなことは、g ++とg ++で似ているはずです。
追加された 著者 Nick Gammon,
最初にvalとthresh [ti]を比較してからti <8であるかどうかをチェックするので、配列を超えて読み取る可能性があります。&&オペランドをスワップすると問題ありません。保護されたメモリを持つシステムでは、クラッシュを引き起こす可能性がありますが、Arduinoでは気にならないはずです。だから私はあなたのポストに表示されていない何か他のものがあると思っています。
追加された 著者 Syed Nazrul Hassan,
あなたは明らかにエラーが存在しないと仮定して、たくさんのコードを省略しています。私の推測では、省略されたコードにエラーがあります。 Nick Gammonのアドバイスに従ってください。最小限で完全で検証可能な例を投稿する前にバグを見つけられるかもしれません。
追加された 著者 Daniel,

答えはありません

0