[c++] Problem bei Rückgabe eines Parameters aus Funktion

Moin Guddy,

Ich dachte nur, da ich die eingelesenen Werte am Ende als char und int Werte benutzen will, dass es am besten für mich wäre diese auch schon mit diesem Typ zurückzugeben. Das macht meine main etwas übersichtlicher
Das kannst Du ja trotzdem! Auch ein "string" ist ja nix anderes als eine Zeichenkette :p

Beispielsweise:
Code:
string strMeinTollerString = "Dies ist mein toller String!!";
char cTemp = strMeinTollerString[9];
'cTemp' ist dann gleich "m" - falls ich mich nicht verzählt habe ..... :-)


Dann weiterhin viel Erfolg!

tschüss
Klaus
 
@vfl_freak:
C++:
int main() 
{
      const char *new_process = null;
      konfigvareinlesen( new_process );
      delete[] new_process;
}

void konfigvareinlesen( const char *prozess)
{
      std::string dummy, val[7];         // dummy liest String bis : ein, val[] ist stringarray
      std::ifstream in("Variableninput.dat");   // neuen Lese-Stream erzeugen
      //1. Zeile
      std::getline(in, dummy, ':');            // Einlesen bis :
      in.ignore();                             // Leerzeichen ignorieren
      std::getline(in, val[0]);                // Einlesen bis Zeilenende
      int iLaenge = val[0].size();
      prozess = new char[iLaenge];
      prozess= val[0].c_str();
}
das ist kot :P Es macht keinen sinn, dass du einen stringarray anlegst, dann legst du 1., wenn du es wirklich kopieren wolltest, wofür der Sinn nicht erschließbar ist, den Inhalt in prozess kopieren willst, was nicht klappen kann, da du prozess nichts zuweisen kannst, weil du den zeiger bei value übergeben hast, dann ist dennoch dein array um 1 zu klein (nullterminierung). Und int der Falsche Datentyp. Doch das alles ist ein riesiger Bug, weil du den Zeiger auf den Bereich wegschmeißt und stattdessen auf den Inhalt von val[0] zeigen lässt (bzw. diesen als c-string). Damit ist der Zeiger weg ;) Und jetzt kommt das beste ... das, auf das prozess zeigt, wird beim verlassen der Funktion ungültig, da val[0] zerstört wird. In deinem Beispiel passiert dir nichts bei delete [], weil du halt prozess nur per value übergeben hast, und somit NICHTS am String in der main-Funktion verändert wurde. Aber im ganzen ist dein Code Schwachsinn ;)
C++:
#include <fstream>
#include <string>
#include <iostream>
#include <limits>

void read_config(std::string& process);

int main() 
{
    std::string process;
    read_config(process);

    std::clog << process;
}

void read_config(std::string& process)
{
    std::ifstream file_stream("Variableninput.dat"); 
    if (!file_stream) throw std::runtime_error("no config file");

    file_stream.ignore(std::numeric_limits<std::streamsize>::max(), ':');
    std::getline(file_stream, process);    
}
So is es schon wesentlich besser.
 
Achja oder in guddys Version:
C++:
int main() 
{
    const char* prozess;
    konfigvareinlesen(&prozess);
}
 
void konfigvareinlesen(const char** prozess)
{
    std::string dummy
    static std::string value; // das muss hier static sein, damit prozess auch beim verlassen der Funktion noch auf was gültiges zeigt 

    std::ifstream in("Variableninput.dat");         // neuen Lese-Stream erzeugen
    //1. Zeile
    std::getline(in, dummy, ':');           // Einlesen bis :
    in.ignore();                    // Leerzeichen ignorieren
    std::getline(in, val);           // Einlesen bis Zeilenende
    *prozess = val.c_str();
}
so sollte das auch gehen. Ist aber auch nicht so schön, da du mit static arbeiten musst (oder du gibst ne max. Größe von prozess an und kopierst ... aber alles unschön ;) ) ... Und mit const bekommst du so auch Probleme :D Also lass es :D
 
Moin devDevil,

hast natürlich Recht :-( war leider ein ziemlicher Schnellschuß, den ich (wie ja auch schrieb) nicht ausprobiert habe .....
Da ich hier derartige Dinge selbt so nicht verwende (sondern i.d.R. die später beschriebene Vector-Variante), hätte ich besser meinen Mund gehalten :D

Aber Danke für die Hinweise - ich habe hier vor einiger Zeit ein relativ wurschtelig geschriebenes Projekt übernommen, mit dem es immer mal wieder Probleme gibt - und in dem es glaub' ich auch solche oder ähnliche Stellen gibt. Ich werde es mal in diese Richtung hin überprüfen ... :)

Gruß
Klaus
 
Zuletzt bearbeitet:
Zurück