Forum: PC-Programmierung Klasse string als Parameter in Funktion


von Diplomand (Gast)


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
}

von Karl H. (kbuchegg)


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)

von Diplomand (Gast)


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?

von Diplomand (Gast)


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

von Karl H. (kbuchegg)


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;

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.