C ++ push_back会覆盖最后一个向量元素

时间:2013-10-20 11:23:20

标签: c++ vector push-back

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

在传入的频道号和向量元素的数量上犯了一些错误。设置channel-1的值而不是固定为problem的通道。

我的新功能如下:

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);
}

问题是,如果我的vector包含元素,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);
}

0 个答案:

没有答案