mikrocontroller.net

Forum: PC-Programmierung Klasse string als Parameter in Funktion


Autor: Diplomand (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

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

    Spalte = 0;
    k = 0;
    j = 0;

    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

    for(n=0;n<line->size();n++)  {
//      if(line[n] == ',') line[n] = '.';
//      if(line[n] == ';') {
        j = n;
//        IGBTDaten.temp.assign(line,j+1,k-1);
        Value[Spalte] = strtod(IGBTDaten.temp.c_str(),0);
        //cout << "Test\tRth\t:" <<  IGBTDaten.d_TransIGBTRth[Spalte] << endl;
        k = j;
        Spalte++;            
//      } // if  
    } // for

  return 0;
}

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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)

Autor: Diplomand (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
CSVInterface::FindCellDouble(string const& str_line,int n) { 
    // Finde eine bestimmte Zelle einer Zeile 

    string::iterator line_i; 

    for(line_i = str_line.begin();line_i !=str_line.end();line_i++) { 
// Fehler: const char * kann nicht in char* konvertiert werden 
    cout << *line_i; 
    } 
    cout << endl; 
        
    return 0; 
}
Ich glaube ich steh im Walde. Oben das funkt. auch nicht
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.
string::iterator line_i;
string::iterator ist ein Datentyp, der in string steht. line_i ist also 
eine Variable vom Typ iterator
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
cout << *line_i;
Da line_i ein Verweis ist, erfolgt der Zugriff wie bei einem Zeiger (ein 
* vorangestellt)

Wo liegt mein Fehler?

Autor: Diplomand (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
CSVInterface::FindCellDouble(string& str_line,int n) {
  // Finde eine bestimmte Zelle einer Zeile
  
  string s = str_line; //"Testlauf";
  string::iterator i;
  cout << "\nFindCellDouble:\t";
  for(i=s.begin();i!=s.end();i++){
    if(*i == ',') *i = '.';

    cout << *i;
  }
  cout << "\t:"<< endl;


  return 0;
}
jetzt hab ichs

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Diplomand wrote:
>
> CSVInterface::FindCellDouble(string& str_line,int n) {
>   // Finde eine bestimmte Zelle einer Zeile
> 
>   string s = str_line; //"Testlauf";
>   string::iterator i;
>   cout << "\nFindCellDouble:\t";
>   for(i=s.begin();i!=s.end();i++){
>     if(*i == ',') *i = '.';
> 
>     cout << *i;
>   }
>   cout << "\t:"<< endl;
> 
> 
>   return 0;
> }
> 
> 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.