Hallo bin mal wieder am verzweifeln! ich habe ein Array: struct{ uint8_t kanal; int8_t start; int8_t t_on; int8_t t_off; }led[datensatz_max]; der direkte Zugriff auf led[x].kanal usw ist kein Problem wenn ich jetzt indirekt über eine Funktion auf led.kanal zugreifen möchte zb über : serdata_to_data(led.kanal,3); oder : serdata_to_data(led[0].kanal,3); auf: void serdata_to_data(char *data,uint8_t max){ uint8_t dcount; for (dcount=0;dcount<max_empfang;dcount++)data[dcount]= max; } bekomme ich nur Fehlermeldungen. info! Struct habe ich genommen um die Daten ins EEPROM Schreiben zu können vielleicht kann mir jemand helfen ?
Wolfgang Hopperdietzel schrieb: > wenn ich jetzt indirekt über eine Funktion auf led.kanal zugreifen led.kanal existiert nicht. Du hast viele leds. Davon wählst du eine aus und veränderst deren kanal-Wert. Genau das ist die Bedeutung von led[x].kanal = 5; > möchte zb > > über : serdata_to_data(led.kanal,3); > oder : serdata_to_data(led[0].kanal,3); Was soll die Funktion tun? Beschreibe die gewünschte Funktionalität in Umgangssprache. Noch ist nicht klar, was du unter "ich möchte indirekt auf led.kanal zugreifen" verstehst.
BTW: Solche anonymen Strukturen
1 | struct{ |
2 | |
3 | uint8_t kanal; |
4 | int8_t start; |
5 | int8_t t_on; |
6 | int8_t t_off; |
7 | }led[datensatz_max]; |
sind keine gute Idee! Sie sind eigentlich nur dann sinnvoll, wenn man in einer Funktion mal schnell eine Struktur benötigt, was selten genug vorkommt, oder in einer union/struct eine geschachtelte struct (aus welchem Grund auch immer) erzeugen will. Aber als Datenstruktur, in der Werte tatsächlich für länger gespeichert werden, sind sie absolut fehl am Platze. Gib dem Datentyp einen Namen! Dann kannst du dir auch schöne verarbeitende Funktionen für diesen speziellen Datentyp bauen.
1 | struct led_Data_t { // so sieht prinzipiell eine LED aus |
2 | uint8_t kanal; |
3 | int8_t start; |
4 | int8_t t_on; |
5 | int8_t t_off; |
6 | };
|
7 | |
8 | typedef struct led_Data_t led_Data; // noch ein typedef um Tipparbeit zu sparen |
9 | |
10 | led_Data led[datensatz_max]; // hier sind alle Led versammelt |
11 | |
12 | // die Daten einer LED ausgeben
|
13 | void printLed( led_Data *singleLed ) |
14 | {
|
15 | printf( "Kanal: %u\n", singleLed->kanal ); |
16 | printf( "Start: %d\n", singleLed->start ); |
17 | printf( "Ein: %d\n", singleLed->t_on ); |
18 | printf( "Aus: %d\n", singleLed->t_off ); |
19 | }
|
20 | |
21 | // die Daten aller LED ausgeben
|
22 | void printAllLed() |
23 | {
|
24 | uint8_t i; |
25 | |
26 | for( i = 0; i < datensatz_max; ++i ) |
27 | printLed( &led[i] ); |
28 | }
|
Nur so als Beispiel, wie man mit benannten Strukturen arbeiten kann. printLed bekommt einen Pointer auf eine Led. printAllLed füttern diese Funktion mit den entsprechenden Pointern. Dazu muss die Funktion printLed aber auch einen Pointer auf eine Led vereinbaren können. Und dazu braucht es wiederrum einen benannte Struktur.
Das hier serdata_to_data(led[0].kanal,3); kann klarerweise nicht funktionieren. Deine Funktion hat die Signatur: void serdata_to_data(char *data,uint8_t max){ Das erste Argument muss also ein Pointer auf einen char sein. Du übergibst led[0].kanal Mal sehen. led ist das komplette Array led[0] ist ein Element aus dem Array, also eine komplette Struktur led[0].kanal wählt aus diesem einen Strukturelement den Eintrag 'kanal' aus. Das ist dann bereits ein uint8_t led[0].kanal ergibt einen Zahlenwert, nämlich die Kanalnummer der Led 0. Das ist aber nicht das was serdata_to_data haben möchte. Die möchte keinen Zahlenwert, sondern die Adresse an der sie etwas ablegen soll. Du willst also eigentlich die Adresse des Kanaleintrags der Led 0 haben, damit serdata_to_data dort was ablegen kann. Ergo: &led[0].kanal BTW: deine Funktion serdata_to_data sieht nicht richtig aus. Kann sein, dass das so stimmt. Möglich. Aber zumindest ist sie sehr ungewöhnlich. Und meistens ist es so, dass Funktionen die ungewöhnlich aussehen, bei Anfängern einfach nur völlig falsch sind.
Hallo erst mal danke für die schnellen Antworten. Die Struct : struct{ uint8_t kanal; int8_t start; int8_t t_on; int8_t t_off; }led[datensatz_max]; habe ich desshalb genommen um das ganze Datenpaket ins EEPROM schreiben und wieder lesen zu können. weiter greife ich direkt auf led[satz].kanal etz zu mit indirekt meine ich den Zugriff auf die 1. Variable in der Struct hier .kanal oder die 4. .t_off ohne deren Namen zu nennen zb led[variable][satz]= 99; und wie kann ich in einer Funktion auf die Variable zugreifen ? zu deiner Antwort: woher kommt jetzt singleLed in void printLed( led_Data *singleLed ) ? zu meiner Funktion wiso sollte sie fehlerhaft sein dcount,data und max ist deklariert. und in einer for Schleife wird Data ein wert zugewiesen sicher nicht der Stoff für eine Funktion war nur als Aschauung. zu deiner LED Ausgabe die sieht bei mir so aus void seriellData(){ char send[100]; uint8_t cout; uint8_t help_flash; uint8_t help_kanal; uint8_t help_led; for (cout=0;cout<datensatz_max;cout++){ help_flash= led[cout].kanal & 0b00001000; help_kanal= led[cout].kanal & 0b00000111; help_led = led[cout].kanal>>4; sprintf(send , "Satz %03d Kanal %03d Start %03d T_ON %03d T_OFF %03d Flash %03d LED %03d", cout,help_kanal,led[cout].start,led[cout].t_on,led[cout].t_off,help_flas h,help_led); uputsnl(send ); } uputintnl(datensatz_max); }
Wolfgang Hopperdietzel schrieb: > oder die 4. .t_off ohne deren Namen zu nennen > > zb led[variable][satz]= 99; Das geht offiziell so nicht. Wenn du das willst, dann nimm ein 2-D Array. > zu meiner Funktion wiso sollte sie fehlerhaft sein > dcount,data und max ist deklariert. > und in einer for Schleife wird Data ein wert zugewiesen Weil sie seltsam aussieht. Insbesonder mit diesen Variablennamen und unter Berücksichtigung desen was in der Funktion geschieht.
Hallo, darf ich fragen was hier mit Tipparbeit erspart gemeint ist? Für welchen weiteren Ausbau ist das angedacht?
1 | struct led_Data_t { // so sieht prinzipiell eine LED aus |
2 | uint8_t kanal; |
3 | int8_t start; |
4 | int8_t t_on; |
5 | int8_t t_off; |
6 | };
|
7 | |
8 | typedef struct led_Data_t led_Data; // noch ein typedef um Tipparbeit zu sparen |
9 | |
10 | led_Data led[datensatz_max]; // hier sind alle Led versammelt |
man könnte doch schreiben ...
1 | struct led_Data_t { // so sieht prinzipiell eine LED aus |
2 | uint8_t kanal; |
3 | int8_t start; |
4 | int8_t t_on; |
5 | int8_t t_off; |
6 | }led[datensatz_max]; |
Es geht um das nicht mehr tippen von "struct" bei weiteren Variablendefinitionen. In C++ kannst du das einfach weglassen, bei C jedoch nicht. Darum das typedef.
Checker schrieb: > man könnte doch schreiben ... Könnte man. Aber jedesmal, wenn irgendwo der Strukturtyp benötigt wird, sei es, um einen Pointer drauf zu vereinbaren, oder um einen Funktionsparameter zu basteln, muss man "struct led_Data_t" schreiben, anstelle von "led_Data". Obendrein kann diese Strukturdefintion/deklaration nicht sinnvoll in einer Headerdatei untergebracht werden, weil dann die Variable led[] jedesmal beim Einbinden der Headerdatei erneut angelegt wird.
:
Bearbeitet durch User
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.