- SF800 Solar Speicher Tutorial         
Ergebnis 1 bis 10 von 52

Thema: Char - Array und Pointer

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    HaWe
    Gast
    zurück zum TOP:
    char** myarray;
    Bekomme ich hier ein Array mit reserviertem Speicherplatz für 128 Pointer (char*)?
    nein, reservierten Speicherbereich hast du nicht, du musst dafür jeden der 128 char arrays bei der Deklaration mit festen cstrings vor-belegen
    char** myarray = {"dies ist der 1. cstring","dies ist der 2. cstring","dies ist der 3. cstring","dies ist der 4. cstring",...}
    - sonst schreibst du wild ins RAM hinein.
    char** myArray ist ja nur eine Anfangs-Adresse für eine beliebige Liste unbekannter Länge mit 1 Pointer auf eine (einzelne) char-Speicheradresse,
    und
    char* myArray[128] ist nur eine Anfangs-Adresse für eine 128er Liste mit je 1 Pointer auf eine (einzelne) char-Speicherzelle

    Den reservierten Speicher hast du nur mit
    char myArray[128][100]; // 128 x char array zu je 100 char Länge

    wenn du dies an eine Funktion übergeben musst, die nur char* oder char** akzeptiert, kannst du type-casten

    (char**)myarray // wandelt myarray[][] vorrübergehend in char** myarray um
    (char*)myarray[] // wandelt myarray[][] vorrübergehend in char* myarray[] um


    du kannst auch einen 2-dim array definieren (zur variablen Belegung mit cstrings) und einen pointer auf ein solches Konstrukt:

    char myArray[128][100]; // 128 x char array zu je 100 char Länge
    char **ppArr;

    dann kannst du auch die Speicheradressen einander zuweisen:
    ppArr= (char**)myArray;
    und dann ppArr an deine Funktion als Parameter übergeben.
    Geändert von HaWe (28.10.2019 um 20:57 Uhr) Grund: typo

  2. #2
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    18.03.2018
    Beiträge
    2.650
    Danke für Deine Ausführungen!

    Das war das, was ich machen wollte. Inzwischen bin aber unsicher, ob ich damit besser gestellt bin.

    strtok() gibt nur Zeiger zurück. Dann müsste ich die Zeichenketten erst ins Array kopieren, um sie später auszuwerten. So weit ich gesehen habe, kann ich die aber auch genügend über div. Funktionen und Pointer auswerten.

    Denke ich so richtig?

    Wobei ich mich noch frage, was strtok() genau macht. Ich bekomme dort verschiedene Zeiger auf die Teilzeichenketten zurück. Erstellt strtok() jetzt selber schon ein Array mit den Zeichenketten, zu denen ich nur die Pointer bekomme?
    Bei dieser Funktionalität steige ich noch nicht richtig durch.



    MfG

  3. #3
    HaWe
    Gast
    nein, strtok ermittelt eine gefundene Speicheradresse eines cstrings (edit: ) vor/bis zur ersten angegebenen delimiter-Bruchstelle,
    und der Ausgangs-cstring wird entsprechend heruntergekürzt (der Rest-cstring hinter dem 1. delimiter):

    char * strtok ( char * str, const char * delimiters );

    Parameters

    str
    C string to truncate.
    Notice that this string is modified by being broken into smaller strings (tokens).
    Alternativelly, a null pointer may be specified, in which case the function continues scanning where a previous successful call to the function ended.
    delimiters
    C string containing the delimiter characters.
    These can be different from one call to another.


    Return Value
    If a token is found, a pointer to the beginning of the token.
    Otherwise, a null pointer.
    A null pointer is always returned when the end of the string (i.e., a null character) is reached in the string being scanned.
    ersetze mal im Beispiel printf durch Serial.println und main() durch void setup() und du wirst sehen, was passiert:

    Example
    http://www.cplusplus.com/reference/cstring/strtok/

    Code:
    /* strtok example */
    #include <stdio.h>
    #include <string.h>
    
    int main ()
    {
      char str[] ="- This, a sample string.";
      char * pch;
      printf ("Splitting string "%s" into tokens:\n",str);
      pch = strtok (str," ,.-");
      while (pch != NULL)
      {
        printf ("%s\n",pch);
        pch = strtok (NULL, " ,.-");
      }
      return 0;
    }


    Output:

    Code:
    Splitting string "- This, a sample string." into tokens:
    This
    a
    sample
    string
    Geändert von HaWe (28.10.2019 um 16:02 Uhr)

  4. #4
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    18.03.2018
    Beiträge
    2.650
    Ich habe jetzt folgendes ausprobiert:

    Das ursprüngliche Char-Array mit strtok() bearbeitet.
    Die zurückgegebenen Pointer gespeichert.
    Das ursprüngliche Char-Array mit einem andern String überschrieben und die gespeicherten Pointer von strtok() zur Ausgabe verwendet.

    Jetzt stellt sich das so dar:

    Es wird kein zusätzlicher Speicher durch strtok() reserviert, um die Teilzeichenketten woanders zu speichern.
    strtok() fügt an den Trennzeichen der Tokens offenbar ein Endezeichen (0) ein, also werden dann die Trennzeichen überschrieben mit 0. Der ursprüngliche Inhalt des Char-Array wird also überschrieben.
    Wenn nun mittels Serial.println(xxx[index]); die Teilzeichenketten ausgegeben werden, funktioniert das mit dem ursprüngliche Char-Array, bearbeitet von strtok(), wie erwartet.
    Wenn das Char-Array überschrieben wurde, werden trotzdem (aufgrund der Pointer in das Array) Teilzeichenketten ausgegeben und zwar jeweils von der Position, die durch den Pointer im Array bestimmt ist, bis zum Ende des Char-Arrays (bzw. bis ein Endezeichen - vermutlich 0 - auftritt).

    Die Pointer von strtok() zeigen in das Char-Array, das von strtok() bearbeitet wurde.
    Ist daher mit den Zeigern eine sparsame Methode und durchaus nicht unpraktisch, solange das Char-Array nicht erneut überschrieben wird, bevor die Tokens alle verarbeitet sind. Was ansich auch eine Falle beim Programmieren sein und zu unerwarteten Ergebnissen führen kann.
    Geändert von Moppi (28.10.2019 um 16:18 Uhr)

  5. #5
    HaWe
    Gast
    ja, ganz genau, genau das meinte ich oben mit "ermittelt eine Speicheradresse" und "kürzt den rest-cstring herunter" (der cstring-Anfangspointer wird einfach ein Stück erhöht).
    willst du die tokens zwischenspeichern, kannst du sie auf andere char* Variaben übertragen oder per strcpy/strncpy in char[] hineinkopieren.
    Willst du den Ausgangs-cstring behalten, musst du ihn ebenfalls zwischenspeichern.

  6. #6
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    18.03.2018
    Beiträge
    2.650
    Ja, so siehts aus.

    Danke Dir!

    - - - Aktualisiert - - -

    Daher muss ich aber die Pointer auch nicht speichern, das ist unnütz. Wenn, müsste ich die Teilzeichenketten speichern, wie Du beschrieben hast .
    Ich muss für jede weitere Teilzeichenkette einfach strtok() erneut aufrufen und bekomme den nächsten Zeiger.

  7. #7
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    11.12.2007
    Ort
    weit weg von nahe Bonn
    Alter
    40
    Beiträge
    3.416
    Ich wüsste aber auch keinen Vorteil, den auto_ptr für Arduino User bieten sollte
    du musst nicht selber new und delete auf den Objekten machen die du auf dessen Basis erstellst und er trackt für dich die Zugriffe wenn cih den unique_ptr richtig verstanden habe. Das Problem bei Objektorientiertem C++ mit New ist, dass du selber sicherstellen musstd ass du jedes Objekt sauber löschst bevor du die referenz darauf freigibst und der unique_ptr macht das alles für dich wenn du z.B. ein array von "MyString : std::unique_ptr" erstellst.

    Gerade weil ohne tieferes Wissen da viel Potential für crash drin steckt, vor allem auf einem uC

    da ist jedes "Sandardmittel" recht ... wenns denn drin wäre :P
    Es gibt 10 Sorten von Menschen: Die einen können binär zählen, die anderen
    nicht.

  8. #8
    HaWe
    Gast
    jaaaa - das wäre tatsächlich ein Vorteil!

    @moppi: ich meinte mit Teilzeichenketten die tokens, und das sind ja Pointer auf char

  9. #9
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    18.03.2018
    Beiträge
    2.650
    ich meinte mit Teilzeichenketten die tokens
    Das hoffe ich! Nur Tokens ist mir zu english. Deutsch kennt Worte, die einen Sachverhalt besser/präziser beschreiben können. Ich bleibe deshalb eigentlich lieber bei Deutsch.


  10. #10
    HaWe
    Gast
    stimmt
    aber wegen der tokens heißt die Funktion ja nun auch strtok
    Teilzeichenketten konnte man offenbar auch missverstehen als Rest-Strings
    Aber gut, das wir jetzt wissen was wir meinen und meinen was wir wissen

Ähnliche Themen

  1. Pointer auf Struct von Byte-Array
    Von Bumbum im Forum C - Programmierung (GCC u.a.)
    Antworten: 2
    Letzter Beitrag: 31.05.2013, 16:01
  2. Char mit array verbinden ?
    Von AsuroPhilip im Forum Software, Algorithmen und KI
    Antworten: 22
    Letzter Beitrag: 08.09.2011, 13:37
  3. gelöst : Frage zu C und 2 Dim char Array
    Von jar im Forum C - Programmierung (GCC u.a.)
    Antworten: 4
    Letzter Beitrag: 29.05.2007, 16:53
  4. zweidemensionales char-array
    Von p_mork im Forum C - Programmierung (GCC u.a.)
    Antworten: 1
    Letzter Beitrag: 15.03.2007, 16:54
  5. Cstring einem char array zuweisen
    Von ceekay im Forum Software, Algorithmen und KI
    Antworten: 8
    Letzter Beitrag: 17.04.2006, 10:20

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

Solar Speicher und Akkus Tests