Как исправить ошибки отсутствия совпадающей функции при вызове и » не был объявлен в этой области

#omnet #inet

#omnet #inet

Вопрос:

Я пытаюсь создать новое UDP-приложение, с помощью которого я могу управлять процессом генерации пакетов и процессом отправки пакетов, т. Е. у меня есть отдельные параметры для генерации пакетов и интервала отправки.

Когда я запускаю код, получаю следующие ошибки:

inet / applications /udpapp /UdpOwnApp.cc:134:29: ошибка: нет функции сопоставления для вызова очереди ‘omnetpp::cQueue::insert(const inet::IntrusivePtrinet::ApplicationPacketamp;)’.вставка (полезная нагрузка); ^ inet/applications/udpapp /UdpOwnApp.cc:157:15: ошибка: ‘полезная нагрузка’ не была объявлена в этой области queue.pop(полезная нагрузка); ^~~~~~~

Фрагмент кода приведен ниже:

 void UdpOwnApp::generatePacket()
{
        const autoamp; payload = makeShared<ApplicationPacket>();
        payload->setChunkLength(B(par("messageLength")));
        payload->setSequenceNumber(numGenerate);
        payload->addTag<CreationTimeTag>()->setCreationTime(simTime());
        queue.insert(payload);
        simtime_t d = simTime()   par("generateInterval");
        if (stopTime < SIMTIME_ZERO || d < stopTime) {
            selfMsg->setKind(GENERATE);
            scheduleAt(d, selfMsg);
        }
        else {
            selfMsg->setKind(STOP);
            scheduleAt(stopTime, selfMsg);
        }
}
void UdpOwnApp::sendPacket()
{
    std::ostringstream str;
    str << packetName << "-" << numSent;
    Packet *packet = new Packet(str.str().c_str());
    if(dontFragment)
        packet->addTag<FragmentationReq>()->setDontFragment(true);
    queue.pop(payload);
    packet->insertAtBack(payload); 
    L3Address destAddr = chooseDestAddr();
    emit(packetSentSignal, packet);
    socket.sendTo(packet, destAddr, destPort);
    numSent  ;
}
  

Кто-нибудь подскажет, верен ли код и как устранить ошибки?

Спасибо

Ответ №1:

Объявление insert() выглядит следующим образом:

 virtual void insert(cObject *obj);
  

Поэтому нельзя передать другой объект, который cObject или производный класс. Вы можете использовать экземпляр Packet , поскольку он наследуется от cObject . Таким образом, код может выглядеть следующим образом:

 void UdpOwnApp::generatePacket() {
    const autoamp; payload = makeShared<ApplicationPacket>();
    payload->setChunkLength(B(par("messageLength")));
    payload->setSequenceNumber(numGenerate);
    payload->addTag<CreationTimeTag>()->setCreationTime(simTime());

    std::ostringstream str;
    str << packetName << "-" << numSent;
    Packet *packet = new Packet(str.str().c_str());
    packet->insertAtBack(payload);
    queue.insert(packet);
    simtime_t d = simTime()   par("generateInterval");
    if (stopTime < SIMTIME_ZERO || d < stopTime) {
       selfMsg->setKind(GENERATE);
       scheduleAt(d, selfMsg);
    } else {
       selfMsg->setKind(STOP);
       scheduleAt(stopTime, selfMsg);
    }
}

void UdpOwnApp::sendPacket() {
    if (queue.isEmpty()) {
        // no packets in queue
    } else {
        cObject * obj = queue.pop();
        Packet * packet = dynamic_cast<Packet*>(obj);
        if (packet) {
            if (dontFragment)
                packet->addTag<FragmentationReq>()->setDontFragment(true);
            L3Address destAddr = chooseDestAddr();
            emit(packetSentSignal, packet);
            socket.sendTo(packet, destAddr, destPort);
            numSent  ;
        }
    }
}
  

Комментарии:

1. Спасибо Ежи, это устраняет ошибки, но когда я запускаю omnetpp.ini, пакеты не генерируются, и поэтому пакеты вообще не отправляются. Количество сгенерированных и отправленных пакетов равно 0. Не могли бы вы подсказать, почему?

2. Ежи, я протестировал это с существующими файлами ned и omnetpp.ini для sensornetwork. Просто добавлен параметр для генерации пакетов в файле «ini». Сработает ли это, если я укажу имя файла только потому, что я не могу создать post с такими длинными кодами, и эти коды уже есть в INET?

3. Если бы вы могли предложить мне здесь, это было бы лучше. Спасибо

4. Вам обязательно следует добавить новый вопрос с вашей проблемой. Причины: 1) Вы не написали, почему вы считаете, что количество сгенерированных пакетов равно 0 — предоставленный код не содержит никакой статистики для записи этого значения. 2) Вы не написали, когда и где вы вызываете generatePacket() и sendPacket() . 3) Вы не написали, какие параметры вы добавили и какие значения вы установили omnetpp.ini . 4) INET не содержит вид GENERATE — вы не объяснили значение GENERATE , а также как обрабатывается сообщение с таким видом. Без этой информации никто не сможет вам помочь.