Forum: Compiler & IDEs Arduino mehrdimensionale String Array dynamisch


von Andreas F. (codecasa)


Lesenswert?

Hallo

Ich würde gerne mit dem Arduino eine txt-datei über die serielle
Schnittstelle empfangen Zeile für Zeile und in Strings/Zeile Speichern.

Wie kann man das am besten mit Dynamischen Stringarray bewerkstelligen ?

Hier mal eine Codefragment:

if (Serial.available() > 0) {
          int i=0;
          int iWord = 0;

          while(Serial.available() > 0)
          {
            // get incoming byte:
            tmpSData[iWord] = Serial.read();
            if (tmpSData[iWord] == 59) iWord++;


            delay(2);
          }

          lcd.clear();
          lcd.setCursor(0,0);
          lcd.print(tmpSData);

    }

von Noname (Gast)


Lesenswert?

Und was soll uns das Codefragment nun nutzen?
Was darin ist Dein Versuch das Problem zu lösen?
Sehe weder ein Array von Strings noch etwelche Dynamik.

von Karl H. (kbuchegg)


Lesenswert?

Andreas Frauenstein schrieb:
> Hallo
>
> Ich würde gerne mit dem Arduino eine txt-datei über die serielle
> Schnittstelle empfangen Zeile für Zeile und in Strings/Zeile Speichern.
>
> Wie kann man das am besten mit Dynamischen Stringarray bewerkstelligen ?

aufwändig.

Du brauchst 2 dynamische Dinge:
in dem einen dynamischen Array werden Pointer zu den Zeileanfängen 
gespeichert und jede Zeile selbst wird auch wieder dynamisch allokiert.

Im Grunde baust du diese Struktur auf


   +--------+
   |    o----------------------->"Teststring1"
   +--------+
   |    o-----------------+
   +--------+             |
   |    o--------+        +------>"Teststring4"
   +--------+    |
                 |
                 +----------------->"Dies ist ein Test"

Kommt eine neue Zeile dazu, "Schon wieder ein Test", wird zunächst 
dynamisch Speicher für die Zeile allokiert


   +--------+
   |    o----------------------->"Teststring1"
   +--------+
   |    o-----------------+
   +--------+             |
   |    o--------+        +------>"Teststring4"
   +--------+    |
                 |
                 +----------------->"Dies ist ein Test"


                      "Schon wieder ein Test"

das Pointer Array um 1 Pointer erweitert

   +--------+
   |    o----------------------->"Teststring1"
   +--------+
   |    o-----------------+
   +--------+             |
   |    o--------+        +------>"Teststring4"
   +--------+    |
   |        |    |
   +--------+    +----------------->"Dies ist ein Test"


                      "Schon wieder ein Test"

und ein entsprechender Pointer eingetragen

   +--------+
   |    o----------------------->"Teststring1"
   +--------+
   |    o-----------------+
   +--------+             |
   |    o--------+        +------>"Teststring4"
   +--------+    |
   |    o   |    |
   +----|---+    +----------------->"Dies ist ein Test"
        |
        |
        +------------>"Schon wieder ein Test"


Anstelle eines Arrays von Pointern, könnte man (bei gleichzeitig höherem 
Speicherverbrauch) darüber nachdenken, eine lineare Liste zu 
programmieren, in der die Pointer abgelegt werden.

Eine wieder andere Lösung besteht zb darin, die jeweiligen Listenpointer 
nicht in einer eigenen Liste zu verwalten, sondern jeden String mit 
einem Pointer auf den nächsten String zu 'pimpen' und so die Verkettung 
der Zeilen zu machen.

Kommt halt immer auch darauf an, welche Operationen man letzten Endes 
mit diesem Text machen will.

Allerdings ist es das bei weitem einfachste, sich zu überlegen, wozu du 
das überhaupt brauchst und noch Möglichkeit die Speicherung eines 
kompletten Textes generell zu vermeiden, wenn es nur irgendwie möglich 
ist.

von Andreas F. (codecasa)


Lesenswert?

Ich glaube so dynamisch muss das dann auch nich sein weil ich einfach 
aus einer Seriellen Schnittstelle empfangen will:

Zeile für Zeile es wird nur einmal eine Textdatei geladen:

bei folgendem Code ist ja z.B das Problem das der Inhalt vor dem 
compilieren in den Speicher geschrieben wird und das die anzahl der 
Strings feststeht:

const char str1[] PROGMEM = "first_A";
const char str2[] PROGMEM = "second_A";
const char str3[] PROGMEM = "third_A";

const char * const strarray1[] PROGMEM =
{
   str1,
   str2,
   str3
};


Ich würde aber gerne immer nach einem Semikolon eine Neue Variable 
erstellen

sprich:
char str[] = serial.plaplapla oder "fdgrdgdfg"

