Forum: PC-Programmierung Konvertierung string zu String crashed unlogisch


von A. C. (michael1988)


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

von Daniel -. (root)


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 :)

von A. C. (michael1988)


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

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

A. C. schrieb:
> Was ist an managed C++ so schlecht?

Es ist kein C++, und hat nur namentlich damit zu tun. Und es ist äußerst 
irritierend, wenn Leute immer wieder davon sprechen, sie würden in "C++" 
programmieren, wenn sie es letztlich nicht tun, sondern diesen 
.Net-Dialekt nutzen.

von Peter II (Gast)


Lesenswert?

A. C. schrieb:
> Was ist an managed C++ so schlecht?

irgendwie ist es nichts halbes und ganzes. Wenn man .net machen will 
dann ist C# das richtige. Wenn man C++ machen will dann normales C++. 
Beide dinge zu mischen halte ich nicht für sinnvoll weil es komplett 
verschiedene Ansätzte sind.

von Robert L. (lrlr)


Lesenswert?

>lbVorgänge

hast du wirklich umlaute in deinem Sourcecode ???

die Jugend von Heute, unglaublich.. ;-)

von Rainer Hohn (Gast)


Lesenswert?

Robert L. schrieb:
> hast du wirklich umlaute in deinem Sourcecode ???

Sieht wohl so aus ;).

Gibt es realistische Fälle wo das ein Problem werden kann?

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Rainer Hohn schrieb:
> Gibt es realistische Fälle wo das ein Problem werden kann?

Richtige C- oder C++-Compiler akzeptieren so etwas nicht.

Sourcecode ist 7-Bit-ASCII, mit Ausnahme von Kommentaren, String- oder 
char-Konstanten, aber das ist dann auch schon nicht mehr zwingend 
portabel.

von Rainer Hohn (Gast)


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

von Εrnst B. (ernst)


Lesenswert?

Zum Problem zurück:

Ich vermute
gcnew String(char *)
Verursacht das problem, vor allem wenn der char-Pointer nur temporär 
gültig ist.

Versuch mal
  marshal_cppstd.h

und verwende "marshal_as":
1
   String^ managed_name;
2
   managed_name = marshal_as<String^>( name );
3
  ...->Items->Insert(pos , managed_name);

von Rainer Hohn (Gast)


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.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.