Variabel über Funktion übergeben
-
Bei C++ bitte so gut wie möglich Pointer vermeiden
GAHAHA ich wollte es nur mal sagen
ma schaun wer sich da aufregt 
Hierfür sind Pointer aber etwas ... umständlich
Das einfachste ist es ein call by reference zu machen

Mir ist jetzt auch noch nicht ganz klar was du mitNun will ich, das es mir den übergabe Wert "HALLO" ausgibt. Wie mache ich das?
sagen willst
soll das "HALLO" in der Main-Funktion ausgeben?wenn ja:
bool Übergeben(string &uebergabeWert, string &version);bool Funktionen::Übergeben(string &uebergabeWert, string &version) { std::cout << version << endl; uebergabeWert = "HALLO"; }int main() { string WERT; Funktionen::übergeben(WERT, version); std::cout << WERT << endl; return 0; }Wenn du mit pointer arbeiten möchtest, musst du erst ein new-befehl machen, da bei
string* WERT;noch kein Speicher reserviert wurde. Schau dir mal bezüglich Pointer wirklich mal paar tutorials an. bestimmt gibt es auf c-plusplus.net welche

p.s.: Das was ich jetzt geschrieben habe ist eine von mehreren möglichkeiten

-
Das heißt "Variable" und nicht "Variabel".
PuTTX schrieb:
Ich habe eine Funktion "übergeben" ( definiert in seperatem header unc cpp file)
bool Funktionen::Übergeben(string *uebergabeWert, string &version)Was ist "Funktionen"? Ein Namensraum? Das Ü ist hier nicht erlaubt.
PuTTX schrieb:
Implementierung der Funktion in .cpp
bool Übergeben(string* uebergabeWert, string &version); { std::cout << version << endl; uebergabeWert = "HALLO" }Das Semikolon hinter ) ist da falsch.
Wenn du mit string std::string meinst, ist die Zuweisung in der letzten Zeile falsch. Denn uebergabeWert ist ein Zeiger auf ein std::string-Objekt. In so einem Zeiger kannst Du Dir nur Adressen von std::string-Objekten merken, sonst nichts. Wenn Du möchtest, dass in dem std::string-Objekt, worauf der Zeiger zeigt, die Zeichenkette HALLO gespeichert werden soll, dann musst Du den Zeiger dereferenzieren*uebergabeWert = "HALLO";und mit einem Semikolon abschließen.
PuTTX schrieb:
Nun will ich, das es mir den übergabe Wert "HALLO" ausgibt. Wie mache ich das? Ich habe noch etwas Probleme mit Pointern und all diesen Referenzen.
main() { string* WERT functions.übergeben(WERT, version) }Bei Deiner main-Funktion fehlt der Rückgabetyp int.
Bei der Definition von WERT fehlt ein Semikolon.
Du hast WERT auch nicht initialisiert. Es wäre also ein Zeiger, dessen aktueller (schrottiger) Wert nicht benutzt werden darf.
Für "functions" sehe ich keine Deklaration.Vermeide aus dem Kopf runtergetippten C++ Code. Zeige echten, vollständigen, aber kurzen Code, den Du schonmal durch einen Compiler gejagt hast. Aber viel wichtiger: Schnapp Dir erstmal ein gutes C++ Buch und lerne. Du kannst nicht erwarten, dass Dir in einem Forum C++ von Grund auf beigebracht wird. (!)
kk
-
bool Funktionen::Uebergeben(string & uebergabeWert, string const & version) { // | ~ Referenz, ist ~~~~~ Wert wird nicht geändert. // | leichter zu verwenden // \-> Kein Ü verwenden! Besser Ue! std::cout << version << endl; uebergabeWert = "HALLO"; }
-
krümelkacker schrieb:
Das heißt "Variable" und nicht "Variabel".
Schweizerdeutsch

krümelkacker schrieb:
Was ist "Funktionen"? Ein Namensraum? Das Ü ist hier nicht erlaubt.
Funktionen ist eine Klasse. Ist nur Beispielcode, das ganze wird in einem grösseren Projekt verwendet. Habs nur schnell schnell hier reingepostet.
krümelkacker schrieb:
Das Semikolon hinter ) ist da falsch
Du schaust den falschen Code an, hab ihn ja neu gepostet.
krümelkacker schrieb:
Wenn Du möchtest, dass in dem std::string-Objekt, worauf der Zeiger zeigt, die Zeichenkette HALLO gespeichert werden soll, dann musst Du den Zeiger dereferenzieren
*uebergabeWert = "HALLO";und mit einem Semikolon abschließen.
Also so: ?
string uebergabewert; *uebergabeWert = "HALLO";krümelkacker schrieb:
Du hast WERT auch nicht initialisiert. Es wäre also ein Zeiger, dessen aktueller (schrottiger) Wert nicht benutzt werden darf.
Für "functions" sehe ich keine Deklaration.wieder mit :
string *Wert = "js"?
-
TTS schrieb:
[...Nonsens...]
krümelkacker schrieb:
...Aber viel wichtiger: Schnapp Dir erstmal ein gutes C++ Buch und lerne. Du kannst nicht erwarten, dass Dir in einem Forum C++ von Grund auf beigebracht wird. (!)
-
krümelkacker schrieb:
...Aber viel wichtiger: Schnapp Dir erstmal ein gutes C++ Buch und lerne. Du kannst nicht erwarten, dass Dir in einem Forum C++ von Grund auf beigebracht wird. (!)
Ich hab ein Buch, jedoch steht nicht das drin, was ich suche. Und ausserdem muss das wohl ein 5000 Seiten Buch sein, wenn nicht einmal erfahrene C++ Programmierer dieses Problem lösen können

