From 6a351cb5a2eda6ed60c5cac8ce1f0d2cc981643d Mon Sep 17 00:00:00 2001 From: Marty Kraimer Date: Fri, 20 Mar 2015 16:28:33 -0400 Subject: [PATCH] needed clone instead of copy --- src/easyNTMultiChannel.cpp | 15 ++++++++++----- src/easyNTMultiChannel.h | 1 - test/src/testEasyNTMultiChannel.cpp | 4 ++-- 3 files changed, 12 insertions(+), 8 deletions(-) diff --git a/src/easyNTMultiChannel.cpp b/src/easyNTMultiChannel.cpp index b42e0c4..cd00755 100644 --- a/src/easyNTMultiChannel.cpp +++ b/src/easyNTMultiChannel.cpp @@ -155,8 +155,7 @@ NTMultiChannelPtr EasyNTMultiChannel::get() userTag.resize(numChannel); userTagExists = true; } - valueVector.resize(numChannel); - + shared_vector valueVector(numChannel); for(size_t i=0; iissueGet(); @@ -177,7 +176,7 @@ NTMultiChannelPtr EasyNTMultiChannel::get() UnionConstPtr u = pvUnionArray->getUnionArray()->getUnion(); if(u->isVariant()) { PVUnionPtr pvUnion = pvDataCreate->createPVVariantUnion(); - pvUnion->set(pvField); + pvUnion->set(pvDataCreate->createPVField(pvField)); valueVector[i] = pvUnion; } else { PVUnionPtr pvUnion = pvDataCreate->createPVUnion(u); @@ -242,10 +241,16 @@ void EasyNTMultiChannel::put(NTMultiChannelPtr const &value) try { PVFieldPtr pvFrom = valueVector[i]->get(); PVFieldPtr pvTo = easyPut[i]->getData()->getValue(); - pvTo->copy(*pvFrom); + Type typeFrom = pvFrom->getField()->getType(); + Type typeTo = pvTo->getField()->getType(); + if(typeFrom==typeTo) { + if(typeFrom==scalar || typeFrom==scalarArray) { + pvTo->copy(*pvFrom); + } + } easyPut[i]->issuePut(); } catch (std::exception e) { - string message = channelNames[i] + e.what(); + string message = channelNames[i] + " " + e.what(); throw std::runtime_error(message); } } diff --git a/src/easyNTMultiChannel.h b/src/easyNTMultiChannel.h index f8ff34a..6aec2f9 100644 --- a/src/easyNTMultiChannel.h +++ b/src/easyNTMultiChannel.h @@ -84,7 +84,6 @@ private: epics::pvData::PVDataCreatePtr pvDataCreate; std::vector easyGet; std::vector easyPut; - epics::pvData::shared_vector valueVector; epics::pvData::shared_vector severity; epics::pvData::shared_vector status; epics::pvData::shared_vector message; diff --git a/test/src/testEasyNTMultiChannel.cpp b/test/src/testEasyNTMultiChannel.cpp index 793d77a..9d8c2e3 100644 --- a/test/src/testEasyNTMultiChannel.cpp +++ b/test/src/testEasyNTMultiChannel.cpp @@ -54,10 +54,10 @@ static void testGood(EasyPVAPtr const &easyPVA) EasyNTMultiChannelPtr easy = EasyNTMultiChannel::create( easyPVA,pvNames,structure); NTMultiChannelPtr nt = easy->get(); - cout << "initial\n" << nt->getPVStructure() << endl; for(size_t numtimes=0; numtimes<3; ++numtimes) { PVUnionArrayPtr pvValue = nt->getPVStructure()-> getSubField("value"); + cout << "initial\n" << nt->getPVStructure() << endl; shared_vector valueVector = pvValue->reuse(); for(size_t i=0; ireplace(freeze(valueVector)); easy->put(nt); nt = easy->get(); - cout << "after put\n" << nt->getPVStructure() << endl; } + cout << "final\n" << nt->getPVStructure() << endl; } catch (std::runtime_error e) { cout << "exception " << e.what() << endl; isOk = false;