String an Funktion übergeben

Dieses Thema im Forum "C/C++" wurde erstellt von gruenpflanze, 26.08.2007.

  1. #1 gruenpflanze, 26.08.2007
    gruenpflanze

    gruenpflanze Mitglied

    Dabei seit:
    25.06.2007
    Beiträge:
    26
    Zustimmungen:
    0
    Hallo!
    Erstmal vorweg, weshalb ist die Textverarbeitung (string, char, input-methoden) eigentlich so kompliziert unter C++? Oder kommt nur mit das so kompliziert vor?

    Folgendes vereinfachtes Programm soll mein Problem zeigen:
    Ich habe eine string Variable, die ich an eine Funktion übergeben will damit diese verarbeitet werden kann.

    Code:
    #include <iostream>
    #include <string>
    using namespace std;
    string test(string hallo); //deklarierung der Funktion
    string hallo="hehey"; 
    int main()
    {
    test(hallo); //test wird aufgerufen und hallo übergeben.
    }
    
    string test(string hallo)
    {
    cout << ""<<hallo;
    }
    
    Der Output schaut so aus:
    Ich vermute, dass es am Gültikeitsbereich der Stringvariable liegt. Kann es sein, dass der Pointer in der Funktion schon ins Leere zeigt? Bin mit der Fehlermeldung überfordert.
    Vielen Dank!
    Ach ja, der Fehler wird zur laufzeit ausgegeben, d.h. das kompilieren mit c++ (unter debian) hat funktioniert.

    Danke!
     
  2. Anzeige

    Schau dir mal diese Kategorie an. Dort findest du bestimmt etwas.
    Registrieren bzw. einloggen, um diese und auch andere Anzeigen zu deaktivieren
  3. #2 Mµ*e^13.5_?¿, 26.08.2007
    Mµ*e^13.5_?¿

    Mµ*e^13.5_?¿ Routinier

    Dabei seit:
    21.02.2006
    Beiträge:
    453
    Zustimmungen:
    0
    Also an dem Programm ist eigentlich alles einwandfrei in Ordnung.
    Ausgabe sieht aus wie folgend:
    Kompiliert mit "g++ (GCC) 4.1.3 20070812 (prerelease) (Debian 4.1.2-15)".
     
  4. #3 marcellus, 26.08.2007
    marcellus

    marcellus Kaiser

    Dabei seit:
    09.05.2007
    Beiträge:
    1.392
    Zustimmungen:
    0
    Und weil du den string global deklariert hast solltest du im unterprogramm auch ohne übergabe drauf zugreifen können.

    Sehr sauber ist die verwendung von globalen variablen allerdings nicht.
     
  5. #4 gruenpflanze, 26.08.2007
    gruenpflanze

    gruenpflanze Mitglied

    Dabei seit:
    25.06.2007
    Beiträge:
    26
    Zustimmungen:
    0
    Code:
    *@debian:~/maturaarbeit/tests$ [B]gcc string.cpp[/B]
    string.cpp:14:2: warning: no newline at end of file
    /tmp/ccOHo2y4.o: In function `__tcf_1':
    string.cpp:(.text+0xe): undefined reference to `std::basic_string<char, std::char_traits<char>, std::allocator<char> >::~basic_string()'
    /tmp/ccOHo2y4.o: In function `__static_initialization_and_destruction_0(int, int)':
    string.cpp:(.text+0x40): undefined reference to `std::ios_base::Init::Init()'
    string.cpp:(.text+0x67): undefined reference to `std::allocator<char>::allocator()'
    string.cpp:(.text+0x82): undefined reference to `std::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string(char const*, std::allocator<char> const&)'
    string.cpp:(.text+0x8d): undefined reference to `std::allocator<char>::~allocator()'
    string.cpp:(.text+0xbc): undefined reference to `std::allocator<char>::~allocator()'
    /tmp/ccOHo2y4.o: In function `__tcf_0':
    string.cpp:(.text+0xfa): undefined reference to `std::ios_base::Init::~Init()'
    /tmp/ccOHo2y4.o: In function `test(std::basic_string<char, std::char_traits<char>, std::allocator<char> >)':
    string.cpp:(.text+0x111): undefined reference to `std::cout'
    string.cpp:(.text+0x116): undefined reference to `std::basic_ostream<char, std::char_traits<char> >& std::operator<< <std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*)'
    string.cpp:(.text+0x127): undefined reference to `std::basic_ostream<char, std::char_traits<char> >& std::operator<< <char, std::char_traits<char>, std::allocator<char> >(std::basic_ostream<char, std::char_traits<char> >&, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)'
    /tmp/ccOHo2y4.o: In function `main':
    string.cpp:(.text+0x151): undefined reference to `std::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)'
    string.cpp:(.text+0x171): undefined reference to `std::basic_string<char, std::char_traits<char>, std::allocator<char> >::~basic_string()'
    string.cpp:(.text+0x17c): undefined reference to `std::basic_string<char, std::char_traits<char>, std::allocator<char> >::~basic_string()'
    string.cpp:(.text+0x197): undefined reference to `std::basic_string<char, std::char_traits<char>, std::allocator<char> >::~basic_string()'
    /tmp/ccOHo2y4.o:(.eh_frame+0x12): undefined reference to `__gxx_personality_v0'
    collect2: ld gab 1 als Ende-Status zurück 
    
     
  6. #5 marcellus, 26.08.2007
    marcellus

    marcellus Kaiser

    Dabei seit:
    09.05.2007
    Beiträge:
    1.392
    Zustimmungen:
    0
    gcc ist der C compiler g++ ist der C++ compiler.

    Das Packet gcc steht überigens nicht mehr für Gnu C Compiler, sondern gür Gnu Compiler Collection, deswegen kanns leicht sein, dass ein Neuling verwirrt wird, lass dich davon nicht zurückwerfen.
     
  7. #6 gruenpflanze, 26.08.2007
    gruenpflanze

    gruenpflanze Mitglied

    Dabei seit:
    25.06.2007
    Beiträge:
    26
    Zustimmungen:
    0
    Danke.
    Aber auch mit dem Compiler "c++" oder "g++" oder was es sonst noch alles gibt auf einer linux-maschine geht es nicht. Siehe 1. Post.
    An was könnte es noch liegen? Hat jemand eine Idee?
     
  8. #7 Lord Kefir, 26.08.2007
    Lord Kefir

    Lord Kefir König

    Dabei seit:
    10.06.2004
    Beiträge:
    944
    Zustimmungen:
    0
    Deine test()-Funktion ist falsch. Sie gibt nämlich keinen String zurück, obwohl sie es laut Deklaration tun muss.

    Kleiner Tipp: benutze beim kompilieren -Wall als Parameter.


    Mfg,
    Lord Kefir
     
  9. #8 Mµ*e^13.5_?¿, 26.08.2007
    Mµ*e^13.5_?¿

    Mµ*e^13.5_?¿ Routinier

    Dabei seit:
    21.02.2006
    Beiträge:
    453
    Zustimmungen:
    0
    Das ist so natürlich richtig, es sollte aber nicht zu dem Fehler führen, wie es das bei ihm tut.
    Wenn ich mich recht erinnere ist es nach dem ISO-Standard übrigens erlaubt in einer Funktion entgegen der Funktionsdeklaration keinen Wert zurückzugeben, es führt allerdings zu undefiniertem Verhalten, wenn man den Wert, den die Funktion dann zurückgibt benutzt.
     
  10. #9 Lord Kefir, 26.08.2007
    Lord Kefir

    Lord Kefir König

    Dabei seit:
    10.06.2004
    Beiträge:
    944
    Zustimmungen:
    0
    Ich lasse mich jetzt nicht auf eine C++-Diskussion ein, weil ich zwar in diversen Sprachen programmiere, aber nicht in C++ ;)

    Ich fände es auch krass, wenn es wirklich nur daran liegen sollte. Bei mir klappt's aber mit einer void-Deklaration - oder wenn test() einen String zurückgibt:
    Code:
    #include <iostream>
    #include <string>
    using namespace std;
    
    string hallo="123";
    string test(string hallo);
    int main() {	
    	test(hallo);
    }
    
    string test(string hallo)
    {
    	string x;
    	cout<<""<< hallo;
    	return x;
    }
    
    Der Rest des Codes sieht schließlich korrekt aus.


    Mfg,
    Lord Kefir
     
  11. #10 marcellus, 26.08.2007
    marcellus

    marcellus Kaiser

    Dabei seit:
    09.05.2007
    Beiträge:
    1.392
    Zustimmungen:
    0
    stimmt schon das hat er nicht gern, wundert mich eigentlich, dass er das warning nicht auch ohne wall ausgibt

    Ich finds cool, dass es bei dir mit einem return value geht, ich muss lediglich
    Code:
    string hallo="hehey\0";
    einbauen, dass es funktioniert, wenn ich das nicht drinnen hab auch ein segfault, aber das ist durchaus begründet.

    Ich find das aber ziemlich cool, weil die version von Lord Kefir bei mir auch wunderbar läuft, obwohl du auch keine stringterminierung eingebaut hast. Nur rein verständnishalber, muss man das "\0" in c++ strings einbauen?

    Btw Lord Kefir wenn ich bei deinem Programm den return wert weggeb funktionierts auch nicht, auch nicht wenn ich das "\0" als stringterminierung in die initialisierung schreib.:think:

    Mir kommt das ganze ziemlich suspekt vor.

    Kompiliert mit g++ (GCC) 4.1.2 (Gentoo 4.1.2)
     
  12. #11 Mµ*e^13.5_?¿, 27.08.2007
    Mµ*e^13.5_?¿

    Mµ*e^13.5_?¿ Routinier

    Dabei seit:
    21.02.2006
    Beiträge:
    453
    Zustimmungen:
    0
    Mir kommt das ganze sehr merkwürdig vor, es scheint ja kein Fehler im Code zu sein.
    gruenpflanze, hast du mal den Debugger angeworfen und nachgesehen, wo genau das Programm abbricht?
    Ich verstehe nicht, warum?

    Code:
    "blahblah"; /* Ist ein null-terminierter String, in C wie in C++. */
     
  13. Anzeige

    Vielleicht findest du HIER Antworten.
    Registrieren bzw. einloggen, um diese und auch andere Anzeigen zu deaktivieren
  14. #12 marcellus, 27.08.2007
    marcellus

    marcellus Kaiser

    Dabei seit:
    09.05.2007
    Beiträge:
    1.392
    Zustimmungen:
    0
    Code:
    "blahblah"; /* Ist ein null-terminierter String, in C wie in C++. */
    Stimmt jetzt kommts mir erst mich wunderts trotzdem, dass es mit der "zweiten" terminierung dann hinhaut, aber egal deswegen heists ja nicht definiert.

    Also im endeffekt kommen wir zu dem ergebnis, dass die beendigung einer non void funktion ohne return wirklich nicht definiert ist?

    war aufs "\0" bezogen, hat sich damit aber auch erledigt
     
  15. #13 Lord Kefir, 27.08.2007
    Zuletzt bearbeitet: 27.08.2007
    Lord Kefir

    Lord Kefir König

    Dabei seit:
    10.06.2004
    Beiträge:
    944
    Zustimmungen:
    0
    Ich habe hier gerade auf der Arbeit versucht den Code mit Visual Studio zu kompilieren - und siehe da: es geht nicht.

    Liegt definitiv am Rückgabewert.


    Mfg,
    Lord Kefir
     
