Verständnisproblem mit Sting-Matrix. Größenlimit?

Ja, nicht wahr!

Nur steht das in keinem Forenbeitrag oder Tutorial so erklärt.

Offensichtlich scheinst du die Eigenschaften de Sprache, welche du verwenden möchtest, recht vollständig zu ignorieren.
Vorwärtsstolpern, und potentielle Helfer verprellen, das scheint die bevorzugte Strategie zu sein.

Hier mal ein nettes Liedchen, habe ich extra für dich herausgesucht!

#include <Streaming.h> // die Lib findest du selber ;-)
Stream &cout {Serial}; // cout Emulation für AVR Arduinos

using FlashStrPtr = const __FlashStringHelper *;

const char myMatrix [8][8][5] PROGMEM = {
    {"0208","0108","0308","0316","0116","0216","0225","0225"},
    {"0211","0111","0311","0307","0107","0207","0206","0213"},
    {"0214","0114","0314","0319","0119","0219","0218","0204"},
    {"0209","0109","0309","0303","0103","0203","0118","0104"},
    {"0212","0112","0312","0317","0117","0217","0318","0304"},
    {"0205","0105","0305","0302","0102","0202","0306","0313"},
    {"0220","0120","0320","0315","0115","0215","0125","0225"},
    {"0201","0101","0301","0310","0110","0210","0106","0113"}
  };

String dateiname;

void setup() 
{
  Serial.begin(9600);
  dateiname.reserve(4+4+1);
  
  cout << F("Start: ") << F(__FILE__) << endl;

  for(auto &row:myMatrix)
  {
    for(auto &col:row)
    {
      dateiname = FlashStrPtr(col);
      dateiname += ".mp3";
      cout << dateiname << ' ';
    }
    cout << endl;
  }
}

void loop() 
{

}

Viel Erfolg auf deinen Wegen.

combie:
Ja, nicht wahr!
Offensichtlich scheinst du die Eigenschaften de Sprache, welche du verwenden möchtest, recht vollständig zu ignorieren.
Vorwärtsstolpern, und potentielle Helfer verprellen, dass scheint die bevorzugte Strategie zu sein.

Hier mal ein nettes Liedchen, habe ich extra für dich herausgesucht!

Würdest du mir und allen anderen bitte einen großen Gefallen tun? Spar dir deine dummen Provokations- und Lästerantworten. Oder wie immer man das nennen mag. Solche Antworten nützen keinem und stören nur den Forenfrieden. Ignoriere mich bitte in Zukunft, wenn du nichts Brauchbares an Antworten beitragen kannst oder willst!

Und bezüglich deiner Antwort. Ich bin Anfänger und betreibe "learning by doing" - und bevor ich Fragen stelle, suche ich selbst lange per Google oder Forensuche. Ich bin leider nicht so allwissend wie manche Andere hier.

Ja, so spricht ein würdiger Bewohner des "Mount Stupid".

lupus1952:
... und allen anderen ...

Hmm - dazu zähle ich mich jetzt mal nicht.

Meiner unmaßgeblichen Meinung nach ist - gerade bei größeren Sketches - der Speicher auf den Arduinos schnell mal knapp und manchmal merkt man es erst zur Laufzeit, weil irgendeine Lib da mehr braucht als Compiler und Linker am Ende des Bauens ausgeben.
Daher ist die Verlagerung der Daten nach PROGMEM sehr oft eine gute Idee und die präsentierte C++-Lösung eine recht elegante.

combie:
Ja, so spricht ein würdiger Bewohner des "Mount Stupid".

Wenn man keine Argumente mehr hat, dann kommen Belehrungen, Diffamierungen und Beleidigungen. Zum Glück sind ja nicht alle so wie Sie.

lupus1952:
Inzwischen weiß ich, wie das gemeint war. Nicht die Zahl der Matrixelemente in einer Reihe, sondern die Zahl der Elemente des längsten Strings + 1 (wegen der internen Abschluss-Null)

Auch das nicht. Das mit dem +1 gilt nur für char Arrays! Das ist was ganz anderes als die String Klasse

Nur steht das in keinem Forenbeitrag oder Tutorial so erklärt.

Bei zwei-dimensionalen Arrays wird das schon erklärt. Du kannst auch nach Array Tutorials ohne C String Bezug suchen. Das wird in umfangreichen C/C++ Kursen eigentlich gezeigt.

Drei-dimensionale Arrays dagegen verwendet man sehr selten. Daher gibt es dazu entsprechend wenig. Die sind hier auch gar nicht nötig. Egal wie man es macht

Ich bin als alter "Basic"ler sehr wohl (String-)Arrays gewohnt

Auf einem PC hast du GB an RAM. Auch früher gab es mehrere MB. Auf einem UNO hast du 2kB. Da muss man sich schon etwas mehr Gedanken machen was man damit tut.

