Go Down

Topic: Frage zur Array Nutzung (Read 1 time) previous topic - next topic

michael_x

Quote
Wochentage müssen nie erweitert werden
Das ist ein gutes Argument.

Allerdings sagt keiner, dass immer nach Wochentagen unterschieden wird ( Was ist mit "Feiertag" , "bei Nordwind" ? usw.)

Schuppeste

Als Byte pro DOW könnte man für jeden Tag auch noch verschiedene Zustände speichern.

z.B. Größer 0 = Ein, Größer 1=Zyklusintervall oder noch ganz andere Sachen..

die unteren 4 Bit Zyklus/Intervallinformation, die oberen 4Bit für 0/1 Parameter.

Serenifly

#17
Mar 26, 2018, 04:28 pm Last Edit: Mar 26, 2018, 04:29 pm by Serenifly
Als Byte pro DOW könnte man für jeden Tag auch noch verschiedene Zustände speichern.

z.B. Größer 0 = Ein, Größer 1=Zyklusintervall oder noch ganz andere Sachen..

die unteren 4 Bit Zyklus/Intervallinformation, die oberen 4Bit für 0/1 Parameter.
Dann sollte man aber ein Bitfeld verwenden damit man gleich aussagekräftige Namen für die Informationen hat

Loschder

@ Schuppeste
Dein Vorschlag aus #12 ist doch ein zweidimensionales Array, oder bin ich da jetzt falsch?

AVR RAM wie auch Zugriffsgeschwindigkeit würde ich jetzt vernachlässigen, da ich in meinem konkreten Fall einen Due verwende und gerade einmal 16% belegt habe.

In Bitfelder muss ich mich erst noch einlesen...

MfG Chris

....

Schuppeste

@ Schuppeste
Dein Vorschlag aus #12 ist doch ein zweidimensionales Array, oder bin ich da jetzt falsch?
Jepp, wie schon einen vorher geschrieben könnte man größer 0 auch als Minuten Intervall oder Dosierungswert  benutzen.

Loschder

#20
Mar 26, 2018, 08:39 pm Last Edit: Mar 26, 2018, 09:41 pm by Loschder
Gefällt mir, somal ich eine Ebene davor 4 Modi pro Zone auswählbar machen möchte

Also:

1.Button  "man AUS"       =0
2.Button  "man EIN"        =1
3.Button  "Bodensensor"  =2
4.Button  "Timer"             =3

Wobei...umso mehr ich darüber grübel...vielleicht auch ein 3d array und dazu die start/stop zeiten hinterlegen


....

Schuppeste

Geht doch auch mit eindimensionalen Arrays, das ist  ja nur Speichern ohne System da man den Array ja nicht durchsuchen muss.

Angenommen Array sieht so aus
Element- inhalt zonenzeiten
0 zone1 sonntag ein
1 zone1 sonntag aus
2 Zone1 montag ein
............

Dann holt man sich den Wert aus jeder Zone für heute..
Code: [Select]
Einzeitenheute [7]
For(int z=0;z<zonemax;z++){
Einzeitenheute[z]=zonenzeiten[z*7+Dow*2];
Auszeitenheute[z]=zonenzeiten[z*7+Dow*2+1];
}


Auch beim setzen der Zeiten kann man die Formel (zone-1)*7+dow*2 benutzen.

Hoffe ich hab jetzt keinen Denk/Rechenfehler. :smiley-confuse:


postmaster-ino

Hi

Unterm Strich sieht's im Speicher bei einem zwei/mehrdimensionalem Array auch nicht aus - wobei man Das dann nicht bedenken muß, man greift halt einfach auf die zonenzeit[z][Dow] zu.
(oder umgekehrt)

MfG

combie

Wobei...umso mehr ich darüber grübel...vielleicht auch ein 3d array und dazu die start/stop zeiten hinterlegen
Gute Idee!
Erst fertig denken, DANN die Datenstrukturen festlegen.
Schreie nach Besserem, bis du es auch erhältst.
Das noch Bessere verabschiedet sich rechtzeitig vor deinem Lärm.

Quelle: Martin Gerhard Reisenberg

Schuppeste

Unterm Strich sieht's im Speicher bei einem zwei/mehrdimensionalem Array auch nicht aus
Stimmt, alles gehupft wie gesprungen.. es kommt eigentlich nur darauf an wie der der es umsetzen möchte für sich am besten liest und versteht.

michael_x

Quote
es kommt eigentlich nur darauf an wie der der es umsetzen möchte für sich am besten liest und versteht
Na, das sollte ja wohl gegen sowas wie
     z*7+Dow*2+1   
sprechen. Und wenn schon Arrays, sind Arrays von Arrays immer besser als mehrdimensionale Arrays.
Dass der Denkansatz hinterher in Maschinencode dasselbe Ergebnis bewirkt wie (z*7+Dow*2+1), kann im ungünstigen Fall natürlich mal passieren.
Auch dass "mehrdimensionale Arrays" und "Arrays von Arrays" eigentlich identisch sind, ist schon richtig, aber eher eine unnötige Schwierigkeit.

Schuppeste


Na, das sollte ja wohl gegen sowas wie
     z*7+Dow*2+1   
sprechen.
Entscheidet der der es verwendet / nicht verwendet. :smiley-lol:

Ich persönlich zähle meine Takte/Ram/Flash nicht wenns nicht zu knapp wird.. es sei denn es wird ein Funktionswirrwarr der eindeutig wie ein Knäul erscheint, das mach ich dann auch schlanker.

Ich benutze mal dies mal das, kommt immer auf den Anwendungsfall an und wie ich Lust habe.

Bei Pixeln z.B benutzt ich nur eindimensional. Solch eine Tabelle hier würde ich zweidimensional, aber nicht mehr Dreidimensional machen..

Vielleicht gibts irgendwo eine "Daten Library" *Duck und wech*

Loschder

sprechen. Und wenn schon Arrays, sind Arrays von Arrays immer besser als mehrdimensionale Arrays.
Also, ich möchte für mein Verständniss dann doch bei Arrays bleiben....

Code: [Select]

  //-------------------------------------------------------------------------------------------
  //       Wochentagregister      So,   Mo,   Di,   Mi,   Do,   Fr,   Sa
  bool Beregnungstag [6][7]= { {false,false,false,false,false,false,false},   //  Regner1, standard alle Wochentage aus
                               {false,false,false,false,false,false,false},   //  Regner2, standard alle Wochentage aus
                               {false,false,false,false,false,false,false},   //  Regner3, standard alle Wochentage aus
                               {false,false,false,false,false,false,false},   //  Regner4, standard alle Wochentage aus
                               {false,false,false,false,false,false,false},   //  Regner5, standard alle Wochentage aus
                               {false,false,false,false,false,false,false} }; //  Regner6, standard alle Wochentage aus
  //-------------------------------------------------------------------------------------------
  //        Werteregister            start,  stop, mode, Hum-Wert
  int Regnerwerte [6][4] = {        {  700,   730,    1,    50},     //  Regner1, standard Zeit 7:00-7:30, Modus auto, Feuchteschwellwert 50%
                                    {  730,   800,    1,    50},     //  Regner2, standard Zeit 7:30-8:00, Modus auto, Feuchteschwellwert 50%
                                    {  800,   830,    1,    50},     //  Regner3, standard Zeit 8:00-8:30, Modus auto, Feuchteschwellwert 50%
                                    {  830,   900,    1,    50},     //  Regner4, standard Zeit 8:30-9:00, Modus auto, Feuchteschwellwert 50%
                                    {  900,   930,    1,    50},     //  Regner5, standard Zeit 9:00-9:30, Modus auto, Feuchteschwellwert 50%
                                    {  930,  1000,    1,    50} };   //  Regner6, standard Zeit 9:30-10:00, Modus auto, Feuchteschwellwert 50%
  //-------------------------------------------------------------------------------------------



So ok?


MfG Chris
....

agmue

#28
Apr 20, 2018, 12:41 pm Last Edit: Apr 21, 2018, 11:10 am by agmue
So ok?
Ja, nur int braucht 32 Bits und hat ein Vorzeichen. Besser fände ich uint16_t.

Also, ich möchte für mein Verständniss dann doch bei Arrays bleiben....
Wie wäre es dann mit einem Feld aus Strukturen?

Code: [Select]
// getestet mit Teensy 3.2
struct Regnerwerte
{
  bool So, Mo, Di, Mi, Do, Fr, Sa;
  uint16_t start, stop;
  byte mode, Hum_Wert;
};
Regnerwerte zone[] =
  //  So,    Mo,    Di,    Mi,    Do,    Fr,    Sa, start,  stop, mode, Hum-Wert
{ {false, false, false, false, false, false, false,  700,   730,    1,    50}, //  Regner1
  {false, false, false, false, false, false, false,  730,   800,    1,    50}, //  Regner2
  {false, false, false, false, false, false, false,  800,   830,    1,    50}, //  Regner3
  {false, false, false, false, false, false, false,  830,   900,    1,    50}, //  Regner4
  {false, false, false, false, false, false, false,  900,   930,    1,    50}, //  Regner5
  {false, false, false, false, false, false, false,  930,  1000,    1,    50}  //  Regner6
};
const byte ANZREG = sizeof(zone)/sizeof(zone[0]);
byte regner;

void setup()
{
  Serial.begin(9600);
  delay(2000);  // sonst wird nicht angezeigt
  for (regner = 0; regner < ANZREG; regner++) {
    Serial.print(F("Regner: "));
    Serial.print(regner + 1);
    Serial.print(F("\tSo "));
    Serial.print(zone[regner].So);
    Serial.print(F("\tMo "));
    Serial.print(zone[regner].Mo);
    Serial.print(F("\tDi "));
    Serial.print(zone[regner].Di);
    Serial.print(F("\tMi "));
    Serial.print(zone[regner].Mi);
    Serial.print(F("\tDo "));
    Serial.print(zone[regner].Do);
    Serial.print(F("\tFr "));
    Serial.print(zone[regner].Fr);
    Serial.print(F("\tSa "));
    Serial.print(zone[regner].Sa);
    Serial.print(F("\tstart "));
    Serial.print(zone[regner].start);
    Serial.print(F("\tstop "));
    Serial.print(zone[regner].stop);
    Serial.print(F("\tmode "));
    Serial.print(zone[regner].mode);
    Serial.print(F("\tHum-Wert "));
    Serial.print(zone[regner].Hum_Wert);
    Serial.println();
  }
}

void loop() {}

Das Feld beginnt bei 0, Dein Regner bei 1, daher habe ich in der Ausgabe eins draufgezählt.

EDIT 20180421: ANZREG wird jetzt berechnet.

Loschder

#29
Apr 20, 2018, 06:48 pm Last Edit: Apr 20, 2018, 06:49 pm by Loschder
Code: [Select]


...
Regnerwerte zone[] =
  //  So,    Mo,    Di,    Mi,    Do,    Fr,    Sa, start,  stop, mode, Hum-Wert
{ {false, false, false, false, false, false, false,  700,   730,    1,    50}, //  Regner1
  {false, false, false, false, false, false, false,  730,   800,    1,    50}, //  Regner2
  {false, false, false, false, false, false, false,  800,   830,    1,    50}, //  Regner3
  {false, false, false, false, false, false, false,  830,   900,    1,    50}, //  Regner4
  {false, false, false, false, false, false, false,  900,   930,    1,    50}, //  Regner5
  {false, false, false, false, false, false, false,  930,  1000,    1,    50}  //  Regner6
};...


Hi agmue,

und wie funktioniert das Zugreifen?

z.B. das Ändern von einzelnen Bereichen Beispiel "Regner 3 den Mittwoch von false -> true"


MfG Chris
....

Go Up