String an Funktion übergeben/Funktion gibt String zurück
-
Abend Zusammen,
zunächst einmal, ja ich bin relativ neu hier im Forum, was sich jedoch nur auf das schreiben von Beiträgen bezieht .
Normalerweise komme ich mit Beiträgen recht gut zurecht und kann auch das meiste was ich hier lese anwenden, jedoch stehe ich nun vor einem Problem, worüber die meisten hier wahrscheinlich nur schmunzelnUnd zwar würde ich gerne einer Funktion einen String übergeben, diesen mit TIdEncoderMIME verschlüsseln und als String wieder an das Hauptprogramm übergeben.
Header
//--------------------------------------------------------------------------- #ifndef encodeH #define encodeH //--------------------------------------------------------------------------- string encode(string*); #endif
CPP
//--------------------------------------------------------------------------- #pragma hdrstop #include "encode.h" #include <string.h> #include <vcl.h> #include <conio.h> //--------------------------------------------------------------------------- #pragma package(smart_init) string encode(string enc) { //...code }
(Habe einfach mal alle Libs eingebunden und gehofft das es besser wird^^)
Das geht "natürlich" nicht, da irgendwo "string" doppelt deklariert wird und es auch sonst irgendwo einen Fehler in der Deklarationssyntax steht.
Nun ist die Frage, wie bekomme ich ein Char-Array an eine Funktion übergeben und auch wieder von ihr als Rückgabewert zurück?!
Ich habe dazu jede Menge Code gefunden...nur ist das alles in C....was ich leider nicht vor C++ "gelernt" habe....demnach bin ich nun ziemlich aufgeschmissen und hoffe ihr könnt mir helfen
Schönen Gruß,
Das Schneeflöckchen :3
-
Hallo,
das sind aber Grundlagen der C bzw. C++-Programmierung.
In deinem Header mußt du noch den passenden Header (für string) einbinden:#include <string>
Und da dieser (wie alle Standard-Bibliothekstypen) im Namensraum 'std' liegt, mußt du diesen explizit angeben:
std::string encode(std::string);
(und den * habe ich entfernt, weil deine Funktionsdefinition ja keinen Zeiger benötigt!)
PS: Der Header <string.h> ist für die C-Funktionen (z.B. strcpy, strlen, ...) und hier also überflüssig.
Am besten du schaust bei solchen Problemen in die entsprechenden Referenzen, z.B. http://www.cplusplus.com/reference/ oder http://cppreference.com
Wenn du jedoch den VCL-Datentyp String (AnsiString bzw. UnicodeString) verwenden willst (mit dem die Indy-Komponenten, wie z.B. TIdEncoderMIME, arbeiten), dann reicht es, wenn du 'string' zu 'String' abänderst und den eigenen Header nach der <vcl.h> einbindest, d.h.
#include <vcl.h> #pragma hdrstop #include "encode.h"
(das '#pragma hdrstop' ist für das Vorkompilieren der <vcl.h>, damit der Kompiliervorgang beschleunigt wird)
-
Th69 schrieb:
(und den * habe ich entfernt, weil deine Funktionsdefinition ja keinen Zeiger benötigt!)
Da C keine Referenzen kennt wäre der Ersatz eines Zeigers in C in C++ eigentlich eher eine Referenz. Ich denke in diesem Fall wäre eine konstante Referenz wohl richtig.
std::string encode(const std::string&);
-
Schonmal vielen Dank für die Hinweise
Ich werd mir wohl doch lieber nochmal das ein oder andere Buch durchlesen müssen
Aber mein Plan geht doch nicht so einfach auf...Ich wollte die Funktion ursprünglich in einer externen Unit schreiben, damit ich die Funktion einfach in jeden Code implementieren kann, nur stieß ich dabei auf das Problem, dass die Unit die Indy-Komps nicht erkennt, wenn nicht die
Main.h
in dieencode.h
includiert ist....Gibt es da irgendwelche Möglichkeiten die TIdEncodeMIME auch dort bekannt zu machen?
-
Du mußt den passenden Include angeben:
#include "IdCoderMIME.hpp"
-
Th69 schrieb:
Du mußt den passenden Include angeben:
#include "IdCoderMIME.hpp"
Ja, die Unit ist mir beim stöbern durch die Klassen auch aufgefallen, jedoch bekomme ich beim initialisieren einen Fehler:
Keine Übereinstimmung TIdEncoderMIME::TIdEncoderMIME()
TIdEncoderMIME *IdEnc = new TIdEncoderMIME; tmp=IdEnc->Encode(enc);
Er erkennt mein IdEnc Objekt zwar, jedoch bekomme ich beim compilieren o.g. Fehler....
-
Wie bei alle VCL-Komponenten will der Konstructor einen Owner als Parameter.
Die Fehlermeldung sagt einfach aus, dass es keinen Konstruktor ohne Parameter gibt.
TIdEncoderMIME *IdEnc = new TIdEncoderMIME(0); tmp=IdEnc->Encode(enc);
Sollte gehen. Das Aufräumen nicht vergessen!
-
Achso, also wo man sonst bpsw.
TPanel *neu = new TPanel(Form1);
übergibt man in einer externen Unit einfach
0
als Parameter?!
-
Du kannst auch bei deinem Panel 0 übergeben. Deine Komponente hat dann einfach nur keinen Owner. Das heißt du bist dann auch selbst für das Aufräumen (d.h. Löschen) der Komponente (Instanz) verantwortlich.
-
Achso, bislang habe ich bei der Verwendung einfach ein
delete
hintenrangestellt, auch wenn TForm1 (z.B.) Owner warVielen Dank für die Hilfe
Läuft nun alles einwandfreiLieben Gruß,
snwFlake