0

由于我无法在询问后 8 小时内回答我自己的问题,因此我在此处发布我的解决方案。

在输入的通道号和向量元素的数量上犯了一些错误。设置通道 1 的值而不是通道固定的问题。

我的新功能如下:

void input(long inlet, t_symbol *s, long ac, t_atom *av){
    // GET VARIABLES
    long channel = atom_getlong(av);
    double value = atom_getfloat(av + 1);
    long v_size = v_chan.size();
    if(channel && v_size < channel){
        for(int i = v_size; i < channel; i++){
            v_chan.push_back(n_chan);
        }
        v_chan[channel - 1].value = value;
    }
    else if(channel){
        v_chan[channel - 1].value = value;
    }
}

我有一个包含结构的向量,我喜欢用一个新的空结构来 push_back。
示例代码:

struct channels{
  double value;
  // eventually more variables
};

vector<channels> v_chan;
channels n_chan;

void push(){
  v_chan.push_back(n_chan);
}

问题是,如果我的向量包含元素, push_back 添加一个元素,但也会覆盖最后一个元素。

例如,如果我的向量大小为 1,元素 0 的值为 0.2,则在 push_back 之后,我的向量大小为 2,但元素 0 和 1 的值为 0。

我在这里做错了什么?

实码:(MAX/MSP外部,函数输入在Max中调用)

#include <maxcpp6.h>
#include <string>
#include <algorithm>
#include <vector>

using namespace std;

struct bind{
    string param;
    double* value;
    int track;
    double base;
    double multiplier;
};

struct channels{
    double value;
    vector<int> bind;
};

vector<channels> v_chan;
vector<bind> v_bind(19);
channels n_chan;

class rec : public MaxCpp6<rec> {
public:
rec(t_symbol * sym, long ac, t_atom * av) {
    setupIO(1, 1); // inlets / outlets
}
~rec() {}

// methods:


//SET BIND FUNCTION
void setBind(long inlet, t_symbol *s, long ac, t_atom *av){
}

void output(long track, long type){

}

void input(long inlet, t_symbol *s, long ac, t_atom *av){
    // GET VARIABLES
    long channel = atom_getlong(av);
    double value = atom_getfloat(av + 1);
    long v_size = v_chan.size();
    if(v_size <= channel){
        v_chan.push_back(n_chan);
    }
    else{
        v_chan[channel].value = value;
    }
}

void dump(long inlet){
    for(int i = 1; i <= v_chan.size(); i++){
        post("%d %.2f", i, v_chan[i].value);
    }
}

    void clearTrackBinds(long inlet){

    }

    void reset(long inlet){
        clearTrackBinds(0);
    }
};

C74_EXPORT int main(void) {
    // create a class with the given name:
    rec::makeMaxClass("solar_receiver");
    REGISTER_METHOD_GIMME(rec, input);
    REGISTER_METHOD_GIMME(rec, setBind);
    REGISTER_METHOD(rec, dump);
    REGISTER_METHOD(rec, clearTrackBinds);
    REGISTER_METHOD(rec, reset);
}
4

0 回答 0