从cpp中结构内部的向量接收零值

问题描述 投票:0回答:1

我试图通过带有 write() 的管道将一个结构发送到另一个进程,该结构包含一个向量,并且该向量在被另一个进程读取时给出零值。 每当进程发送一条消息时,它都会增加其向量的索引,当它接收到一条消息时,它也会增加其向量的索引,并将其他索引更新为接收到的值和先前存储的向量值的最大值(改进 Peterson Kearns 协议) 这是我要发送的结构

struct ptp_msg
{
    char msg_buf[50];
    int sending_process_nr;
};

struct ptp_err
{
    pid_t pid;
    int sending_process_nr;
    int fildes[2];
};

struct msg_t
{
    message_type msg_type;
    vector<int> time_v;
    vector<int> fail_v;
    union contents
    {
        struct ptp_msg ptp_msg;
        struct ptp_err ptp_err;
    } contents;
};

这是发送结构的代码

int Pet_kea::send_msg(char *input, int fildes[2])
{
    // inc T^i
    time_v[id]++;

    struct msg_t msg;

    msg.msg_type = MSG;
    sprintf(msg.contents.ptp_msg.msg_buf, input);
    msg.time_v = time_v;
    msg.contents.ptp_msg.sending_process_nr = id;
    msg.fail_v = fail_v;

    // send the message
    cout << id << " vector sent =" << msg.time_v[0] << "-" << msg.time_v[1] << endl;

    if (write(fildes[1], &msg, sizeof(msg)) < 0)
    {
        // handle error
    }

    store_msg(&msg, false);

    return 0;
}

int Pet_kea::recv_msg(int fildes[2], struct msg_t *ret_buf)
{
    // read message
    int ret;
    ret = read(fildes[0], ret_buf, sizeof(msg_t));
    // do err checking
    if (ret < 0)
    {
    }
    cout << id << " vector recieved =" << ret_buf->time_v[0] << "-" << ret_buf->time_v[1] << endl;

    // check if it is an errmsg

    // inc T^i and inc T^/j to max(T^j of send event, prev event T^j)
    time_v[id]++;
    for (int i = 0; i < (int)time_v.size(); i++)
    {
        if (i == id)
            continue;
        time_v.at(i) = max(ret_buf->time_v[i], time_v[i]);
    }

    store_msg(ret_buf, true);

    return 0;
}

谢谢您的帮助

我试图看看问题是否出在我的逻辑上,但测试的输出(也在上面的代码中)是 发送0向量=1-0 收到 1 个向量 =0-0 这些语句位于写入之前和读取之后,因此它们应该匹配

c++ vector struct io
1个回答
0
投票

thnx 寻求帮助,这是我想出的基本代码:

void Pet_kea::serialize(struct msg_t *msg, char *data)
{
    int *q = (int *)data;
    *q = msg->msg_type;
    q++;
    *q = msg->sending_process_nr;
    q++;
    for (int i = 0; i < (int)time_v.size(); i++)
    {
        *q = msg->time_v[i];
        q++;
    }

    for (int i = 0; i < (int)fail_v.size(); i++)
    {
        *q = msg->fail_v[i];
        q++;
    }
    if (msg->msg_type == MSG)
    {
        char *p = (char *)q;
        for (int i = 0; i < 50; i++)
        {
            *p = msg->contents.ptp_msg.msg_buf[i];
            p++;
        }
    }
    else
    {
        // TODO: write serialization for errmsg
    }
}
void Pet_kea::deserialize(char *data, struct msg_t *msg)
{
    int *q = (int *)data;
    msg->msg_type = (msg_type)*q;
    q++;
    msg->sending_process_nr = *q;
    q++;

    for (int i = 0; i < (int)time_v.size(); i++)
    {
        msg->time_v[i] = *q; //////
        q++;
    }

    for (int i = 0; i < (int)fail_v.size(); i++)
    {
        msg->fail_v[i] = *q;
        q++;
    }
    if (msg->msg_type == MSG)
    {
        char *p = (char *)q;
        for (int i = 0; i < 50; i++)
        {
            msg->contents.ptp_msg.msg_buf[i] = *p;
            p++;
        }
    }
    else
    {
        // TODO: write deserialization for errmsg
    }
}

我将看一下提到的 flatbuffer 和 protobuffer 库。

© www.soinside.com 2019 - 2024. All rights reserved.