views:

100

answers:

2

hi,

I have two base structures like following :

struct stuSectionProperties
{

    int Field1; // Row | BoxNo   | SplitterNo
    int Field2; // Col | Adapter |     -
    double Latitude;
    bool IsEast;
    int Band;
    int CableNo;
    SDP::Global::enuSections::Type Section;

    stuSectionProperties()
    {
        this->Field1 = -1;
        this->Field2 = -1;
        this->Latitude = -1;
        this->Band = -1;
        this->Section = SDP::Global::enuSections::None;
        this->CableNo = -1;
    }
    const char* toStr()
    {
        return ((QString) (QString::number(this->Field1) + " , " + QString::number(this->Field2) + " , " + QString::number(Latitude) + " , " + QString::number(IsEast) + " , " + QString::number(Band) + " , "
                        + QString::number((int) Section) + QString::number((int) CableNo))).toStdString().c_str();
    }
};

and

struct stuSearchResult
{
    stuSectionProperties MyData;
    QList<stuSectionProperties> Connections;

    stuSearchResult()
    {
        this->MyData.Field1 = -1;
        this->MyData.Field2 = -1;
        this->MyData.Latitude = -1;
        this->MyData.Band = -1;
        this->MyData.Section = SDP::Global::enuSections::None;
        this->MyData.CableNo = -1;

        stuSectionProperties stuDummy;
        stuDummy.Band=-1;
        stuDummy.CableNo=-1;
        stuDummy.Field1=-1;
        stuDummy.Field2=-1;
        stuDummy.IsEast=-1;
        stuDummy.Latitude=-1;

        stuDummy.Section= SDP::Global::enuSections::None;
        this->Connections.append(stuDummy);

    }
    const char * toStr()
    {
        return ((QString) (QString::number(this->MyData.Field1) + " , " + QString::number(this->MyData.Field2) + " , " + QString::number(this->MyData.Latitude) + " , " + QString::number(this->MyData.IsEast) + " , " + QString::number(this->MyData.Band) + " , "
                        + QString::number((int) this->MyData.Section) + QString::number((int) this->MyData.CableNo)) + " , " + QString::number(this->Connections[0].Field1) + " , " + QString::number(this->Connections[0].Field2) ).toStdString().c_str();
    }
};

whenever I try to create an instance out of second the structure and then try to call its toStr() member I'll get an erro which is saying that these lines have some issues :

+ QString::number(this->Connections[0].Field1) + " , " + QString::number(this->Connections[0].Field2)

can you please tell me whats my problem exactly? regards.

+1  A: 

the assert error says Connections doesn't have the element you referenced. if you print out Connections.size() how many elements does it say the list contains?

returning string.c_str() could be a potential memory issue, as it's returning a pointer to memory that has been freed.

in c++, custom printing is often done by overloading the stream operator in your class:

friend std::ostream &operator<<(std::ostream &os, const myClass &c)
{
  return os << c.some << c.val;
}

...

cout << myObj << endl;

...

strstream ss;
ss << "cool: " << myObj << " " << 55;
string s = ss.str();

you could also just pass a reference to a string object in your toStr function:

makeString(string &s)
{
  ...
  s = qstr.toStdString();
}

string s;
makeString(s);
jspcal
thanks for you answer but my casting(var to string) doesn't have any issues.
austin powers
c_str() will point to invalid (freed) memory
jspcal
A: 

Yes the code has many issues

  • Normally people don't write "this->x"; they just write "x"; the "this->" is implicit inside methods
  • As the other answer pointed out, c_str() points to invalid memory here

However, the Connections list should contain at least one element because the constructor appends it there. I think it would help if the poster would also post the code to allocate the structure. It looks like the constructor doesn't get called OR there is other code that clears the Connections list before toStr() is actually called.

antti.huima