Schau dir mal ein wie die Klasse intern aussieht:

protected:
 char *buffer;        // the actual char array
 unsigned int capacity;  // the array length minus one (for the '\0')
 unsigned int len;       // the String length (not counting the '\0')

Da gehen 6 Bytes weg bevor man überhaupt mal irgendwas abgespeichert hat. Dein Array belegt also das doppelte als das was du wahrscheinlich denkst.

Die String Klasse mag man hier überhaupt nicht und ich rate auch selbst oft davon ab. Aber bei manchen Anwendungen ist es nicht so schlimm wie man manchmal tut. Und es gibt inzwischen auch größere Prozessoren mit relativ viel RAM. Hier ist sie allerdings völlig fehl am Platz.

Und ein generelles Problem dabei ist das sie einerseits an Anfänger gerichtet ist um die Arbeit zu vereinfachen, aber Anfänger nicht das Wissen haben um zu entscheiden ob die Verwendung angebracht ist und sie dann richtig zu verwenden. Dinge wie Speicher reservieren oder Parameterübergabe als Referenz werden da praktisch nie beachtet.

Serenifly:
Auch das nicht. Das mit dem +1 gilt nur für char Arrays! Das ist was ganz anderes als die String Klasse
Bei zwei-dimensionalen Arrays wird das schon erklärt. Du kannst auch nach Array Tutorials ohne C String Bezug suchen. Das wird in umfangreichen C/C++ Kursen eigentlich gezeigt.

Drei-dimensionale Arrays dagegen verwendet man sehr selten. Daher gibt es dazu entsprechend wenig. Die sind hier auch gar nicht nötig. Egal wie man es macht

Auf einem PC hast du GB an RAM. Auch früher gab es mehrere MB. Auf einem UNO hast du 2kB. Da muss man sich schon etwas mehr Gedanken machen was man damit tut.

Schau dir mal ein wie die Klasse intern aussieht:

protected:

char *buffer;        // the actual char array
unsigned int capacity;  // the array length minus one (for the '\0')
unsigned int len;       // the String length (not counting the '\0')



Da gehen 6 Bytes weg bevor man überhaupt mal irgendwas abgespeichert hat. Dein Array belegt also das doppelte als das was du wahrscheinlich denkst.


Die String Klasse mag man hier überhaupt nicht und ich rate auch selbst oft davon ab. Aber bei manchen Anwendungen ist es nicht so schlimm wie man manchmal tut. Und es gibt inzwischen auch größere Prozessoren mit relativ viel RAM. Hier ist sie allerdings völlig fehl am Platz.

Und ein generelles Problem dabei ist das sie einerseits an Anfänger gerichtet ist um die Arbeit zu vereinfachen, aber Anfänger nicht das Wissen haben um zu entscheiden ob die Verwendung angebracht ist und sie dann richtig zu verwenden. Dinge wie Speicher reservieren oder Parameterübergabe als Referenz werden da praktisch nie beachtet.

Danke für deine Erklärungen. Inzwischen weiß ich da auch mehr.
Die Ursprungsfrage war ja was ich an der Array-Konstruktion falsch mache. Leider findet man unter "2D-Arrays mit Texten" per Suche kaum die Lösung. Eher nur immer mehr verwirrendes und halbes Allgemeinzeugs.
Dank dem erwähnten Post von TOMMY66, welcher das laiensicher super erklärt hat, bin ich nun fertig was diesen Teil des Programmes betrifft. Aber genau genommen fast ganz bis auf die MP3-Aufrufe aus dem Soudmodul und das ganze Auskommentieren von seriellen Hilfsprints.
Dann habe ich auf const und PROGMEM umgestellt. Danke an die Tippgeber dazu. Programmspeicher und RAM ist genug frei. Habe also noch genug Platz für weitere "Spielereien"
BTW: Ich bewundere die Leute, die offensichtlich mit einem Komplettwissen zu C++ und dem Arduino vom Himmel gefallen sind. Ich gehöre leider nur zu den normalen Leuten, die das Wissen und die Erfahrung selber schrittweise anlernen müssen.
Ich wünsche eine schöne Osterzeit soweit das mit den Coronamaßnahmen möglich ist.

lupus1952:
"2D-Arrays mit Texten"

Du suchst nach den falschen Begriffen. Ob du Texte oder was anderes darin abspeicherst spielt kein Rolle.
Außerdem ist ein Array aus C Strings (welche selbst nur null-terminierte Arrays aus char sind) automatisch ein zwei-dimensionales Array. Daher schreibst man das nicht noch mal extra hin.

Serenifly:
Du suchst nach den falschen Begriffen. Ob du Texte oder was anderes darin abspeicherst spielt kein Rolle.
Außerdem ist ein Array aus C Strings (welche selbst nur null-terminierte Arrays aus char sind) automatisch ein zwei-dimensionales Array. Daher schreibst man das nicht noch mal extra hin.

