Guten Tag zusammen
Ich versuche gerade ein 4 dimensionales Array Aufzustellen. Nun will bei
mir nicht in den Kopf wie ich dies nun darstellen muss.
Ich interpretiere es wie folgt, doch korrigiert mich bitte wenn ich
falsch liege:
static unsigned char SwitchTimes[20][2][4][2]=
Die 20 steht für die Anzahl Zeilen.
Die Zwei für die Anzahl Spalten.
Die 4 Für die Anzahl Ziffern die in dem Feld sein können.
Die 2te Zwei für die Anzahl Stapel die existieren.
Also wenn ich auf die 10. Zeile in der 2. Spalte die 3. ziffer auf dem
ersten Stapel will müsste das wie folgt aussehen:
x = SwitchTimes[10][2][3][1];
Doch entweder stimmt dies nicht oder meine Aufstellung der Tabellen
werte ist falsch. Ich stelle euch meine Definition und Deklaration der
Tabelle in den Anhang.
wie wärs mit einem struct das dir das ganze lesbarerer gestaltet
sonst bekommt man schon beim schreiben der eigentlich gewollten
funktionen einen knoten im kopf
Die Tabelle soll später für eine Funktion Schaltzeiten für zwei Relais
zur Verfügung stellen. 20 Zeilen weil ich 20 Schaltpunkte will. 2
Spalten für ein und Aus Zeit. 4 Werte weil ich Tag, Stunde, Minute und
Sekunde Speichern will.Und zwei Stapel weil die 2 Relais eigene Zeiten
haben. Daher denke ich ist eine 4d Tabelle das beste.
Kirsch schrieb:> ob eindimensionel oder mehr dimensionel>> die indexis gehen immer von 0 bis n-1>> |> ....................V> x = SwitchTimes[10][2][3][1];
Okey das wusste ich noch hatte es aber gerade nicht im Kopf beim
Beispiel schreiben aber danke
Hat jemand vlt gerade ein übersichtliches Beispiel einer 4d Tabelle zur
hand? Am besten eine bei der Alle werte in den eckigen Klammern anderst
sind um besser zu erkennen was für was steht.
Dominic K. schrieb:> Hat jemand vlt gerade ein übersichtliches Beispiel einer 4d Tabelle zur> hand? Am besten eine bei der Alle werte in den eckigen Klammern anderst> sind um besser zu erkennen was für was steht.
Ein N-Dimensonalles Array ist doch nur eine Struktur um Daten zu
speichen, was die einzelne dimension bedautet ist doch dir selbst
überlassen.
Dominic K. schrieb:> Die Tabelle soll später für eine Funktion Schaltzeiten für zwei Relais> zur Verfügung stellen. 20 Zeilen weil ich 20 Schaltpunkte will. 2> Spalten für ein und Aus Zeit. 4 Werte weil ich Tag, Stunde, Minute und> Sekunde Speichern will.Und zwei Stapel weil die 2 Relais eigene Zeiten> haben. Daher denke ich ist eine 4d Tabelle das beste.
1
typedefstruct{
2
uint8_tday;
3
uint8_thour;
4
uint8_tminute;
5
unit8_tsecond;
6
}Timestamp;
7
8
#define SUNDAY 0
9
...
10
#define SATURDAY 6
11
12
typedefstruct{
13
Timestampon;
14
Timestampoff;
15
}Switchpoint;
16
17
#define NOF_SWITCHPOINTS 20
18
19
Switchpointrelais1[NOF_SWICHTPOINTS];
20
Switchpointrelais2[NOF_SWITCHPOINTS];
21
22
relais1[0].on={SUNDAY,0,15,0};// first switchpoint ON is Sunday 0:15'00"
Sieht für mich besser aus als einen undurchsichtige 4D Tabelle
// Yalu war eine halbe Minute schneller :-D
Dominic K. schrieb:> 20 Zeilen weil ich 20 Schaltpunkte will. 2> Spalten für ein und Aus Zeit. 4 Werte weil ich Tag, Stunde, Minute und> Sekunde Speichern will.Und zwei Stapel weil die 2 Relais eigene Zeiten> haben. Daher denke ich ist eine 4d Tabelle das beste.
Bei wären das:
1
uint32_tSwitchTimes[2][40];
Die [2] sind die Relaisnummer.
Die [40] sind die 40 Zeiten, wovon die geraden einschalten und die
ungeraden aus.
Und uint32_t sind die Sekunden (z.B. seit 2000).
Übrigens:
Dominic K. schrieb:> 20 Zeilen weil ich 20 Schaltpunkte will. 2> Spalten für ein und Aus Zeit.
Das sind dann insgesamt 40 Schaltpunkte: 20x AN, 20x AUS.
Ist das so gewollt?
Mal so am Rande - warum muss es ANSI-C sein, eine 29 Jahre alte
Sprachversion? Für nahezu jede Plattform sollte es mittlerweile einen
Compiler für C99 oder gar C11 geben.
Dominic K. schrieb:> ie Tabelle soll später für eine Funktion Schaltzeiten für zwei Relais> zur Verfügung stellen. 20 Zeilen weil ich 20 Schaltpunkte will. 2> Spalten für ein und Aus Zeit. 4 Werte weil ich Tag, Stunde, Minute und> Sekunde Speichern will.Und zwei Stapel weil die 2 Relais eigene Zeiten> haben. Daher denke ich ist eine 4d Tabelle das beste.
wer sagt das da eine 4D tabelle am besten ist?
2D .. ok aber aslles darüber hinaus verwirrt und mach nur knoten im hirn
Dr. Sommer schrieb:> Mal so am Rande - warum muss es ANSI-C sein, eine 29 Jahre alte> Sprachversion? Für nahezu jede Plattform sollte es mittlerweile einen> Compiler für C99 oder gar C11 geben.
Weil ich Ansi-C gelernt habe und dadurch es am besten verstehen werde.
Und halt weil es sicher auf meinem Mikroprozessor läuft
> wer sagt das da eine 4D tabelle am besten ist?>> 2D .. ok aber aslles darüber hinaus verwirrt und mach nur knoten im hirn
Weil ich dan 2 mal die selbe Funktion in den Code nehmen müsste
Die Funktion ist ein Algorithmus der eine neue Zeit die neu gespeichert
wird mit allen bereits gespeicherten Zeiten vergleicht ob diese sich
nicht irgendwie überschneiden. es handelt sich um ziemlich viel code was
doppel wäre...
?
das musst du mal nächer erklären warum doppelt?
und warum das durchrollen der einträge viel code ist?
Viel code verstehe ich eher was ab 20000zeilen ..
Die sache mit den relais ist eher was auf 1-2 DIN A4 seiten.
Eric B. schrieb:>> #define NOF_SWITCHPOINTS 20>> Switchpoint relais1[NOF_SWICHTPOINTS];> Switchpoint relais2[NOF_SWITCHPOINTS];>> relais1[0].on = {SUNDAY, 0, 15, 0 }; // first switchpoint ON is Sunday> 0:15'00"> [/c]> Sieht für mich besser aus als einen undurchsichtige 4D Tabelle
Sieht für interessant aus bin nur gerade nicht sicher wie ich da die
Werte wieder auslesen kann. Angenommen ich will die Minute von Relais1
von der 3. Zeit stimmt dan der folgende Code
x = relais1[3].on->2
Das x ist hier nur ein Platzhalter.
43222342 schrieb:> ?> das musst du mal nächer erklären warum doppelt?> und warum das durchrollen der einträge viel code ist?>> Viel code verstehe ich eher was ab 20000zeilen ..>> Die sache mit den relais ist eher was auf 1-2 DIN A4 seiten.
Okey dan ist das Einstellungssache. ist natürlich nur ein kleiner
Teilausschnitt des ganzen. Und mich verwirrt das eher wenn code doppelt
vorkommt.
Teo D. schrieb:>> Ich würde aber mindestens die Zeiten nicht als Array, sondern als>> Intern nur mit Sekunden arbeiten, und nur für das HID aufbereiten.
macht die sache noch einfacher :-)
#define NOF_SWITCHPOINTS 20
#define NOF_RELAIS 2
typedef struct{
unsigned char day;
unsigned char hour;
unsigned char minute;
unsigned char second;
} Timestamp;
typedef struct {
Timestamp on;
Timestamp off;
} Switchpoint;
static Switchpoint relais[NOF_RELAIS][NOF_SWITCHPOINTS];
void TS_Setup(void)
{
unsigned char i;
while (i<20)
{
// relais[0][i].on = {255,255,255,255};
// relais[1][i].on = {255,255,255,255};
i++;
}
write_zahl(3,3,relais[0][2].on.minute,3,0,0);
}
Irgendwas mach ich noch falsch den Es kommen pro auskommentierte Linie
ein { Klammer Fehler sobald ich diese normal einsetze.
Und ja ein For wäre besser geeignet gewesen aber ich wollte die Funktion
nur 1 mal aufrufen und sicher sein das überall 255er drin stehen.
Dominic K. schrieb:> relais[0][i].on = {255,255,255,255};> // relais[1][i].on = {255,255,255,255};
Dieser Syntax geht nur bei der Initialisierung einer Struktur/Array,
aber nicht bei einer späteren Zuweisung.
muss du leider alles einzeln machen
relais[0][i].on[0] = 255;
relais[0][i].on[1] = 255;
relais[0][i].on[2] = 255;
relais[0][i].on[3] = 255;
Die Funktion um alle zu überschreiben geht nach dem includieren der
string.h library aber der befehl um auf eine einzelne zeit
einzuschreiben geht nicht:
relais[0][1].on[0] = 255;
Bringt denn error: subscripted value is neither array nor pointer nor
vector
Dominic K. schrieb:> relais[0][i].on = {255,255,255,255};
Das geht nur in C++.
In C (aber nicht in ANSI C) geht es mit Compound-Literals:
1
relais[0][i].on=(Timestamp){255,255,255,255};
In ANSI-C kannst du wie in deinem ersten Beispiel das gesamte Array
direkt bei seiner Definition initialisieren (s. Anhang).
Da du aber C99-Kommentare (mit //) benutzen kannst, ist dein Compiler
vielleicht gar nicht so altmodisch wie du denkst, so dass du nicht an
die ANSI-Restriktionen (von 1989) gebunden bist.
geht auch nur bedingt..
bin damit schon auf die nase gefallen.
das funzt erstmal auf den ersten blick
und vereinfacht ein memset()
aber je nach optimierer ist das auch schonmal irgendwo intern verendet