为什么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中。因此,更改一个不会影响另一个。

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...