-
Auf deine Frage:
#include <iostream> #include <string> using namespace std; void foo(string *wert) { cout << *wert; } int main() { string *str; *str = "test"; foo(str); cin.get(); return 0; }
-
#include <string> int main() { string *str; *str = "test"; }Wird mit
*stringpointer = "irgendwas";(wie nennt sich "irgendwas" - literal?) automatisch Speicher beschafft und gefüllt?
-
HighLigerBiMBam: Definitiv nicht schön
Was soll der Zeiger?Edit: Es tut auch nicht das, was du willst. Du dereferenzierst str, bevor da überhaupt ein Objekt dahintersteckt.
-
Danke HighLigerBiMBam
hat mich zur Lösung geführt.
-
TTS schrieb:
krümelkacker schrieb:
...Aber viel wichtiger: Schnapp Dir erstmal ein gutes C++ Buch und lerne. Du kannst nicht erwarten, dass Dir in einem Forum C++ von Grund auf beigebracht wird. (!)
Ich hab ein Buch, jedoch steht nicht das drin, was ich suche.
Welches Buch denn? Und wonach suchst Du?
TTS schrieb:
Und ausserdem muss das wohl ein 5000 Seiten Buch sein, wenn nicht einmal erfahrene C++ Programmierer dieses Problem lösen können

