0

I've a structure DutPlayerArrayElement defined in following lines:

namespace Common
{

namespace Constants {
  const int MaxNumberOfIPAddresses = 10;
  const int NumberOFRFOutputs = 100;
  const int NumberOfPlayers = 100;
  const int SignalFileNameSize = 30;
}

enum AntennaType
{
  Omni = 0,
  Directive,
  Custom,
  InvalidAntenna
};

enum ModulationID
{
  CW = 0,
  SSB,
  LSB,
  AM,
  FM,
  WFM,
  DVBT
};

enum SigFileID
{
  SIG_FILE_ID_ARB12 = 1,
  SIG_FILE_ID_ARB16,
  SIG_FILE_ID_WAV,
  SIG_FILE_ID_TXT  
};

typedef struct
{
  //Basic
  double dLatitude;
  double dLongitude;
  double dAltitude;
  double dHeading;
  float fNorthSudVelocity;
  float fEastOvestVelocity;
  float fVerticalVelocity;
  unsigned int uiIsValid;
  bool bIsDestroyed;
  bool bTxIsOn;
  ModulationID xModulationID;
  SigFileID xSigFileType ;
  char cSigFileName[128];
  bool bLoopPlayback ;
  char cAntennaTableFile[128];
  bool bUseAntGainFactor;
  double dAntGainFactor;
  double dAntennaOrientation;
  double dCarrierFrequency;
  bool bTxIsLOS;
  double dPwr;
  double dAzimuth;
  double dElevation;
  double dDistance;
  char cEntityName[128];
  //char cModulation[2];
}PlayerArrayElement;

typedef struct 
{
  //Basic
  double dLatitude;
  double dLongitude;
  double dAltitude;
  double dHeading;
  float fNorthSudVelocity;
  float fEastOvestVelocity;
  float fVerticalVelocity;
  bool bIsDestroyed;
  unsigned int uiNumAssignedRFOut;
  bool bIsSync;
  unsigned int uiNumRFOutXIP;
  int iAssignedRFOut[Constants::NumberOFRFOutputs];

  unsigned int uiRfGenCount;
  int iIpAddress[Constants::MaxNumberOfIPAddresses];
  unsigned int xPort[10];
  double xCarrierFrequency[10];

  //AntennaType xAntennatype;
  char cAntennaTableFile[128];
  bool bUseAntGainFactor;
  double dAntGainFactor;
  double dAntennaOrientation;
  unsigned int uiNumOfPlayer; 
  PlayerArrayElement xScenarioPlayer[Constants::NumberOfPlayers];
  char cEntityName[128]; 
  unsigned int uiIsValid;
  bool simIsRunning;
} DutPlayerArrayElement;

typedef std::vector<DutPlayerArrayElement> DutPlayers;

}

I also define a typedef std::vector<DutPlayerArrayElement> DutPlayers;

In a Visual studio 2008 library, I declare a class with this vector as member:

class COM_API MyClass
{
public:
  SimComintManager();
  ~SimComintManager() ;

  bool init();
  void runme();


private:

  void setup();

private:

  // ....
  Common::DutPlayers m_xDutPlayers;
  // other structures...
};

in runme method:

void MyClass::runme()
{
  while(m_bScenarioIsRunning)
  {
    if(m_uiIterationCount == 0)
    {
      m_pGen->setRfOutState(0, ON);
    }
    else
    {
      //aggiornare RF scenario in base a SHM attuale
      m_xDutPlayers.clear() ;
      m_xShmReader.getData(m_xDutPlayers) ;
    }
  }

}

ShmReader is a class defined in another library, that uses the same .h file in which vector is defined:

bool Reader::getData( Common::DutPlayers& xDutVector)
{
  Common::DutPlayerArrayElement xEntityArrayElement;
  for(int i = 0; i < m_iNumberOfEntities; i++)
  {
    xEntityArrayElement = m_pxPlayerShmVector->getValue(i);
    if(xEntityArrayElement.uiIsValid == 1)
      m_bSimulationState = xEntityArrayElement.simIsRunning;
      xDutVector.push_back(xEntityArrayElement);
  }
  return true;
}

When I call xDutVector.push_back(xEntityArrayElement); I've an error and program crashes. Visual studio says Microsoft Visual Studio C Runtime Library has detected a fatal error in program.exe and when I click Break button the callstack is in row 161 of vector.h, the _SCL_SECURE_VALIDATE_RANGE row of this piece of code:

_Myt& operator+=(difference_type _Off)
    {   // increment by integer
    _SCL_SECURE_VALIDATE(this->_Has_container());
    _SCL_SECURE_VALIDATE_RANGE(
        _Myptr + _Off <= ((_Myvec *)(this->_Getmycont()))->_Mylast &&
        _Myptr + _Off >= ((_Myvec *)(this->_Getmycont()))->_Myfirst);
    _Myptr += _Off;
    return (*this);
    }

I've googled a bit and I've found this error regarding iterator erasing, but nothing regarding the push_back. What I'm doing wrong and how can I use push_back correctly?

Jepessen
  • 11,744
  • 14
  • 82
  • 149
  • 1
    1) Do you compiled both executable and dll by one compiler? 2) try #pragma pack(push, N) - #pragma pack(pop) at declarations of structures. There may be problem with that. 3) try sizeof() of this structures inside executable and library, are they different? – Arkady May 21 '14 at 22:20
  • 1) Projects are in same solution. I compile them all at once. 2) #I've tried `pragma pack(1)`, I'll try your solution too. 3) I'll let you know asap. Thanks for your help. – Jepessen May 22 '14 at 11:46
  • I're resolved the problem. The cause was the different project configuration for two libraries. One was defined as Dll, while the other as debug multithreaded dll. When configurations were aligned the problem was gone. Thanks for your support. – Jepessen May 23 '14 at 08:53

0 Answers0