Länge eines Arrays herausfinden

Hallo,

ich hab ein kleines Programmierproblem. Ich habe ein String-Array z.B:

String meinArray[] = {"Hallo","Welt","dies","ist","ein","Test"};

wie bekomme ich jetzt die Länge des Arrays (also 6) heraus?

gibt es eine length, count oder ähnliche Funktion?

Gruß
Marcus

Ja, 6 ist richtig, weil Du ein 2 Dimensionale Array produziert hast.
Ein String ist für sich schon ein Array.
meinArray[0][] = "Hallo"; // Länge 6 Elemente, "H a l l o" und abschließende Null
meinArray[1][] = "Welt";
meinArray[2][] = "dies";
meinArray[3][] = "ist";
meinArray[4][] = "ein";
meinArray[5][] = "Test";
(weiß jetzt nicht ob die Syntax richtig ist).
Grüße Uwe

das is schon fast wahr... ein String ist KEIN Array - allerdings ist es wahr, dass ein String die einzelnen Chars indiziert sind (ähnlich eines Arrays)

Uwe, nichts für Ungut, aber ich programmiere inzwischen seit mehr als 20 Jahren in den verschiedensten Sprachen, mehr als 10 JAhre beruflich. Man muss mir nicht erklären, wie ein string funktioniert.

Dein Beispiel ist schlichtweg fasch.
Die rückgabe von meinArray[0] (Hallo) wäre per meinArray[0].length "5" und wenn man den einzelnen Char referenziert etwa

MeinArray[0][0] "H"
MeinArray[0][1] "a"
MeinArray[0][2] "l"
MeinArray[0][3] "l"
MeinArray[0][4] "0"

Aber das war nicht die Frage. Die Frage war:

GIBT ES EINE MÖGLICHKEIT, DIE LÄNGE (6) DES ARRAYS ZURÜCKZUBEKOMMEN?

http://www.arduino.cc/en/Reference/String:
Arrays of strings

It is often convenient, when working with large amounts of text, such as a project with an LCD display, to setup an array of strings. Because strings themselves are arrays, this is in actually an example of a two-dimensional array.

In the code below, the asterisk after the datatype char "char*" indicates that this is an array of "pointers". All array names are actually pointers, so this is required to make an array of arrays. Pointers are one of the more esoteric parts of C for beginners to understand, but it isn't necessary to understand pointers in detail to use them effectively here.

Example

char* myStrings[]={"This is string 1", "This is string 2", "This is string 3",
"This is string 4", "This is string 5","This is string 6"};

void setup(){
Serial.begin(9600);
}
void loop(){
for (int i = 0; i < 6; i++){
Serial.println(myStrings*);*

Ich muss mich bei dir entschuldigen - du hattest (wieder mal) Recht. Der Arduino sieht tatsächlich jeden String als char[], da String kein Datentyp sondern ein Konstrukt ist.

Nichts desto trotz funtioniert sizeof nicht bei einem String-array - und schon zweimal nicht bei mehrdimensionalen string-Arrays - die allgemein nicht möglich sind. Aber ich befürchte damit muss man sich abfinden, wenn man den Arduino programmiert - besonders elegante Wege funktionieren oft nicht.

Danke für die Entschuldigung; ich nehme sie gerne an.

Müßte das mit den Strings aber nicht ein Arduino-typisches Problem sein, sondern ein C-typisches?
Grüße Uwe

Man müsste so eine Art "foreach" - fürjedesElement Funktion haben, ich habe mal gegooglet :

http://www.freak-und-informatiker.de/2007/12/15/foreach-und-c/

Nach überfliegen der Seite war mir nicht klar ob der benötigte Befehlsumfang verfügbar ist :drooling_face:

Hallo zusammen,

ich möchte mich nach ein paar "Voruntersuchungen" auch mal zu dem Thema "String-Array" zu Wort melden :wink:

Der "normale" C-Programmierer versteht ja unter einem String überlicherweise ein "nullterminiertes array von chars". Die Strings in der String-Library von Arduino sind hingegen etwas anders aufgebaut. Die Strings sind hier jeweils Objekte der Klasse "String" (siehe Dateien wstring.cpp und wstring.h):

Sie bestehen im wesentlichen (natürlich abgesehen von Methoden, Konstruktoren, usw.) aus 3 Member-Variablen, von denen die erste ein Pointer auf einen mit malloc() dynamisch angeforderten Pufferbereich ist, weiterhin gibts eine int-Variable mit der aktuellen Länge der Zeichenkette (_length) und noch eine weitere Variable "_capacity", deren Bedeutung ich mir nicht genauer angesehen habe. In den Puffer werden dann beispielsweise im Konstruktor oder bei einer Zuweisung die Zeichenketten hineinkopiert.

Somit hat ein String immer eine konstante Länge von 6 Bytes (1x 16Bit-Pointer und 2x 16Bit-ints), unabhängig von der Länge der eigentlichen (im dynamisch angelegten Puffer befindlichen) Zeichenkette.

Die Anzahl der Elemente in einem String-Array bekommt man sehr wohl mit sizeof, indem man die die Größe des Gesamt-Arrays (von String-Objekten) durch die Größe eines einzelnen String-Objekts dividiert.

Für diejenigen, die es immer alles ausprobieren wollen, gibts hier den fertigen Code für Cut&Paste dazu:

String MeineStrings[] = {"string1", "noch einer", "und Numero 3", "einer geht noch..."};       // array von String-Objekten

void setup()
{
    Serial.begin(9600);
    
    char buffer[100];
    sprintf (buffer, "Groesse eines String-Objektes: %d bytes", sizeof(MeineStrings[0]));   // sizeof ein String-Objekt (nämlich das 1.)
    Serial.println(buffer);
    
    sprintf (buffer, "Gesamtgroesse aller String-Objekte: %d bytes", sizeof(MeineStrings));  // sizeof ganzes String-Array
    Serial.println(buffer);
    
    int size = (sizeof(MeineStrings)/sizeof(MeineStrings[0]));   // Anzahl Elemente
    sprintf (buffer, "Elemente in String-Array: %d", size);
    Serial.println(buffer);
}

void loop()
{
}

Die Größe des Arrays muss aber natürlich zur Compilerzeit feststehen. Methoden wie Length oder GetUpperBound wie in C# gibt es meines Wissens nicht. Im Übrigen müssten sie meiner Meinung nach ja auch Bestandteil einer Klasse "Array" (wie in C#) sein und nicht der Klasse "String".

Gruß
Wolfgang

Hallo Marcus,

ich liebe mehrdimensionale Arrays :wink: :wink: :wink:

String ZweiDimArray[][3] = { {"string1", "string2", "string3"},    // bis auf 1. Dimension muss Größe bekannt sein!
                              {"string4", "string5", "string6"}  };

void setup()
{
    Serial.begin(9600);
    
    char buffer[100];
    sprintf (buffer, "Groesse eines String-Objektes: %d bytes", sizeof(ZweiDimArray[0][0]));
    Serial.println(buffer);
    
    sprintf (buffer, "Gesamtgroesse aller String-Objekte: %d bytes", sizeof(ZweiDimArray));
    Serial.println(buffer);
    
    int size = (sizeof(ZweiDimArray)/sizeof(ZweiDimArray[0][0]));
    sprintf (buffer, "Elemente in String-Array: %d", size);
    Serial.println(buffer);
}

void loop()
{
}

Wolfgang

hmm. Und wieder was gelernt... Danke.
Meine Oma hat mal gesagt: "Man wird alt we eine Kuh und lernt immer noch dazu!"

Marcus
Das hätte ich auch nicht gewußt. :wink:
Grüße Uwe