Thema:

String an Funktion übergeben

Die Seite wird geladen...

String an Funktion übergeben - Ähnliche Themen

  1. [gelöst] [php] für Webservice aus string einzelne funktionsparameter rausholen

    [gelöst] [php] für Webservice aus string einzelne funktionsparameter rausholen: hallo, ich habe folgendes Problem und hoffe, dass jemand da etwas hilfestellung geben kann. ich habe einen string, der hat die form...
  2. FIND mit UND-Verknüpfung im Suchstring

    FIND mit UND-Verknüpfung im Suchstring: Hallo, ich schaffe es einfach nicht bei folgendem Kommando die Suchoptionen zu erweitern, damit nur Dateien beginnend mit "T_*" aufgelistet...
  3. String auf Konsole ausgeben

    String auf Konsole ausgeben: Hallo zusammen, ich bin auf ein Problem gestoßen dass für mich sehr unverständlich ist, aber vllt übersehe ich auch etwas Offensichtliches. Es...
  4. String einer bestimmten Zeile durchsuchen

    String einer bestimmten Zeile durchsuchen: Hallo, wie kann ich den eine bestimmte Zeile einer Textdatei zerlegen und daraus ein Stück entnehmen? Ich suche nach der Zeile in der "model...
  5. alles außer letzte 4 strings

    alles außer letzte 4 strings: Hallo, ich habe verschieden lange Strings (Dateinamen) und möchte gerne den Dateinamen als Variable ausgeben: 1. Strings...