質問: 1; a < cycles; a++){ // ここでつまずいています } ```
回答: [c](/questions/tagged/c "'c' のタグが付いた質問を表示")/[c++](/questions/tagged/c%2b%2b "'c++' のタグが付いた質問を表示") の `mem***()` は「メモリ上の物理的配置」を強く意識しないと使えない代物です。他言語はこの辺を故意に隠ぺいしている関係で [c](/questions/tagged/c "'c' のタグが付いた質問を表示") 独特のものといってもいいでしょう。元コードを [c#](/questions/tagged/c%23 "'c#' のタグが付いた質問を表示") に移植する際においては `memcpy()` 部分は元コードを参考にせず OOPer さんの示した「元コードが何をやっているか」を理解した上で書き直すのが手早いっす。元コードの `memcpy` 部分の詳しい解説は [c#](/questions/tagged/c%23 "'c#' のタグが付いた質問を表示") で何をしなければならないかの理解の邪魔になるので省略。 「何をするコード」なのか - 三角波の1周期分を `[data[0]...data[period])` の半開区間に格納しています。 - それを複写すれば「複数周期」になるわけですよね。 ってことは、やらなきゃならないことは `data` の部分データの複写で、 複写元:配列 `data` の位置 `0` 長さ `period` の区間 複写先:配列 `data` の位置 `period*1` 複写先:配列 `data` の位置 `period*2` ... 以下同文 ここまでわかったらすでに提示されている「配列の複写」 `Array.Copy` を使うのが手早そうです。 MSDN 解説によると4種類の `Copy` が可能だとわかりました。今回やりたいのは配列内要素を同一配列内の違う位置にコピーなので、4種類のうちどれが適切なのかを解説読んで探します。 今回単に `int` を使えば十分なので引数に `Int64` を使うものは不要。 複写先を `0` 位置固定にするのは不適。 ということで `Array.Copy(Array sourceArray, int sourceIndex, Array destinationArray, int destinationIndex, int length);` が最適だと判明します。 あと [c#](/questions/tagged/c%23 "'c#' のタグが付いた質問を表示") は型が縮小する方向への変換はキャストの明示を要求する仕様であること、何がしたいのかもっと直観的に読めるように直しておきたいので ``` for (int i = 0; i < period4; ++i) { int val = 32767 * i / period4; data[0 * period4 + i] = (short)(val); data[1 * period4 + i] = (short)(32767 - val); data[2 * period4 + i] = (short)(-val); data[3 * period4 + i] = (short)(-32767 + val); } for (int i = 1; i < cycles; ++i) { Array.Copy(data, 0, data, i * period, period); } ``` ってことになりそうです。 `0 * period4` とか無駄っぽいですが、最近のコンパイラは十分賢いので最適化してくれますし、してくれなくても初期化1回だけなんだったらキニシナイ。 # 宿題なんだったらそろそろ期限切れだろうし # SO 的には「もっと考えてね」よりは直接の回答になってるほうがよいと判断