Du hast das Problem einfach nur schlecht präsentiert: Ein paar Code-Fetzen mit zig Fehlern drin und ein nicht klar formuliertes Ziel.
padreigh schrieb:
#include <string> int main() { string *str; *str = "test"; }Wird mit
*stringpointer = "irgendwas";(wie nennt sich "irgendwas" - literal?) automatisch Speicher beschafft und gefüllt?"test" ist ein Zeichenketten-Literal. Abgesehen davon, dass hier ein std:: vor string fehlt, ist die Zuweisung in der letzten Zeile nicht erlaubt, da der Zeiger str nicht initialisiert wurde.
#include <string> int main() { std::string s; std::string* z = &s; // z zeigt jetzt auf das Objekt s *z = "i like pointers"; }TTS schrieb:
Danke HighLigerBiMBam
hat mich zur Lösung geführt.Glaube ich nicht.
-
TTS schrieb:
Danke HighLigerBiMBam
hat mich zur Lösung geführt.
Nicht wirklich, das gesamte Verhalten ist undefiniert! Ich habe vorhin nicht nachgedacht.
#include <iostream> #include <string> using namespace std; void foo(string *wert) { cout << *wert; } int main() { string *str = new string("test"); foo(str); delete str; cin.get(); return 0; }
-
HighLigerBiMBam schrieb:
TTS schrieb:
Danke HighLigerBiMBam
hat mich zur Lösung geführt.
Nicht wirklich, das gesamte Verhalten ist undefiniert! Ich habe vorhin nicht nachgedacht.
#include <iostream> #include <string> using namespace std; void foo(string *wert) { cout << *wert; } int main() { string *str = new string("test"); foo(str); delete str; cin.get(); return 0; }Langsam krieg ich echt Augenkrebs
Lies dir das letzte Posting von krümelkacker nochmal durch, damit du merkst, dass dynamische Speicherreservierung nicht nötig ist. Danach schmeißt du den Pointer komplett raus.
-
string s = "test";
string *str = &s;Geht auch na und :P, Stack/Heap hauptsache nichtmehr undefiniert...
-
HighLigerBiMBam schrieb:
TTS schrieb:
Danke HighLigerBiMBam
hat mich zur Lösung geführt.
Nicht wirklich, das gesamte Verhalten ist undefiniert! Ich habe vorhin nicht nachgedacht.
#include <iostream> #include <string> using namespace std; void foo(string *wert) { cout << *wert; } int main() { string *str = new string("test"); foo(str); delete str; cin.get(); return 0; }Doch Tatsächlich.
string *measurementResult = new string; string *date = new string; string *time = new string; flukeReader.GetDCVoltage(measurementResult,date, time, range, vMode, version); cout << *measurementResult, *date, *timeObwohl ich eigentlich genau das umgekehrte brauchte, als du gepostet hast. Ich habe nur eine kleine denkhilfe benötigt

-
krümelkacker schrieb:
Welches Buch denn? Und wonach suchst Du?
Ich Hab die Fourth Edition von "DEITEL's" How to program C++ (leider englisch). Ich wollte wissen wie man aus einer Funktion einen String zurückbekommt. (nicht als return value sondern über die Argumente) Aber hat ja jetzt geklappt.
krümelkacker schrieb:
Du hast das Problem einfach nur schlecht präsentiert: Ein paar Code-Fetzen mit zig Fehlern drin und ein nicht klar formuliertes Ziel.
Ja hab gemerkt, das man mit diesem Codebeispiel nicht viel anfangen kann. Werde nächstes Mal Code aus dem projekt Posten.
-
TTS schrieb:
Ich Hab die Fourth Edition von "DEITEL's" How to program C++ (leider englisch). Ich wollte wissen wie man aus einer Funktion einen String zurückbekommt. (nicht als return value sondern über die Argumente) Aber hat ja jetzt geklappt.
Dann hättest du nach Referenzen suchen sollen. Sollte wohl irgendwo ganz am Anfang stehen. asc hat schon das richtige Beispiel gezeigt.
Grüssli
-
TTS schrieb:
krümelkacker schrieb:
Welches Buch denn? Und wonach suchst Du?
Ich Hab die Fourth Edition von "DEITEL's" How to program C++ (leider englisch).
Oh, das ist eines der schlechteren Bücher. Die verlinkte Kritik bezieht sich aber auf die 3. Edition. Vielleicht ist die 4. ja etwas besser.
TTS schrieb:
Ich wollte wissen wie man aus einer Funktion einen String zurückbekommt. (nicht als return value sondern über die Argumente).
Aha! Da gibt es viele Möglichkeiten. Das einfachste ist wohl eine Referenz.
kk
-
TTS schrieb:
Ich hab ein Buch, jedoch steht nicht das drin, was ich suche.
Ich bezweifle das in einem guten C++ Buch das Thema Referenzen nicht relativ weit vorne steht (und ebenso new/delete wenn du unbedingt - was in diesem Fall imho aber Schwachsinn ist - auf den Zeiger bestehst).
TTS schrieb:
Und ausserdem muss das wohl ein 5000 Seiten Buch sein, wenn nicht einmal erfahrene C++ Programmierer dieses Problem lösen können

Was ist bitte an meinem Code verkehrt? Ich würde hier keine Zeiger verwenden, ebenso wie der zweite Parameter wenn er nur ausgegeben, aber nicht verändert werden soll, keine modifizierbare Referenz sein sollte.