我對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:他的代碼不需要運行時變量名稱。 –