2017-11-16 7 views
0

私は循環バッファに基づいて遅延を書いています。これは私の実装です。C++:バッファにアクセスするためのポインタとインクリメンタル変数を使用する

#include <iostream> 

using namespace std; 

int main() { 
    cout << "Fixed delay with circular buffer" << endl; 
    int dtime = 5; 
    int buffersize = 10; 
    auto *in = new int[buffersize]; 
    auto *del = new int[dtime]; 
    auto *out = new int[buffersize]; 
    int p = 0; 
    // zero-initialise the delay line 
    for (int i = 0; i < dtime; i++) { 
     del[i] = 0; 
    } 
    // fill the in buffer 
    for (int i = 0; i < buffersize; i++) { 
     in[i] = i; 
    } 

    // apply delay 
    for (int i = 0; i < buffersize; i++) { 
     // read 
     out[i] = del[p]; 
     // write 
     del[p] = in[i]; 
     // update pointer 
     p = (p != dtime-1? p+1 : 0); 
    } 

    for (int i = 0; i < buffersize; i++) { 
     cout << out[i] << ' '; 
    } 

    delete[] in; 
    delete[] out; 
    delete[] del; 

    return 0; 
} 

これは結果です:0 0 0 0 0 0 1 2 3 4です。

this bookからの読み取りでは、作成者は書き込み/読み取り操作の遅延線へのポインタを実装します。つまり、int *p = delのように、遅延線の先頭を指すようにpを設定し、遅延線にアクセスするときにポインタを参照解除する必要があります。つまり、読み込みの場合はout[i] = del[*p]、書き込みの場合はdel[p] = in[i]です。最後に、これまでのように値を更新します。

しかし、私はこの結果を得ます:8 9 0 0 0 0 0 0 0 0。さらに、ポインタ内の値を調べると、私はこの進展がかなり奇妙な0 1 2 3 4 0 6 7 8 9になってしまいます。 私は2つのバージョンが同じであると期待しているので、なぜこのような動作を理解しようとしています。

完全性のためにポインタ付きのバージョンも添付します。

#include <iostream> 

using namespace std; 

int main() { 
    cout << "Fixed delay with circular buffer" << endl; 
    int dtime = 5; 
    int buffersize = 10; 
    auto *in = new int[buffersize]; 
    auto *del = new int[dtime]; 
    auto *out = new int[buffersize]; 
    int *p = del; 
    // zero-initialise the delay line 
    for (int i = 0; i < dtime; i++) { 
     del[i] = 0; 
    } 
    // fill the in buffer 
    for (int i = 0; i < buffersize; i++) { 
     in[i] = i; 
    } 

    // apply delay 
    for (int i = 0; i < buffersize; i++) { 
     cout << *p << ' '; 
     // read 
     out[i] = del[*p]; 
     // write 
     del[*p] = in[i]; 
     // update pointer 
     *p = (*p != dtime-1? *p+1 : 0); 
    } 

    for (int i = 0; i < buffersize; i++) { 
     cout << endl << out[i] << ' '; 
    } 

    delete[] in; 
    delete[] out; 
    delete[] del; 

    return 0; 
} 

答えて

1

ポインタを正しく処理していません。 *pは、元のコードのdel[p]操作を置き換えます。

out[i] = *p; 
*p = in[i]; 

「更新ポインタ」コードは、ポインタではなく、それが指している値を更新する必要があります。

p = p != &del[dtime - 1] ? p + 1 : del; 

または

if (++p == &del[dtime]) 
    p = del; 
+0

それは仕事をして、どうもありがとうございました。私には2つの質問だけがあります:1)ここでは好ましいアプローチは何ですか? 2)ポインタ付きの2番目のバージョンは、本自体から来ています。私はコードが正しくないと思っていませんが、なぜ彼らはそのように書くのですか? –

+1

@MattiaPaterna好ましいアプローチは意見の問題です。最初の方法は元のコードを厳密に反映していますが、私は2番目の方法をより読みやすくしています。私は2番目の質問に答えることはできません。しかし、書籍に掲載されたコードの誤りは珍しくありません。おそらくあなたは出版社に連絡することができます。 – 1201ProgramAlarm

関連する問題