Ich suche gar nicht mehr. Das Problem ist gelöst. Ich habe natürlich mit allen möglichen Varianten gesucht. Egal. Es gab damals nur eine brauchbare Antwort von Tommy56, die auch wirklich laienverständlich ist. Alles andere ist von C++Spezialisten für Leute die wissen, dass C++ mit Pointern und Strings intern in Arrays und Pointern auf Arrayadressen usw........ - Einsteiger sind mit solchen Antworten schlicht überfordert. Und extra einen C++ Lehrgang bei der VHS zu machen um einem Arduino eine Textausgabe zu entlocken hat wohl niemand Lust.
Es hat sich aber auch selten jemand die Mühe gemacht das zu erklären. Im Netz gibt es unzählige Anfrage von Leuten, die im Prinzip das gleiche Problem hatten oder haben. Nur mal kurz und knackig zu beantworten, ohne lange Romane zu schreiben hat nur Tommy56 geschafft. Keine 10 Zeilen und der Kronleuchter ging an. So sieht Hilfe aus. Aber vielen anderen ist es wichtiger die Fragesteller zu blamieren, mit immer neuen OT-Fragen und Tipps zur Verzweiflung zu bringen oder sogar zu beleidigen. Das können manche hier besser als helfen. :frowning:
Nochmals Danke und Tschüss. Jetzt ist mein Bike dran.

noiasca:
Schritt 1: Umbauen auf byte

Wie willst Du 313 und ähnliche in Byte bekommen?

Gruß Tommy

lupus1952:
BTW: Ich bewundere die Leute, die offensichtlich mit einem Komplettwissen zu C++ und dem Arduino vom Himmel gefallen sind.

Die gibt es nur in Neidvorstellungen. Wir mussten alle den Weg das Lernens beschreiten, wir haben diesen Weg aber bewußt gewählt.

Gruß Tommy

Wir mussten alle den Weg das Lernens beschreiten, wir haben diesen Weg aber bewußt gewählt.

Und dabei auch so manches Jammertal durchschritten!
Wobei auch sicherlich noch einige folgen werden....
Denn von einem Hügel, kann man den nächst höheren zwar sehn, aber um ihn zu erreichen, ist wieder mal ein Tal zu durchqueren.


Aber, wie soll ichs sagen...
Es ist halt einfacher, den mit der schon gewonnenen Erkenntnis zu verurteilen, als sich selber der Aufgabe zu stellen.
Wie auch immer, "Töte den Boten, der schlechten Nachricht!", ist ein seit Jahrtausenden bewährtes Prinzip.
Warum sollte es gerade in DIESEM Forum nicht funktionieren?


Aus dem großen Themenbereich der Kompetenzstufenentwicklung:


Quelle

Tommy56:
Wie willst Du 313 und ähnliche in Byte bekommen?

Gruß Tommy

Mit "313" geht es natürlich nicht. Aber ich könnte alles anders organisieren. Mit "0313" spielt die passende "0313.MP3" mit dem Ansageinhalt "triple dreizehn". Die führenden 0 könnte man ganz weglassen. Ich könnte auch die Dateinamen mit Matrix-Spalten- und Zeilen machen. Also von 00.MP3 bis 77.MP3. Das würde die ganze Matrixgeschichte erübrigen. Allerdings werden dann eben die Dateinamen unübersichtlich und schwieriger am PC zu handeln. Dort werden die Sprachdateien zum großen Teil programmgesteuert über einen TTS-Konverter aus einer Exceltabelle als MP3 generiert und passend nummeriert. Da möchte ich nix mehr umstricken.
Es geht ja auch alles so wie es aussieht. Deine Erklärung von 2019 im anderen Forum, die ich heute Nacht zufällig gefunden habe, brachte die Erleuchtung. Und jetzt habe ich es als const und mit PROGMEM.
Danke!

lupus1952:
... brachte die Erleuchtung ...

... und eine besonders helle Erleuchtung nennt man Verblendung :-)))))

SCNR

Gregor

Tommy56:
Die gibt es nur in Neidvorstellungen. Wir mussten alle den Weg das Lernens beschreiten, wir haben diesen Weg aber bewußt gewählt.

Gruß Tommy

Neid habe ich bestimmt keinen. Auf dem Lernweg bin ich seit meiner Geburt. Und habe viele Stolperfallen gemeistert. Aber es nervt halt, wenn jemand einem beim Stolpern noch extra Steine in den Weg wirft. Egal - jetzt. Ich kann damit leben.

Tommy56:
Wie willst Du 313 und ähnliche in Byte bekommen?

in dem man das niedrigste Vorkommen (0101) davon abzählt und dies immer als Konstante dem Ergebnis aufschlägt.
Oder man nimmt halt eine zwei Byte Variable. Immer noch besser als 5 Byte.

Der TO wills aber eh nicht machen. Daher eh wurst.

This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.