Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Vector mit falschem Wert

12 views
Skip to first unread message

Heinz-Mario Frühbeis

unread,
Jul 3, 2017, 5:10:04 PM7/3/17
to
In einem Header hsections.h habe ich folgendes:


struct s_Apps{
int Index;
std::string Caption;
s_Apps(){
this->Index = -1;
this->Caption = "";
}
};

std::vector < s_Apps > mVecApps;

In einer cpp (der Vector wird hier gefüllt):

#include "hsections.h"

for( int i = 0; i < (int) retVec.size(); i++ ) {
...
...
s_Apps a;
a.Index = nIndex;
a.Caption = nCaption;
mVecApps.push_back(a);
}

for ( int i = 0; i < (int) mVecApps.size(); i++ ) {
cout << "TESTEN ------------------- " << i << " -- " <<
mVecApps[i].Caption
<< " -- " << mVecApps[i].Index << endl;
}

In einer anderen cpp (hier wird der Vector abgefragt):

#include "hsections.h"

for ( int i = 0; i < (int) mVecApps.size(); i++) {
cout << "TEST IDA BASE -- " << i << " -- " << mVecApps[i].Caption << "
-- "
<< mVecApps[i].Index << endl;
}


Es wird beim Vector nur angehangen, später nichts editiert...

Das ist die Ausgabe:

TESTEN ------------------- 0 -- IDABrowse -- 0
TESTEN ------------------- 1 -- IDAEdit -- 1
TESTEN ------------------- 2 -- IDACom -- 2

TEST IDA BASE -- 0 -- 9� -- 20408112 // hier variiert es, aber immer hier
TEST IDA BASE -- 1 -- IDAEdit -- 1
TEST IDA BASE -- 2 -- IDACom -- 2

Warum?! Sehe ich den Wald vor lauter Bäumen nicht?

Ich kann auch die erste Ausgabe mit "TESTEN -------------------" ganz
ans Ende von main stellen, aber da ist immer alles ok...

EDIT----

Ich habe das Struct geändert.

struct s_Apps{
int tmp_int;
int app_index;
std::string tmp_str;
std::string app_cap;
s_Apps(){
this->app_index = -1;
this->app_cap = "";
}
};

Mit diesem Struct läuft das! Aber was ist denn am ursprünglichen Struct
falsch?! Zu wenige Members? Oder was?

BTW: Ich habe auch mal "spasseshalber" das probiert:
a.Caption = "TEST" + nCaption;
Und da die Ausgabe war nicht mehr TEST IDA BASE -- 0 -- 9� -- 20408112,
sondern TEST IDA BASE -- 0 -- TESTIDABrowse -- 20408112

Wieso?!

H-MF

Heinz-Mario Frühbeis

unread,
Jul 4, 2017, 8:30:03 AM7/4/17
to
Am 03.07.2017 um 20:57 schrieb Heinz-Mario Frühbeis:

Es geht immer noch um das selbe Programm...

Es besteht ja aus (mittlerweile) drei shared libs und einigen bin's, die
diese nutzen. Eine lib ist IDA..., die hat z. Bsp. eine
Schnittstelle/Funktion, welche std::string als Parameter hat.

Das lief/läuft auch wunderbar, bis ich gestern eine Funktion bei IDA
hinzugefügt habe, auch mit std::string als Parameter (zwei Mal)...

In der bin, einem Programm, das das nutzt:

hSections.h:

std::string mIdentFrom, mIdent;

IDA *mIDA = NULL;
XIDA *mXIDA = NULL;


(In Reihenfolge des Zugriffs....)
main:

#include "hsection.h"
#include "secbase.cpp"

int main(int argc, char *argv[]){
if(argc < 3){return 1;}
mIdentFrom = argv[1];
mIdent = argv[2];
IDA nIDA(mIdentFrom, mIdent); // alles bestens
mXIDA_API = &nXIDA_API;
mIDA = &nIDA;
mXIDA = mIDA->_XIDA();
...
SecBase_Init();
}

secbase.cpp:

#include "hsection.h"

void SecBase_Init(){
...
mXIDA_API->SetTaskInfCallback(mIdentFrom, mIdent, &TaskInf); // kein
Problem mit den Ident-Strings
...
}

secbase_ev.cpp:

#include "hsection.h"

void btnIDA_Click(){
std::string nStr = mIDA->GetUserName(mIdentFrom, mIdent); // [1]
}

[1]
Das ist, was ich gestern neu hinzugefügt habe...
Aber ab da terminierte das Programm immer mit einem Fehler (von DBus)...
Darauf hin habe ich zuerst bei meinen DBus-Funktionen gesucht, aber
nichts falsches gefunden...
Dann habe ich mir de Ident-Strings angeschaut... Treffer, mIdentFrom war
korrumpiert! Anstatt z. Bsp. IDABrowse als Wert, gab es bei btnIDA_Click
dann irgendwelche kryptische Zeichen (Pik-As und so'n "Kram" WIMRE).
Aber *nur* bei mIdentFrom und *nur* in btnIDA_Click()! mIdent ging
tadellos...

Hier würde mich mal wirklich interessieren, wieso _eine_ String-Variable
korrumpiert werden kann...und nicht beide.

Da ich direkt keine Lösung fand für dieses Problem, habe ich in der lib
IDA die Schnittstelle (mal) geändert und von std::string als Parameter
nach const char* geändert...

Und wumms, alles bestens!

Wieso ist das so?

Ich meine, die libs liegen im selben Prozess-Raum...
Ist das irgendein undefiniertes C++-Verhalten für/mit std::string, oder
wie kann man sich das erklären?

Des weiteren:
Kann es sein, ich habe es jetzt (noch) nicht getestet, das das mit int
eventuell auch der Fall sein kann, und das man besser auf unsigned int
wechselt?

H-MF

Markus Schaaf

unread,
Jul 4, 2017, 10:30:03 AM7/4/17
to
Am 04.07.2017 um 11:59 schrieb Heinz-Mario Frühbeis:

> Es geht immer noch um das selbe Programm...
> Das lief/läuft auch wunderbar, bis ich gestern eine Funktion bei IDA
> hinzugefügt habe,

Ja, es lief "wunderbar" in dem Sinne, dass es wie durch ein Wunder nicht
abstürzte. Du hast irgendwelche Speicherkorruption durch irgendwelche
Fehler in Deinem Programm. Die Effekte, die Du beobachtest, sind
zufälliger Natur und haben mit den eigentlichen Fehlern nicht direkt zu
tun. Du hast beim Programmierenlernen evtl. zu große Schritte gemacht.

MfG

Heinz-Mario Frühbeis

unread,
Jul 5, 2017, 2:30:03 PM7/5/17
to
Welchen Fehler soll ich denn gemacht haben, wenn ich eine Variable als
std::string definiere?
0 new messages