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?
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.
ich möchte mich nach ein paar "Voruntersuchungen" auch mal zu dem Thema "String-Array" zu Wort melden
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".