Problem bei Stringweitergabe
-
Hallo,
ich habe ein Konsolenprogramm geschrieben in C, jetzt wollte ich eine GUI dazu basteln, soweit auch geklappt, jedoch hängt es jetzt am Speicherortstring.
Mit FolderBrowserDialog() und textBox1->Text = dlg->SelectedPath; bekomme ich auch ein String für den Speicherordner. Jedoch ist dies ein "System::string ^"
Umgewandelt habe ich mit Hilfe von http://www.c-plusplus.net/forum/158664
char *TEST; TEST=StringConvA(textBox1->Text); sysani( System::Convert::ToDouble(maskedTextBox1->Text), System::Convert::ToDouble(maskedTextBox2->Text), System::Convert::ToDouble(maskedTextBox3->Text), System::Convert::ToDouble(maskedTextBox4->Text), System::Convert::ToDouble(maskedTextBox5->Text), System::Convert::ToDouble(maskedTextBox16->Text), System::Convert::ToDouble(maskedTextBox15->Text), System::Convert::ToDouble(maskedTextBox14->Text), System::Convert::ToDouble(maskedTextBox13->Text), System::Convert::ToDouble(maskedTextBox12->Text), System::Convert::ToDouble(maskedTextBox66->Text), System::Convert::ToDouble(maskedTextBox65->Text), TEST );
und routine sieht vereinfacht so aus für den String
void sysani(float a,float b, ... ,char *Speicher) char *Speicher_aaa=Speicher + "\\Teil1.aaa"; char *Speicher_bbb=Speicher + "\\Teil2.bbb"; fs = fopen(Speicher_aaa, "w"); . . .
für den char* benötige ich jedoch noch die Korrektur wegen Escapesequnzen
und ich bekomme den Fehlererror C2678: Binärer Operator '+': Es konnte kein Operator gefunden werden, der einen linksseitigen Operanden vom Typ 'char *' akzeptiert (oder keine geeignete Konvertierung möglich)
Kann mir jemand helfen meinen Speicherort jetzt richtig zu erstellen ?
-
char erlaubt keine Addition.
char ist keine Klasse mit Memberfunktionen und Operatoren.
Wenn du Strings addieren willst, solltest du die string-Klasse aus der STL verwenden.
(Edit: oder eine der anderen zahlreichen String-Klassen )
-
ahh, okay...
std:string auch nicht ?Es konnte kein Operator gefunden werden, der einen linksseitigen Operanden vom Typ 'std::string *' akzeptiert (oder keine geeignete Konvertierung möglich)
wie krieg ich am elegantesten meine \ von der Textbox zu \\ für fopen ?
EDIT
char *Speicher_aaa; strcpy (Speicher_aaa,Speicher); strcpy (Speicher_aaa,"\\Teil1.aaa");
will auch nicht
error C2664: 'strcpy': Konvertierung des Parameters 2 von 'std::string *' in 'const char *' nicht möglich
ich kapiers einfach nicht was da jetzt das Problem ist ....
-
Belasse doch den Text in der Stringklasse, die "textBox1->Text" hat und übergib es in diesem String an deine Funktion "sysani".
Und erst wenn du es mit fopen öffnen willst, konvertierst du es nach "const char *".
-
tegg schrieb:
char *Speicher_aaa; strcpy (Speicher_aaa,Speicher); strcpy (Speicher_aaa,"\\Teil1.aaa");
Ganz böser Fehler!
mit *char Speicher_aaa reservierst du noch keinen Speicher für deine Variable. Du erzeugst lediglich einen Zeiger, der aber auf einen unbestimmten Platz im Speicher zeigt. Bei der Verwendung von strcpy dürfte es ordentlich rummsen
-
tegg schrieb:
char *Speicher_aaa; strcpy (Speicher_aaa,Speicher); strcpy (Speicher_aaa,"\\Teil1.aaa");
Ich korrigiere das nur mal fix, damit du was draus lernst. Dennoch ist dieses Speichergepfriemel in deinem Anwendungsfall absolut nicht nötig.
// Anzahl der Zeichen in [b]Speicher [/b]ermitteln int iLengthSpeicher = strlen( Speicher ); // [b]Speicher_aaa[/b] anlegen und benoetigte Speichermenge allokieren char *Speicher_aaa = new char[ iLengthSpeicher + 1 ]; // Bestimmte Anzahl an Zeichen von [b]Speicher [/b]nach [b]Speicher_aaa[/b] kopieren strncpy( Speicher_aaa, Speicher, iLengthSpeicher ); // Nullterminierung setzen ( Abschluss der Zeichenkette ) Speicher_aaa[ iLengthSpeicher ] = 0;
Edit: Löschen von Speicher_aaa mit delete [] Speicher_aaa; hinterher nicht vergessen
Aber wie gesagt: Das brauchst du hier nicht, das ist C-UrschleimVerwende die ursprüngliche String-Klasse solange es eben geht.
-
It0101 schrieb:
Belasse doch den Text in der Stringklasse, die "textBox1->Text" hat und übergib es in diesem String an deine Funktion "sysani".
Und erst wenn du es mit fopen öffnen willst, konvertierst du es nach "const char *".
und wie setze ich das um ?
-
Das StringConvertA am Anfang lässt du weg.
Stattdessen uebergibst du direkt "textBox1->Text" an deine Funktion sysani
und zwar als const-Referenz.Referenz, weil du dann nicht mit Pointern arbeiten musst und eben auch keine Kopie der Variable anlegst und const weil du nicht vorhast, deinen Text in der Funktion zu ändern sondern ihn einfach nur benutzen willst.
void sysani( float a, float b, ... , const MEINE_STRING_KLASSE &text ) { MEINE_STRING_KLASSE speicher_aaa = text + "\\Teil1.aaa"; MEINE_STRING_KLASSE speicher_bbb = text + "\\Teil2.aaa"; char *filename = StringConvA( speicher_aaa ); FILE *fs = fopen( filename , "w" ); ... }
PS: wie MEINE_STRING_KLASSE in der MFC heißt musst du schon selber rausfinden. Ist eben die Stringklasse, auf der auch textBox1->Text basiert.
-
ein System::String ^
error C2440: 'Initialisierung': 'StringConvA' kann nicht in 'char *' konvertiert werden 1> Kein benutzerdefinierter Konvertierungsoperator verfügbar, der diese Konvertierung durchführen kann, oder der Operator kann nicht aufgerufen werden
oh man...was ist denn da jetzt was und warum sind Buchstaben keine Buchstaben...das ist so zum brechen... C ist vielleicht uralt aber funktioniert wenigstens, da ist ein Buchstabe ein Buchstabe
-
Vergiss die Funktion... StringConvA. Das "^" hätte mich gleich stutzig machen müssen.
Das ist C# nicht C++...
Das braucht uns nicht wundern, dass der Compiler das nicht frisst
-
Du hast kein Konsolen-Programm in C geschrieben, sondern in C++/CLI! Das macht immer noch keinen Sinn:
http://blog.kalmbach-software.de/de/2010/03/05/ccli-und-winforms-macht-keinen-sinn/
-
Ich vermute, er hat sich bei C++/CLI einfach nur verklickt. Er will schon C/C++...
Aber die Funktion, die er sich da rausgesucht hat, ist natürlich mitnichten für C++ geeignet
-
wie denn das jetzt ?
ich hab doch ein C++ Projekt gemacht...void sysani(....,const System::String ^Speicher) System::String ^Speicher_aaa= Speicher +"\\Teil.aaa"; char* filename = (char*)(void*)Marshal::StringToHGlobalAnsi(Speicher_aaa); fs = fopen(filename, "w");
so klappt das kompilieren, jedoch stimmen dann die \\ noch nicht und es kommt zum Fehler beim Ausführen
-
Jochen Kalmbach schrieb:
Du hast kein Konsolen-Programm in C geschrieben, sondern in C++/CLI! Das macht immer noch keinen Sinn:
http://blog.kalmbach-software.de/de/2010/03/05/ccli-und-winforms-macht-keinen-sinn/die sysani ist mal ein konsolenprogramm gewesen...
-
tegg schrieb:
wie denn das jetzt ?
[cpp]void sysani(....,const **System::String ^**Speicher)
*System::String ^Speicher_aaa= Speicher +"\\Teil.aaa";
char filename = (char)(void)Marshal::StringToHGlobalAnsi(Speicher_aaa);
fs = fopen(filename, "w");
[/cpp]Die fettmarkierten Dinger sind aber C#-Code
-
muss ich jetzt die ganze klick-kacke neu zusammenbauen ? oder kann ich das irgendwie konvertieren ? Aber in meinen Eigenschaften ist es ein C/C++ Programm....
ich schreib jetzt mal den string in eine datei und schau mal was da rauskommt
-
tegg schrieb:
void sysani(....,const System::String ^Speicher) System::String ^Speicher_aaa= Speicher +"\\Teil.aaa"; char* filename = (char*)(void*)Marshal::StringToHGlobalAnsi(Speicher_aaa); fs = fopen(filename, "w");
so klappt das kompilieren
Also wenn er sowas "System::String ^" übersetzen kann, dann hast du höchstwahrscheinlich ein "C++/CLI" Projekt angelegt. Ich kenne mich zwar in der MFC nicht aus, aber ich habe so meine Zweifel, dass es dort diese Konstruktion "System::String ^" gibt...
Die Experten mögen mich korrigieren, wenn ich falsch liege.
-
hmm...also Problem ist die char *filname ist einfach nur ein "H"
-
Zeig mal deinen Code. Was hast du denn jetzt genau gemacht?
Edit: Welche Art von Projekt hast du denn jetzt erzeugt?
-
Es ist ein C++/CLI Projekt. Das sieht man an den Einstellungen: "Common Language Runtime Support": steht auf jedefall nicht auf "None"...