如何解决为什么const std :: array <std :: array <float,1081>,2>&wavetable_h不指向原始数组?
我认为当您使用const std::array<float> & arr
时,新数组仅指向原始数组的地址,但是在我的代码中,当我更改原始数组时,const array<>&
并没有改变。
这意味着我必须在主循环中不断设置它,而不是在进入主循环之前只设置一次。任何想法,我需要做些什么以使其不被复制,以及对为什么它是错误的一些解释,将不胜感激。
main.cpp:
void GeoHeadAudioProcessor::processBlock (juce::AudioBuffer<float>& buffer,juce::MidiBuffer& midiMessages)
{
juce::ScopedNoDenormals noDenormals;
buffer.clear();
proc0.setWavetable(waveforms); //Need to set it every time because it doesn't copy
proc1.setWavetable(waveforms); // causes glitches to slow
proc0.processBlock(buffer,midiMessages);
proc1.processBlock(buffer,midiMessages);
}
public:
std::array<std::array<float,1081>,2> waveforms = {{ {0},{0} }};
oscillatorprocessor.cpp:
public:
void setWavetable(const std::array<std::array<float,2>& wavetable_h)
{
wavetable = wavetable_h;
}
void processBlock()
{
voice->setWavetable(wavetable,id);
}
private:
std::array<std::array<float,2> wavetable;
SynthVoice* voice;
SynthVoice:
public:
void setWavetable(const std::array<std::array<float,2>& wavetable_h,int id_h)
{
wavetable = wavetable_h;
id = id_h;
}
解决方法
您对from openpyxl import *
# DECLARING WORKBOOKS
Excel1 = "SHEET1.xlsx"
wb1 = load_workbook(Excel1)
sheet1 = wb1['Tabelle1']
Excel2 = "SHEET2.xlsx"
wb2 = load_workbook(Excel2)
sheet2 = wb2['Sheet']
Excel_final = "SHEET_NEW.xlsx"
wb_final = load_workbook(Excel_final)
sheet_final = wb_final['Sheet']
# READ THE SHEETS
rows = 4722
list_sheet1 = []
for r in range(1,rows+1):
tuple_sheet1 = (sheet1.cell(row=r,column=1).value,sheet1.cell(row=r,column=2).value)
list_sheet1.append(tuple_sheet1)
rows = 10438
list_sheet2 = []
for r in range(1,rows+1):
tuple_sheet2 = (sheet2.cell(row=r,sheet2.cell(row=r,column=2).value,column=3).value,column=4).value,column=5).value,column=6).value,column=7).value,column=8).value,column=9).value)
list_sheet2.append(tuple_sheet2)
# FILTERS THE DATA
list_final = []
key_set = []
var1 = str()
var2 = str()
for i in list_sheet1:
var1 = i[0]
var2 = i[1]
var = (str(var1),str(var2))
key_set.append(var)
for i in list_sheet2:
var1 = i[1]
var2 = i[7]
var = (str(var1),str(var2))
if var not in key_set:
list_final.append(i)
key_set.append(var)
# WRITING TO WORKBOOK
for i in list_final:
sheet_final.append(i)
wb_final.save(Excel_final)
的理解很好,但是问题出在SynthVoice类上:
&
我对其进行了重新格式化,以便可以用A和B进行标记。当您专注于A(实际上是对数组的引用)时,请查看标记为B的行。
在该行中,您正在将public:
void setWavetable(
const std::array<std::array<float,1081>,2>& wavetable_h,// A
int id_h
)
{
wavetable = wavetable_h; // B
id = id_h;
}
分配给..某物。
那个叫做wavetable_h
的东西,可能是SynthVoice类的一个字段,可能只是一个字段。您将无法分配给wavetable
,因为引用不可分配,因此无法编译。因此,很可能array<...>& wavetable
变量是wavetable
的非引用。
这反过来意味着,行B将行A中作为引用传递的内容复制到变量array
中。这就是为什么您观察到在原始位置更改数组时数组未更新的原因。 SynthVoice的wavetable
不是参考。这是一个副本,因此当您更改原始内容时,副本不会“更新自身”。
哦,我刚刚注意到了ossitorpreprocessor.cpp代码段。它有同样的问题-看起来和我在SynthVoice中所猜测的完全一样-wavetable
如果您将其更改为类似的内容
std::array<std::array<float,2> wavetable;
这将是参考意义的,指向原始内容。所示的每个示例都有其自己的怪癖,因此请仔细考虑。但是它们每个都是对原始文件的某种引用/指针,而std::array<std::array<float,2>& wavetable;
std::array<std::array<float,2>* wavetable;
std::shared_ptr<std::array<std::array<float,2>> wavetable;
std::reference_wrapper<std::array<std::array<float,2>> wavetable;
// ...
只是一个新的独立事物。
因为wavetable
是类的按值存储的私有成员,所以当您为其分配另一个数组时,该数组将被复制到wavetable
中。因此,更改一个不会影响另一个。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。