0
votes

I'm making a randomly generated network where the node will send an update massage after asking if the other node already know the update. Currently the update status is still predefined. I'm getting this error message when running the simulation:

"(omnetpp::cModule)Simplegossip1: Unknown parameter 'updated' -- in module (Sg1) Simplegossip1.node[0] (id=2), at t=0s, event #1" 

Here's my code:

simplegossip1.ned (I'm using code from here How to create a randomly connected graph in OMNeT++?)

    simple Sg1
{
    parameters:
        @display("i=block/routing");
        bool updated;
    gates:
        input in[];  // declare in[] and out[] to be vector gates
        output out[];
}

network Simplegossip1
{
    parameters:
        int count;
        double connectedness; // 0.0<x<1.0
    submodules:
        node[count]: Sg1 {
            gates:
                in[];  // removed the size of gate
                out[];
        }
    connections allowunconnected:
       for i=0..count-2, for j=i+1..count-1, if uniform(0,1)<connectedness {
            node[i].out++ --> node[j].in++;
            node[i].in++ <-- node[j].out++;
        }
}

sg1.cc

#include <stdio.h>
#include <string.h>
#include <omnetpp.h>

using namespace omnetpp;

/**
 * First attempt for gossip protocol
 */
class Sg1 : public cSimpleModule
{
public:
    cMessage *askupdated = new cMessage("Ask Update");
    cMessage *updated = new cMessage("Updated");
    cMessage *unupdated = new cMessage("Unupdated");
    cMessage *update = new cMessage("Here is the update");
  protected:
    virtual void forwardMessage(cMessage *msg, int dest);
    virtual void initialize() override;
    virtual void handleMessage(cMessage *msg) override;
    };

Define_Module(Sg1);

void Sg1::initialize()
{
    if (getIndex() == 0) {
        // Boot the process scheduling the initial message as a self-message.
        char msgname[20];
        sprintf(msgname, "tic-%d", getIndex());
        cMessage *msg = new cMessage(msgname);
        scheduleAt(0.0, msg);
    }
}

void Sg1::handleMessage(cMessage *msg)
{
    int n = gateSize("out");
    int k = intuniform(0, n-1);
    int sid = msg->getArrivalGateId();
    bool updatestatus = getParentModule()->par("updated");
    if (msg == askupdated) {
        if (updatestatus == true){
            forwardMessage(updated,sid);
        }
        else {
            forwardMessage(unupdated,sid);
        }
    }
    else if (msg == unupdated) {
        forwardMessage(update,sid);
    }
    else {
        forwardMessage(askupdated,k);
    }
}

void Sg1::forwardMessage(cMessage *msg, int dest)
{
    // In this example, we just pick a random gate to send it on.
    // We draw a random number between 0 and the size of gate `out[]'.
    EV << "Forwarding message " << msg << " on port out[" << dest << "]\n";
    send(msg, "out", dest);
}

And an omnet.ini file that only calling the Simplegossip1 network.

How do I solve this? Thanks in advance.

1

1 Answers

1
votes

You have to change the line

bool updatestatus = getParentModule()->par("updated");

into

bool updatestatus = par("updated");

because updated is the parameter of Sg1 not of the parent of Sg1.