私は、C++やコンパイルされた言語では一般的に新しく、強力な解釈の背景を持っているので、コンパイル時に特定のものにアクセスできないという限界を克服しようとしています。現時点ではコードブロックをループに最適化する
は、私はこのようなコードの大きなブロックを持っている:
//New note, note36
MemoryInputStream* input36 = new MemoryInputStream(BinaryData::C1hard1_wav, BinaryData::C1hard1_wavSize, false);
auto reader36 = audioFormatManager.createReaderFor(input36);
BigInteger note36;
note36.setRange(36, 1, true);
addSound(new SamplerSound("note36", *reader36, note36, 36, 0.001, 0.01, 26.0));
delete input36;
delete reader36;
//New note, note37
MemoryInputStream* input37 = new MemoryInputStream(BinaryData::Csharp1hard1_wav, BinaryData::Csharp1hard1_wavSize, false);
auto reader37 = audioFormatManager.createReaderFor(input37);
BigInteger note37;
note37.setRange(37, 1, true);
addSound(new SamplerSound("note37", *reader37, note37, 37, 0.001, 0.01, 26.0));
delete input37;
delete reader37;
このコードは、この方法で48回繰り返し、これは良い方法ではありません。私はPHP、インタプリタ言語でこれを達成する方法の例は、この
$noteMap = array(36 => "C1", 37 => "Csharp1");
foreach($noteMap as $midiNumber => $note)
{
$name = $note . "hard1_wav";
$size = $note . "hard1_wavSize";
$input = new MemoryInputStream(BinaryData::$name, BinaryData::$size, false);
$reader = audioFormatManager->createReaderFor($input);
//I know this bit is bad PHP, no bigintegers in PHP but I can't think of a way to replicate it for arguments sake
$note = 0;
$note->setRange($midiNumber, 1, true);
addSound(new SamplerSound("note".$midiNumber, $reader36, $note, $midiNumber, 0.001, 0.01, 26.0));
}
これは、はるかに管理し、再利用可能であるようになります。私が行った変更はファイル全体で慎重に繰り返す必要はなく、変更はすばやく行うことができます。私は関数名として変数を渡すことはコンパイルされた言語で行われるものではないことを知っていますが、それを考慮に入れても、大規模なコードブロックをきちんとしたループにまとめる方法が必要です。私にそれを。
これをC++で行うことはできません。変数名は実行時には変更できません。読者とMIDIチャンネルには 'std :: vector'や別のコンテナを使い、代わりにそのチャンネルをループします。 – user0042
C++では、マップの 'std :: map'を使うことができ、' foreach'の 'for'の範囲を使うことができます。そして、あなたは 'input'や' reader'に対して非効率な動的割り当てを使う必要はありません。 –
@ user0042:彼のコードは実行時の変数名を必要としません。 –