
problem to fill a combination of containers
This program compiles, runs and prints expected output:
#pragma warning (disable: 4786)
#include <vector>
#include <set>
#include <iostream>
#include <stdlib.h>
using namespace std;
struct sequencedTime {
int plane;
int time;
public:
bool operator<(const sequencedTime & st) const {
return (time < st.time);
}
Quote:
};
int main()
{
const int runwayNum = 1;
const int indivSize = 10;
int _runways[indivSize];
{
for (int i = 0; i < indivSize; ++i)
{
_runways[i] = 1;
}
}
vector< set<sequencedTime> >
sequencedTimes(runwayNum,set<sequencedTime>());
int * times = new int[indivSize];
for(int i=0; i<indivSize; i++)
{
int time = rand();
times[i] = time;
sequencedTime seqTime = {i+1,time};
int runwayLabel = _runways[i];
pair<set<sequencedTime>::iterator,bool> result =
(sequencedTimes[runwayLabel-1]).insert(seqTime);
}
delete[] times;
{
for (int i = 0; i < sequencedTimes.size(); ++i)
{
cout << "Set " << i << endl;
set<sequencedTime>& s = sequencedTimes[i];
for (set<sequencedTime>::iterator it = s.begin(); it !=
s.end(); ++it)
{
cout << "(" << it->plane << "," << it->time << ")" <<
endl;
}
}
}
return 0;
Quote:
}
I believe it is an accurate enough representation of your logic. Look
for your problem elsewhere. I suspect you have a heap corruption
somewhere before this code executes, which just happens to manifest
itself here.
Oh, and you cannot use <= in your operator<() - it is not a strict weak
ordering. One of the requirements on the predicate is that for any a and
b, if (a < b) then !(b < a), but this will be violated if you use <= and
happen to have equal times.
--
With best wishes,
Igor Tandetnik
"For every complex problem, there is a solution that is simple, neat,
and wrong." H.L. Mencken
Quote:
> > > > What exactly does "fail" mean here? It crashes? The element does
not
> > get
> > > > inserted? Something else?
> > > It means the program crashes on this insertion instruction with a
> > > 'cannot read memory' message.
> > Show some code that reproduces the problem. If num is indeed within
> > bounds, I don't see any reason for a crash.
> Here is my actual code. I hope everything relevant is here. Otherwise
> do not hesitate to ask me for more details.
> vector< set<sequencedTime> >
> sequencedTimes(runwayNum,set<sequencedTime>());
> int * times = new int[indivSize];
> for(int i=0; i<indivSize; i++) {
> int earliest =
(_ptrFleet->GetAircraftWithIndex(i))->GetEarliestTime();
Quote:
> int latest =
(_ptrFleet->GetAircraftWithIndex(i))->GetLatestTime();
Quote:
> int time = earliest + (indiv->_proportions)[i] *
> (latest-earliest);
> times[i] = time;
> sequencedTime seqTime = {i+1,time};
> int runwayLabel = (indiv->_runways)[i];
> pair<set<sequencedTime>::iterator,bool> result =
> (sequencedTimes[runwayLabel-1]).insert(seqTime);
> }
> 'runwayNum' is equal to 1
> 'indivSize' is equal to 10
> They are arguments given to the program.
> 'earliest' and 'latest' are also data input to the program.
> The arrays '_runways' and '_proportions' are of size 10 ('indivSize')
> and contain the following values before entering the 'for' loop.
> [runways] 1 1 1 1 1 1 1 1 1 1
> [(aircraft)/proportion] (1)/0.074 (2)/0.000 (3)/0.057 (4)/0.033
> (5)/0.031 (6)/0
> .075 (7)/0.033 (8)/0.086 (9)/0.079 (10)/0.051
> In the last execution, the first 'seqTime' is {1,160} and is inserted
> ok and the second is {2,195} and makes the program crashes.
> The 'sequencedTime' element is entirely defined as following:
> struct sequencedTime {
> int plane;
> int time;
> public:
> bool operator<(const sequencedTime & st) const {
> return (time <= st.time);
> }
> };
> Using '<' or '<=' does not make a difference in the program's
> behavior. That is it crashes at the second insertion with a 'cannot
> read the memory' message.
> I've done something pretty similar earlier in my program that works
> with a vector of vector of int. Here is the code for this case:
> vector< vector<int> > tmpSequences(runwayNum,vector<int>());
> int * runways = new int[indivSize];
> for(int i=0;i<indivSize;i++) {
> int planeLabel = tmpSeq[i];
> int runwayLabel = (rand()%runwayNum)+1;
> runways[planeLabel-1] = runwayLabel;
> tmpSequences[runwayLabel-1].push_back(planeLabel);
> }
> Again 'runwayNum' is equal to 1 and 'indivSize' to 10 and 'tmpSeq' is
> an array of length 10 ('indivSize') that can be such as 3 4 5 1 7 9 6
> 2 10 8
> Thanks to all of you for your help.
> Hlne.