ich brauch unbedingt hilfe ich hab ein Verständnissproblem mit Pointern 
und Zeigern vor allem wenn es um arrays oder sogar dynamischen arrays 
geht.




Also ich habe ein Controller für eine Maschiene mit LCD Programmiert und 
jetzt sollen an diese maschiene Jobs oder Programme per Serielle 
Schnittstelle oder auf sd Karten im txt format gesendet werden im 
folgenden mal eine Programm :

pname=Programm 01;

zeit(5s);
pmp(an);
zeit(15s);
san(an);
zeit(10s);
start_imp(0.5s,0.2s);
zeit(10m);
stop_imp();
san(aus);
zeit(2m);
pmp(aus);

end;



Bei einem Empfang im Arduino sollen Die Programme zum einen Feste im 
EEprom gespeichert werden und zum anderen in den Variablen damit ich die 
einzelnen Zeilen im LCD untereinander anzeigen kann und damit ich die 
Variablen später bei einem Programmstart auswerte und damit den Ablauf 
steurn kann:

Ich hoff ich war verständlich genug g

von Karl H. (kbuchegg)


Lesenswert?

Andreas Frauenstein schrieb:
> Ich glaube so dynamisch muss das dann auch nich sein

Wenn du dynamisch irgendwelche Inhalte übertragen willst, kommst du aber 
nicht darum herum.
Allerdings sagt ja kein Mensch (siehe weiter unten), dass du das, was du 
da empfängst auch in Textform speichern musst :-)


> ich brauch unbedingt hilfe ich hab ein Verständnissproblem mit Pointern
> und Zeigern vor allem wenn es um arrays oder sogar dynamischen arrays
> geht.

Tja. Dann wirst du das lernen müssen. Ich kann auch nicht Automechaniker 
spielen, wenn ich keine Ahnung davon habe, wie das mit den Sychronringen 
in einem Getriebe funktioniert.

> pname=Programm 01;
>
> zeit(5s);
> pmp(an);
> zeit(15s);
> san(an);
> zeit(10s);
> start_imp(0.5s,0.2s);
> zeit(10m);
> stop_imp();
> san(aus);
> zeit(2m);
> pmp(aus);
>
> end;

Und?
Wer sagt, dass diese Programm in Textform gespeichert werden muss?
Du hast Kommandos, jedem Kommando verpasst man eine Nummer. Und du hast 
mögliche Paramater zu den Kommandos. So viele Parameter werden es über 
die verschiedenen Kommandos gesehen ja nicht sein. Im obigen gibt es zb 
kein Kommando, welches mehr als 2 Parameter braucht. D.h man definiert 
sich ein e Struktur, die aus einer Kommandozahl und 2 Parametern besteht 
und legt sich ein Array mit (hausnummer, was halt noch in den Speicher 
passt) 500 derartigen Struktureinträgen an. Beim Lesen wird der Text 
sofort geparst und in dieses Array die jeweilige Kommandonummer samt 
Parametern abgelegt. Dann brauchst du keine Strings speichern und musst 
daher auch keinen Speicher dafür allokieren.

Und schon ist man das leidige Thema "dynamische Allokierung" los.

von Andreas F. (codecasa)


Lesenswert?

ah stimmt hast rech allein den spreicher den ich mir damit ersparre 
danke

aber gibt es in Arduino ist C überhaupt den sintax sruct ?

von Andreas F. (codecasa)


Lesenswert?

Irgendwie mach ich was falsch hat vieleicht jemand eine Idee?

Der empfängt immer alles sofort.




void load_program()
{
    if (Serial.available() > 0) {
              int i=0;
              char Word[30];
              String tmpString;
              String progName = "";


              while(Serial.available() > 0)
              {
                      // get incoming byte:
                      Word[i] = Serial.read();

                      if (Word[i] == 59)
                      {
                             tmpString = Word;

                                   if(tmpString.substring(0,5) == 
"pname")
                                   {
                                     progName = 
tmpString.substring(6,tmpString.length() - 7);
                                   }

                                   //if(tmpString.substring(0,tmpString.indexOf('(')) 
== "zeit")
                                   //{
                                      lcd.clear();
                                      lcd.setCursor(0,0);
                                      lcd.print(tmpString.substring(0,tmpString.indexOf('(')));

                                   //}


                             i = 0;

                      }

                      i++;

                      delay(2);
              }


        }
}

von Karl H. (kbuchegg)


Lesenswert?

> Der empfängt immer alles sofort.

Was mag das wohl bedeuten?

1
                      delay(2);
das will ich nicht gesehen haben.

von Andreas F. (codecasa)


Lesenswert?

Okay hab es hinbekommen lag am C++ Uploadercode

Ich muste nur auf die Usertasteneingabe warten dann konnte die 
Schnittstelle nicht frühzeitig geschlossen werden.

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.