Forum: Mikrocontroller und Digitale Elektronik Ein String Problem


von D. C. (joker89)


Lesenswert?

Hallo, ich komme gerade nicht mehr weiter und brauche Hilfe.

Ich habe eine Funktion geschrieben die eine CSV von der SD liest und 
diese in einem "const char *SD_Data[24][2];" Ich müsste zum weiteren 
verarbeiten im Anschluss ein string erhalten das ich in eine int 
umwandeln.
1
char buffer[100] = {0};
2
3
  void Draw_GraphDay()
4
  {  DataFile = SD.open("log.csv");
5
    if (DataFile)
6
    {  
7
      uint8_t ArDim1=0 ;
8
      uint8_t ArDim2=0 ;
9
      nexString:
10
      while (DataFile.available())
11
      {  
12
        String cmd = "";
13
        buffer[100] = {0};
14
        //Suchen nach dem richten String 
15
        
16
        for (uint8_t i =0; i<=12;i++)
17
        {  
18
          buffer[i] = DataFile.read();
19
          cmd += buffer[i];        
20
          
21
          if(buffer[i] == ';')
22
          {
23
          ArDim2++;
24
          }else if( buffer[i] == '\r')
25
          {
26
          ArDim2=0;
27
          ArDim1++;
28
          }
29
            SD_Data[ArDim1][ArDim2] = cmd.c_str();
30
            Serial.print(SD_Data[0][0]);
31
            while(true);
32
            goto nexString;
33
        }
34
      }
35
    } 
36
    else
37
    {
38
      Serial.println("!!!!!!");
39
    }
40
  
41
  
42
  }

jetzt greif ich aber bisher nur auf das erste char zu und nicht auf dem 
ganzen array of char was ja wiederum mein String wäre. wie erhalte ich 
jetzt wieder ein string ?

gedacht hätte ich das ich mit  "Serial.print(cmd)" mein string erhalte 
dem ist leider nicht so!!!

von qwertzuiopü+ (Gast)


Lesenswert?

>goto

Autsch... An der Stelle würde es ein einfaches break genauso tun. Nur 
zwanzigmal so elegant.

von qwertzuiopü+ (Gast)


Lesenswert?

Das
>while(true);
davor macht's nicht gerade besser...

von Peter II (Gast)


Lesenswert?

const char *SD_Data[24][2];

einen const etwas zuweisen, halte ich auch nicht für sinnvoll.

SD_Data[ArDim1][ArDim2] = cmd.c_str();

das schlimme daran ist, das cmd später nicht mehr da ist, dann zeigt der 
Zeiger ins nichts.

von D. C. (joker89)


Lesenswert?

qwertzuiopü+ schrieb:
>>goto
>
> Autsch... An der Stelle würde es ein einfaches break genauso tun. Nur
> zwanzigmal so elegant.

Sry das war bzw ist noch ein überbleibsl vom testen und der Fehler 
suche, es sollte natürlich ein break sein.
Zum Thema while(true) kann ich das selbe sagen.

@Peter wie meinst du das ?

Ich hab eine CSV in der Form

1443823256;20;20
1443826856;21;21
1443830456;23;23
1443834056;23;23

mit

SD_Data[0][1] will ich zb auf den Wert 20 zugreifen.

von whilethru (Gast)


Lesenswert?

D. C. schrieb:
> while(true);
> goto nexString;

Was soll das?

von mike (Gast)


Lesenswert?

SD_Data[ArDim1][ArDim2] = cmd.c_str();

Was willst du mit dieser Zeile erreichen?
cmd.c_str() liefert dir einen Zeiger auf ein Char-Array.
Wenn du die Daten kopieren willst, musst du das auch machen. z.b. mit 
memcpy oder strcpy ...

von Peter II (Gast)


Lesenswert?

D. C. schrieb:
> @Peter wie meinst du das ?

ich weiß nicht mal wo ich anfangen soll. Dir fehlen (scheinbar) die 
kompletten Grundlagen.

cmd ist ein Objekt, c_str() davon liefert dir einen Zeiger auf die 
internen Daten von diesen Objekt. Nach dem du das objekt aber änders 
oder den Gültigkeitsbreich verlässt, darf man nicht einfach auf den 
Zeiger zugreifen.

Das einfachste ist wenn man
1
String SD_Data[24][2]

und dann
1
SD_Data[ArDim1][ArDim2] = cmd;

macht, aber das ist sehr aufwendig für einen µC.

von D. C. (joker89)


Lesenswert?

mike schrieb:
> SD_Data[ArDim1][ArDim2] = cmd.c_str();
>
> Was willst du mit dieser Zeile erreichen?
> cmd.c_str() liefert dir einen Zeiger auf ein Char-Array.
> Wenn du die Daten kopieren willst, musst du das auch machen. z.b. mit
> memcpy oder strcpy ...

Ich hätte gedacht wenn ich die Startadresse übergebe würde es klappen. 
Ich muss auch zugeben mit String objects hab ich noch nie was gemacht.

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.