Klasse string als Parameter in Funktion

Gast #546649
Lesenswert?

Servus,
ich probiere ein string als Parameter zu übergeben. Nur weiß ich nicht, 
wie ich auf den Inhalt zugreifen soll. Es ist ja nicht aufgebaut wie ein 
String, aber wie eine Klasse. Ich habe schon was gefunden->Iterator. Da 
steig ich aber nicht durch, wie ich das richtig übergebe.

1
CSVInterface::FindCellDouble(string* line,int n, double* Value) {
2
  // Finde eine bestimmte Zelle einer Zeile
3

4
    Spalte = 0;
5
    k = 0;
6
    j = 0;
7

8
    line->iterator line_i;
9

10
    for(line_i=line->begin();line_i=line->end();line_i++) {
11
//      if(line[n] == ',') line[n] = '.';
12
      if(*line_i == ',') *line_i = '.';
13
    } // for
14

15
    for(n=0;n<line->size();n++)  {
16
//      if(line[n] == ',') line[n] = '.';
17
//      if(line[n] == ';') {
18
        j = n;
19
//        IGBTDaten.temp.assign(line,j+1,k-1);
20
        Value[Spalte] = strtod(IGBTDaten.temp.c_str(),0);
21
        //cout << "Test\tRth\t:" <<  IGBTDaten.d_TransIGBTRth[Spalte] << endl;
22
        k = j;
23
        Spalte++;            
24
//      } // if  
25
    } // for
26

27
  return 0;
28
}
#546709
Lesenswert?

> Nur weiß ich nicht, wie ich auf den Inhalt zugreifen soll.

Das kommt drauf an, was du mit den einzelnen Zeichen
machen willst.

> Es ist ja nicht aufgebaut wie ein String, aber wie eine Klasse.

Das macht nichts. std::string hat entsprechende Operatoren
mit.

>    line->iterator line_i;
>
>    for(line_i=line->begin();line_i=line->end();line_i++) {
>//      if(line[n] == ',') line[n] = '.';
>      if(*line_i == ',') *line_i = '.';
>    } // for

Das ist aber mächtig kompliziert geschrieben.
Wenn ich das richtig interpretiere, dann möchtest du in deinem
String alle ',' durch '.' ersetzen.

   for( size_t i = 0; i < line->length(); ++i ) {
     if( (*line)[i] == ',' )
       (*line)[i] = '.';
   }

Warum hast du eigentlich line per Pointer übergeben.
Sowas macht man in C++ eher selten.

* Soll die Funktion das Objekt des Aufrufers ändern können,
  dann übergibt man eine Referenz
* Soll sie das nicht können,
  o Möchte die Funktion das Objekt nur lokal verändern,
    dann übergibt man per Value (also als Objekt)
  o Möchte die Funktion das Objekt überhaupt nicht verändern,
    dann übergibt man eine konstante Referenz

Du möchtest:
  Die Funktion soll Manipulationen am String Objekt vornehmen
  Diese Manipulationen sollen auch beim Aufrufer sichtbar sein

  -> Übergabe per Referenz
     (und damit bist du die Pointer Syntax los)
Gast #546780
Lesenswert?

1
CSVInterface::FindCellDouble(string const& str_line,int n) { 
2
    // Finde eine bestimmte Zelle einer Zeile 
3

4
    string::iterator line_i; 
5

6
    for(line_i = str_line.begin();line_i !=str_line.end();line_i++) { 
7
// Fehler: const char * kann nicht in char* konvertiert werden 
8
    cout << *line_i; 
9
    } 
10
    cout << endl; 
11
        
12
    return 0; 
13
}
Ich glaube ich steh im Walde. Oben das funkt. auch nicht
1
CSVInterface::FindCellDouble(string const& str_line,int n) {
Referenzen nutzt man indem:
typ& name = variable;
oder
typ const& name = variable, wenn der zu übergebende Wert nicht verändert 
werden kann.
1
string::iterator line_i;
string::iterator ist ein Datentyp, der in string steht. line_i ist also 
eine Variable vom Typ iterator
1
for(line_i = str_line.begin();line_i !=str_line.end();line_i++) {
begin() liefert einen Wert vom Typ iterator zurück. Also gebe ich diesen 
Wert an line_i weiter
1
cout << *line_i;
Da line_i ein Verweis ist, erfolgt der Zugriff wie bei einem Zeiger (ein 
* vorangestellt)

Wo liegt mein Fehler?
Gast #546804
Lesenswert?

1
CSVInterface::FindCellDouble(string& str_line,int n) {
2
  // Finde eine bestimmte Zelle einer Zeile
3
  
4
  string s = str_line; //"Testlauf";
5
  string::iterator i;
6
  cout << "\nFindCellDouble:\t";
7
  for(i=s.begin();i!=s.end();i++){
8
    if(*i == ',') *i = '.';
9

10
    cout << *i;
11
  }
12
  cout << "\t:"<< endl;
13

14

15
  return 0;
16
}
jetzt hab ichs
#546824
Lesenswert?

Diplomand wrote:
>
1
> CSVInterface::FindCellDouble(string& str_line,int n) {
2
>   // Finde eine bestimmte Zelle einer Zeile
3
> 
4
>   string s = str_line; //"Testlauf";
5
>   string::iterator i;
6
>   cout << "\nFindCellDouble:\t";
7
>   for(i=s.begin();i!=s.end();i++){
8
>     if(*i == ',') *i = '.';
9
> 
10
>     cout << *i;
11
>   }
12
>   cout << "\t:"<< endl;
13
> 
14
> 
15
>   return 0;
16
> }
17
>
> jetzt hab ichs

Schlechte Lösung.
Du kopierst den String um.

Da hättest du auch gleich machen können:

> CSVInterface::FindCellDouble(string str_line,int n) {

Dein Problem ist ein anderes:

> string::iterator line_i;string::iterator ist ein Datentyp, der
> in string steht. line_i ist also eine Variable vom Typ iterator

Schon. Aber du hast keinen String! Du hast einen const String!
Also bruachst du auch einen const iterator.

  string::const_iterator line_i;

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren