Forum: PC-Programmierung Array und bubblesort um ein Element erweitern


von Hans (Gast)


Lesenswert?

Guten Tag,

ich will einen bubblesort Algorithmus um ein Element erweitern. (arduino 
IDE)

Reicht es wenn ich
1
for (uint8_t e = 0; e < 2; e++) {
in
1
for (uint8_t e = 0; e < 3; e++) {
ändere?
Es scheint zu funktionieren,aber mir ist nicht ganz klar warum bzw ob 
Fehler auftauchen können.
1
#define ARRAYTIEFE 2
2
-> neu #define ARRAYTIEFE 3
3
#define TYPE_ID 0
4
#define TYPE_STATE 1
5
-> soll dazukommen #define TYPE_INDEX 2
6
#define NUM_OF_MAX_SENSORS 10
7
byte sensor_AND_1[ARRAYTIEFE][NUM_OF_MAX_SENSORS] = { { 0 }, { 0 } }; 
8
-> neu byte sensor_AND_1[ARRAYTIEFE][NUM_OF_MAX_SENSORS] = { { 0 }, { 0 }, { 0 } }; 
9
10
11
12
for (uint8_t c = 0; c < NUM_OF_MAX_SENSORS - 1; c++) { // do a bubble sort
13
    for (uint8_t d = 0; d < NUM_OF_MAX_SENSORS - c - 1; d++) {
14
      if (sensor_AND_1[TYPE_ID][d] > sensor_AND_1[TYPE_ID][d + 1]) { // compare
15
        for (uint8_t e = 0; e < 2; e++) {  // swap both id & state
16
          int tempval = sensor_AND_1[e][d];
17
          sensor_AND_1[e][d] = sensor_AND_1[e][d + 1];
18
          sensor_AND_1[e][d + 1] = tempval;
19
        }
20
      }
21
    }
22
  }

von Hans (Gast)


Lesenswert?

Eine zusätzliche Frage..könnte man das Array sensor_AND_1 in der 
Funktion auch variabel machen, damit ich die ganze Sortiererei in eine 
eigen Funktion packen kann? zb
1
void sortieren(byte array){
2
..
3
}
um damit verschiedene Arrays zu sortieren?
1
sortieren(sensor_AND_1);
2
sortieren(sensor_AND_2);

von A. S. (Gast)


Lesenswert?

Geht alles, … irgendwie. Zumindest wenn klar ist, was gemacht werden 
soll.

Warum läuft e bis 2 und nicht bis zum zugehörigen #define?

von Hans (Gast)


Lesenswert?

Hallo.
da gab es keinen speziellen Grund, im aktuellen Code ist das jetzt 
übernommen

Also ich möchte das 3D Array sensor_AND_1 an eine Funktion übergeben. 
Mir ist diese Übergabe nicht klar

von Nick M. (Gast)


Lesenswert?

Hans schrieb:
1
> for (uint8_t e = 0; e < 2; e++) {  // swap both id & state
2
>           int tempval = sensor_AND_1[e][d];
3
>           sensor_AND_1[e][d] = sensor_AND_1[e][d + 1];
4
>           sensor_AND_1[e][d + 1] = tempval;
5
>         }

Also wenn ich mir das anschaue, dann kommt mir dein 2D-array schon 
grundlegend verkorkst vor.

Du schreibst im Kommentar "swap id & state", dabei änder sich aber der 
Index mit dem Namen "NUM_OF_MAX_SENSORS". Wie passt denn das zusammen? 
Wenn Du 10 Sensoren hast, dann kann doch auf index Ungerade nicht die id 
und auf Index Gerade der Zustand sein.

Bring das mal in Ordnung und verwende structs. Dann kapierst du und 
Andere das auch.

Oder stammt das Konstrukt aus der Arduino-IDE? Das würde einiges 
erklären!

von Nick M. (Gast)


Lesenswert?

Hans schrieb:
> Also ich möchte das 3D Array sensor_AND_1

Aha, dachte ich es mir doch. Das ist kein 3D-array. Bring den Mist erst 
mal auf ordentliche Beine und dann mach weiter.

Und danach nimm qsort aus der C-lib her ...

von Hans (Gast)


Lesenswert?

Das hilft mir jetzt leider nicht weiter. Ich möchte kein struct 
verwenden, sondern ein mehrdimensionales Array.

Die Sortierung scheint in der jetzigen Version ja zu funkionieren, oder 
sollte es nicht??
1
for (uint8_t c = 0; c < NUM_OF_MAX_SENSORS - 1; c++) { // do a bubble sort
2
    for (uint8_t d = 0; d < NUM_OF_MAX_SENSORS - c - 1; d++) {
3
      if (sensor_AND_1[TYPE_ID][d] > sensor_AND_1[TYPE_ID][d + 1]) { // compare
4
        for (uint8_t e = 0; e < ARRAYTIEFE; e++) { 
5
          int tempval = sensor_AND_1[e][d];
6
          sensor_AND_1[e][d] = sensor_AND_1[e][d + 1];
7
          sensor_AND_1[e][d + 1] = tempval;
8
        }
9
      }
10
    }
11
  }

von Nick M. (Gast)


Lesenswert?

Hans schrieb:
> Ich möchte kein struct
> verwenden, sondern ein mehrdimensionales Array.

Geh doch mal auf mein Posting von 18:17 ein und versuch das zu erklären 
was du da machst. IMHO ist das falsch.

Und wie viele Dimensionen hat dein Array jetzt? 2 oder 3?

Und du sollts dein mehrdimensionales array durch ein array von structs 
ersetzen, weil das mit deiner id und state ganz offensichtlich in die 
Hose gegangen ist. Der Grund ist, dass du deine Daten nicht ordentlich 
strukturiert hast. Sowas fängt prinzipiell mit einem typedef an (ausser 
den type gibt es schon).

von Hans (Gast)


Lesenswert?

Ich habe das Beispiel übernommen, weil ich selbst das nicht hinbekommen 
habe mit mehreren Dimensionen.
Das Array ist so definiert:
byte sensor_AND_1[3][10] = { {0}, {0}, {0} };

Das ist dann wohl ein 2D array. Ich bin da auch nicht so firm in dem 
ganzen und beschäftige mich nicht beruflich damit.

Das wäre das ganze Programm, welches wie gewünscht diese Aussage 
erzeugt:
Es wird nach ID sortiert und alles ID>0 ausgegeben
1
ID STATE INDEX
2
10 1 100
3
11 1 101
4
12 1 102
5
14 1 103
6
15 1 104
7
16 1 105
8
17 1 106
9
0 1 107
10
0 1 108
11
13 1 109
12
13
10 1 100
14
11 1 101
15
12 1 102
16
13 1 109
17
14 1 103
18
15 1 104
19
16 1 105
20
17 1 106
1
#include <Arduino.h>
2
3
#define EEPROM_AND1_0 100
4
#define EEPROM_AND1_1 101
5
#define EEPROM_AND1_2 102
6
#define EEPROM_AND1_3 103
7
#define EEPROM_AND1_4 104
8
#define EEPROM_AND1_5 105
9
#define EEPROM_AND1_6 106
10
#define EEPROM_AND1_7 107
11
#define EEPROM_AND1_8 108
12
#define EEPROM_AND1_9 109
13
14
#define ARRAYTIEFE 3
15
#define TYPE_ID 0
16
#define TYPE_STATE 1
17
#define TYPE_INDEX 2
18
#define NUM_OF_MAX_SENSORS 10
19
byte sensor_AND_1[ARRAYTIEFE][NUM_OF_MAX_SENSORS] = { { 0 }, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }, { EEPROM_AND1_0, EEPROM_AND1_1, EEPROM_AND1_2, EEPROM_AND1_3, EEPROM_AND1_4, EEPROM_AND1_5, EEPROM_AND1_6, EEPROM_AND1_7, EEPROM_AND1_8, EEPROM_AND1_9 } };
20
21
void setup() {
22
  Serial.begin(115200);
23
  Serial.println (__FILE__);
24
25
  sensor_AND_1[TYPE_ID][0] = 10;  sensor_AND_1[TYPE_INDEX][0] = EEPROM_AND1_0;
26
  sensor_AND_1[TYPE_ID][1] = 11;  sensor_AND_1[TYPE_INDEX][1] = EEPROM_AND1_1;
27
  sensor_AND_1[TYPE_ID][2] = 12;  sensor_AND_1[TYPE_INDEX][2] = EEPROM_AND1_2;
28
  sensor_AND_1[TYPE_ID][3] = 14;  sensor_AND_1[TYPE_INDEX][3] = EEPROM_AND1_3;
29
  sensor_AND_1[TYPE_ID][4] = 15;  sensor_AND_1[TYPE_INDEX][4] = EEPROM_AND1_4;
30
  sensor_AND_1[TYPE_ID][5] = 16;  sensor_AND_1[TYPE_INDEX][5] = EEPROM_AND1_5;
31
  sensor_AND_1[TYPE_ID][6] = 17;  sensor_AND_1[TYPE_INDEX][6] = EEPROM_AND1_6;
32
  sensor_AND_1[TYPE_ID][7] = 0;   sensor_AND_1[TYPE_INDEX][7] = EEPROM_AND1_7;
33
  sensor_AND_1[TYPE_ID][8] = 0;   sensor_AND_1[TYPE_INDEX][8] = EEPROM_AND1_8;
34
  sensor_AND_1[TYPE_ID][9] = 13;  sensor_AND_1[TYPE_INDEX][9] = EEPROM_AND1_9;
35
36
37
  Serial.println ("ID STATE INDEX");
38
39
  for (int i = 0; i < NUM_OF_MAX_SENSORS; i++)
40
  {
41
    Serial.print (sensor_AND_1[TYPE_ID][i]); Serial.print (" "); Serial.print (sensor_AND_1[TYPE_STATE][i]); Serial.print (" "); Serial.println(sensor_AND_1[TYPE_INDEX][i]);
42
  }
43
  Serial.println();
44
45
  for (uint8_t c = 0; c < NUM_OF_MAX_SENSORS - 1; c++) { // do a bubble sort
46
    for (uint8_t d = 0; d < NUM_OF_MAX_SENSORS - c - 1; d++) {
47
      if (sensor_AND_1[TYPE_ID][d] > sensor_AND_1[TYPE_ID][d + 1]) { // compare
48
        for (uint8_t e = 0; e < ARRAYTIEFE; e++) {  // swap both values & index
49
          int tempval = sensor_AND_1[e][d];
50
          sensor_AND_1[e][d] = sensor_AND_1[e][d + 1];
51
          sensor_AND_1[e][d + 1] = tempval;
52
        }
53
      }
54
    }
55
  }
56
57
  for (int i = 0; i < NUM_OF_MAX_SENSORS; i++)  {
58
    if (sensor_AND_1[TYPE_ID][i] > 0) {
59
      Serial.print (sensor_AND_1[TYPE_ID][i]); Serial.print (" "); Serial.print (sensor_AND_1[TYPE_STATE][i]); Serial.print (" "); Serial.println(sensor_AND_1[TYPE_INDEX][i]);
60
    }
61
  }
62
63
}
64
65
void loop() {
66
  // put your main code here, to run repeatedly:
67
68
}

von Nick M. (Gast)


Lesenswert?

Dann wünsche ich noch viel Erfolg auf dem langen Weg.

von Hans (Gast)


Lesenswert?

Super, danke

von Hans (Gast)


Lesenswert?

Kennt sich jemand anders damit aus wie man das Array an eine Funktion 
übergibt und dann damit weiter arbeitet?
Ich müsste 3 verschiedene Array sortieren. Jetzt kann ich natürlich 
einfach 3 mal den Sortiercode untereinanderpacken, aber vielleicht ginge 
es ja noch kompakter? Würde mich halt interessieren wie man das 
übergibt, ansonsten lass ich es so, da es wunderbar funktioniert.

von sid (Gast)


Lesenswert?

Nuja klar.. du kannst die Sortierschleife(n)
in eine funktion packen (void) und
der den pointer zu dem zu sortierenden Array übergeben,

welches Array du dann übergibst ist dann egal,
solange es passend dimensioniert und formatiert ist zur Sortierschleife 
versteht sich.

'sid

von foobar (Gast)


Lesenswert?

> Kennt sich jemand anders damit aus wie man das Array an eine Funktion
> übergibt und dann damit weiter arbeitet?
> Ich müsste 3 verschiedene Array sortieren. Jetzt kann ich natürlich
> einfach 3 mal den Sortiercode untereinanderpacken, aber vielleicht
> ginge es ja noch kompakter?

Du vertauscht erstmal die beiden Indizes (array[type][i] -> 
arry[i][type]).  Als nächstes schaust du dir an, was Structs sind und 
machst aus den "types" eine struct (byte array[i][type] ->  struct foo 
array[i]), und letzendlich schaust du dir die Doku zu qsort an.

von Andreas Rückert (Gast)


Lesenswert?

Bei so kleinen Zahlen würd ich da gar nix sortieren. Mach ein Array bis 
zu max ID und schreib da die Nummer vom Sensor rein? Danach einmal 
Schleife übers Array und wieder ausgeben?

von A. S. (Gast)


Lesenswert?

Das Problem sind nicht fehlende Experten oder Wille.

Das Problem ist ein völlig verkorksten Beispiel, aus dem nicht klar 
wird, was oder warum Du tust.

Höchstwahrscheinlich sind Arrays hier für Dich zu schwierig, weil bei 
ihnen die Größe nicht mit übergeben wird und die Bezeichnung der 
Bestandteile (Elemente, eher Dimensionen) ... schwierig ist .

Schau Dir deshalb structs an oder erkläre Deine Absicht und finde einen 
Kompromiss bei den Benennungen.

von PittyJ (Gast)


Lesenswert?

Hm, du versuchst zu Programmieren, indem du in irgendwelchen 
heruntergeladenen Quellen versuchst, Teile zu modifizieren?
Vielleicht wäre es einfacher, sich erst einmal ein Basisbuch zur 
Programmierung zu besorgen, damit man einzelne Konzepte versteht.

Mehrdimensionale Arrays in C sind immer etwas tricky, insbesondere wenn 
man Teile davon an Funktionen übergeben möchte.
Da du anscheinend auf Arduino programmierst, könntest du auch C++ nehmen 
Array in Klassen packen, und etwas Komplexität reduziert. Dann könnte 
z.B. man Referenzen auf einzelne Zeilen übergeben. Aber auch dafür 
fehlen wohl noch die Basics.

Fang mit einfacheren Sachen an.

von Hans (Gast)


Lesenswert?

>Fang mit einfacheren Sachen an.

Ich habe mir halt ein Gerät mit Display gebaut wofür ich es brauchte und 
es läuft ja nun wie gewünscht. Vielleicht nicht die eleganteste und 
minimalste Lösung, aber für die Praxis macht es keinen Unterschied.

Für Arrays habe ich mich entschieden, da ich einfacher auf bestimmte 
Inhalte zugreifen kann. Auch verstehe ich leider nicht mehr wie sich das 
mit typedef, struct und anderen Gebilden verhält. Eine für mich 
verständliche Anleitung konnte ich nicht finden.
Es ist nicht, dass ich es nicht wollte, mir wird es leider einfach nicht 
klar mit dem mir gefundenen Material. Allerdings habe ich mehrere Texte 
gefunden, die Arrays structs vorziehen auf MCU.

>Das Problem ist ein völlig verkorksten Beispiel, aus dem nicht klar

Ich habe doch extra den ganzen Code inkl Ausgabe geteilt.
Was ist denn da nicht klar? Jeder kann es ausführen bei sich und sieht 
was passiert.

qsort möchte ich vermeiden, da meine Arrays nicht groß sind und ich den 
zusätzlichen Speicherplatz sparen möchte, den diese Funktion verbrauchen 
würde. Laut Tests die ich gefunden habe, wäre das zudem bei meiner Größe 
sogar langsamer. Wobei die Geschwindigkeit bei meiner Anwendung jetzt 
keine Rolle spielt, aber der sehr knappe RAM schon.


>indem du in irgendwelchen heruntergeladenen Quellen versuchst, Teile zu 
modifizieren?

Ja in diesem Fall habe ich es als Baustein gesehen

von foobar (Gast)


Lesenswert?

> Es ist nicht, dass ich es nicht wollte, mir wird es leider einfach nicht
> klar mit dem mir gefundenen Material. Allerdings habe ich mehrere Texte
> gefunden, die Arrays structs vorziehen auf MCU.

Es geht nicht um array oder struct - das sind zwei verschiedene Dinge, 
die sich ergänzen.
1
#define NELEM(x) (sizeof(x) / sizeof(*(x)))
2
3
struct sensor {
4
  byte id, state, index;
5
};
6
7
struct sensor sensor_and_1[] = {
8
   { 10, 1, 100 },
9
   { 11, 1, 101 },
10
   { ... },
11
   ...
12
};
13
14
static void sensor_sort(struct sensor *array, size_t n)
15
{
16
  if (n > 1)
17
    for (size_t i=0; i<n-1; i++)
18
      for (size_t j=0; j<n-i-1; j++)
19
        if (array[j].id > array[j+1].id)
20
        {
21
          struct sensor t = array[j];
22
          array[j] = array[j+1];
23
          array[j+1] = t;
24
        }
25
}
26
27
  sensor_sort(sensor_and_1, NELEM(sensor_and_1));
28
  sensor_sort(another_array, NELEM(another_array));
29
  ...

von Hans (Gast)


Lesenswert?

Hallo,

danke ich versuche das mal nachzuvollziehen. Auf den ersten Blick ist 
das für mich sogar nachvollziehbar. Ich werde mal versuchen, ob ich auf 
die einzelnen Elemente zugreifen kann.

Diese ganze typedef-Geschichte sah für mich halt viel komplizierter und 
verwirrender aus als wenn man einfach  schreibt

byte sensor_AND_1[ARRAYTIEFE][NUM_OF_MAX_SENSORS] = { { 0 }, { 0 }, { 0 
} };

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.