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.
Gast
#5335811
ob eindimensionel oder mehr dimensionel
die indexis gehen immer von 0 bis n-1
|
....................V
x = SwitchTimes[10][2][3][1];
Gast
#5335824
Dominic K. schrieb: > Ich versuche gerade ein 4 dimensionales Array Aufzustellen. SwitchTimes[320] wäre einfacher. Gruss
Dominic K. schrieb: > SwitchTimes[20][2][4][2] Das bedeutet folgende legale Index-Werte: SwitchTimes[0 - 19][0 - 1][0 - 3][0 - 1]
Gast
#5335836
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.
Gast
#5335976
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.
Deklaration und Initialisierung passen nicht zusammen. Gehen wir mal von der Initialisierung aus:
1 | |
2 | |
3 | |
4 | |
Genau in dieser Reihenfolge (also vom Groben zum Feinen hin) müssen auch die Größenangaben in der Deklaration auftauchen:
1 | |
Dann fehlt in Zeile 48 noch ein Komma. Ich würde aber mindestens die Zeiten nicht als Array, sondern als Struktur deklarieren, bspw. so:
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
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 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
13 | |
14 | |
15 | |
16 | |
17 | |
18 | |
19 | |
20 | |
21 | |
22 | |
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 | |
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?
Gast
#5335995
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.
Gast
#5336031
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
Gast
#5336034
mach das mit den structs und du bist in 2h fertig.
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
Dominic K. schrieb: > Weil ich dan 2 mal die selbe Funktion in den Code nehmen müsste Wöfür wäre(n) die dann?
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...
Gast
#5336115
? 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.
Gast
#5336146
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
13 | |
14 | |
15 | |
16 | |
17 | |
18 | |
19 | |
20 | |
21 | |
22 | |
23 | |
da man aber nur an oder aus braucht... kann man speicher sparen und das sogar zusammenfassen
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
13 | |
14 | |
15 | |
16 | |
17 | |
Yalu X. 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.
Gast
#5336168
43222342 schrieb: > Switchpoint relais[NOF_RELAIS][NOF_SWICHTPOINTS]; > > // werte aus Switchpoint 3 > // relais 1 > uint8_t min = relais[0][2].minute ; > > // relais 2 > uint8_t min = relais[1][2].minute ; korrektur
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
Gast
#5336172
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 :-)
Werde den Code implementieren und ein Test programm schreiben. Bin optimistisch das dieser funktioniert. Danke viel mals an alle
#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.
Gast
#5336259
memset( relais , 255, (sizeof(Switchpoint)*NOF_SWITCHPOINTS)*NOF_RELAIS );
Gast
#5336263
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;
Gast
#5336266
// alle ON einträge mit 0xff
for( i = 0; i< NOF_SWITCHPOINTS ; i++ ){
memset( &relais[0][i].on , 0xff , sizeof( Timestamp )) ;
}
// alle OFF einträge mit 0
for( i = 0; i< NOF_SWITCHPOINTS ; i++ ){
memset( &relais[0][i].off , 0 , sizeof( Timestamp )) ;
}
Gast
#5336276
43222342 schrieb: > // alle ON einträge mit 0xff > for( i = 0; i< NOF_SWITCHPOINTS ; i++ ){ > memset( &relais[0][i].on , 0xff , sizeof( Timestamp )) ; > } > > // alle OFF einträge mit 0 > for( i = 0; i< NOF_SWITCHPOINTS ; i++ ){ > memset( &relais[0][i].off , 0 , sizeof( Timestamp )) ; > } releais 2 vergessen // alle ON einträge mit 0xff for( i = 0; i< NOF_SWITCHPOINTS ; i++ ){ memset( &relais[0][i].on , 0xff , sizeof( Timestamp )) ; memset( &relais[1][i].on , 0xff , sizeof( Timestamp )) ; } // alle OFF einträge mit 0 for( i = 0; i< NOF_SWITCHPOINTS ; i++ ){ memset( &relais[0][i].off , 0 , sizeof( Timestamp )) ; memset( &relais[1][i].off , 0 , sizeof( Timestamp )) ; } oder bei mehereren relais for( i = 0; i< NOF_RELAIS ; i++ ){ for( k = 0; k< NOF_SWITCHPOINTS ; k++ ){ memset( &relais[i][k].on , 0xff , sizeof( Timestamp )) ; } }
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
Gast
#5336287
relais[0][1].on.hour = 10; relais[0][1].on.minute = 30; relais[0][1].on.second = 00; relais[0][1].on.day = 0;
43222342 schrieb: > relais[0][1].on.hour = 10; > relais[0][1].on.minute = 30; > relais[0][1].on.second = 00; > relais[0][1].on.day = 0; Okey klar demfall ist die Methode von Kirsch unpassend danke.
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 | |
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.
Gast
#5337020
das mit
1 | |
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
Antwort schreiben
Bitte melde dich an, um einen Beitrag zu schreiben.