Konvertierung string zu String crashed unlogisch

#2962327
Lesenswert?

Hi Leute,
ich hab ein Problem bei der Konvertierung von string nach String.

Will ich in eine Listbox einen string einfügen, muss ich ihn ja erst in 
String konveiteren.

Das klappt auch mit:
1
lbVorgänge->Items->Insert(pos + 1, gcnew String(name.c_str()));

Wenn ich jetzt aber vor dem Umwandeln noch Zeichen vor den string 
einfüge:
1
name.insert(name.begin(), n, ' ');

stürzt das Programm beim Einfügen in die Listbox ab. Mit dem Workaround 
aus dem folgenden Beispiel geht es dann wieder, ist aber unnötig 
umständlich und ich frage mich, wie das passieren kann.

Vielleicht mache ich auch einen einfachen Fehler, aber ich sehe ihn 
nicht.
Danke für jede Antwort!
1
void putNameInListbox(Task* selectedTask, ListBox^ lbVorgänge)
2
{
3
  //Holt einen string aus meiner Klasse "Task" mit der Funktion getTaskName()
4
  string name = aufgabenBaumReferenz->getItem(pos)->getTaskName();
5
  lbVorgänge->Items->RemoveAt(pos);
6
  
7
  //Fügt abhängig n*' ' vor dem string ein
8
  name.insert(name.begin(), n, ' ');
9

10
  //WORKAROUND
11
  String^ strHaha = gcnew String(name.c_str());
12
  
13
  //lbVorgänge->Items->Insert(pos + 1, gcnew String(name.c_str()));
14
  lbVorgänge->Items->Insert(pos , gcnew String(strHaha));
15
}


Viele Grüße
Michael
#2962874
Lesenswert?

A. C. schrieb:
> name.insert(name.begin(), n, ' ');

vermutlich weil du einen Iterator holst und gleich noch den Container,
sprich den String/string modifizierst. Das ist wie i=i++;

Ansonsten gibt es keinen String in C++, es gibt std::string.
Wie es scheint bist du in einer "seltsamen" Umgebung unterwegs.
Wahrscheinclich .. Managed C++ .. Gott behütte :)
#2964365
Lesenswert?

Hi Daniel,

es kracht aber an dieser Stelle.
1
lbVorgänge->Items->Insert(pos , gcnew String(strHaha));

Das insert MUSS ich aber genauso machen, der Iterator wird von "insert" 
an dieser Stelle erwartet.
> name.insert(name.begin(), n, ' ');

Dass es in C++ keinen String gibt weiss ich, deswegen muss ich ja für 
CLI explizit konvertieren. Aber du hast recht, ich habe nicht gesagt 
dass ich unter VS2010 in CLI/C++ programmiere.

Was ist an managed C++ so schlecht?

Danke für deine Antwort,
GRuß Michael
Gast #2964562
Lesenswert?

Danke euch allen für eure Antworten,
jetzt weiss ich in einigen Bereichen schonmal mehr.

Um trotzdem nochmal auf die urspürngliche Frage zurück zu kommen, hat 
jemand da noch ne Idee woher das Problem kommen könnte. Spuckt da 
irgendein garbage collector oder ähnliches rein.

Solche nicht ersichtlichen Fehler möchte ich später eigentlich nicht in 
größeren Projekten haben.

Viele Grüße
Rainer
Gast #2964713
Lesenswert?

Hallo Ernst,

wenn ich eben eine lokale Variable String^ strHaha definiere und dieser 
dann das gcnew(char *) zuweise passiert nichts.

Nur Wenn ich gcnew(char *) direkt in der items->insert() Funktion mache, 
passiert es.

Ich hab nochmal beide Varianten neben einander gestellt.

Problem tritt auf
1
void putNameInListbox(Task* selectedTask, ListBox^ lbVorgänge)
2
{
3
  //Holt einen string aus meiner Klasse "Task" mit der Funktion getTaskName()
4
  string name = aufgabenBaumReferenz->getItem(pos)->getTaskName();
5
  lbVorgänge->Items->RemoveAt(pos);
6
  
7
  //Fügt abhängig n*' ' vor dem string ein
8
  name.insert(name.begin(), n, ' ');
9
  
10
  //lbVorgänge->Items->Insert(pos + 1, gcnew String(name.c_str()));
11
  lbVorgänge->Items->Insert(pos , gcnew String(name.c_str()));
12
}

Workaround: Problem tritt nichtmehr auf
1
void putNameInListbox(Task* selectedTask, ListBox^ lbVorgänge)
2
{
3
  //Holt einen string aus meiner Klasse "Task" mit der Funktion getTaskName()
4
  string name = aufgabenBaumReferenz->getItem(pos)->getTaskName();
5
  lbVorgänge->Items->RemoveAt(pos);
6
  
7
  //Fügt abhängig n*' ' vor dem string ein
8
  name.insert(name.begin(), n, ' ');
9

10
  //WORKAROUND
11
  String^ strHaha = gcnew String(name.c_str());
12
  
13
  //lbVorgänge->Items->Insert(pos + 1, gcnew String(name.c_str()));
14
  lbVorgänge->Items->Insert(pos , gcnew String(strHaha));
15
}

Das gcnew im zweiten Beispiel in der insertfunktion ist natürlich 
unnötig, aber ich habs drin gelassen, damit bei beiden Varianten ein 
gcnew im insert drin ist.

marshall wollte ich auchmal verwenden, aber bei mir wird " 
marshal_cppstd.h" nicht gefunden.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren