Hallo,
probiere gerade meine bisherigen Funktionen ein wenig genereller zu
gestalten. Habe vier (Luft-)Pumpen mit zugehöriger Sensorik an einem AVR
hängen, d.h. zu einer Pumpe gehört genau ein Sensor usw. so dass sich
quasi immer ein zusammenhängendes Konstrukt ergibt wenn Statusänderungen
anstehen. Daher würde ich gerne über ein array das aus einem struct
besteht darauf zugreifen um es später auch noch zu verstehen. Denn ein
"setze an Portx den Pinx = 1" verstehe ich nicht, während hingegen ein
setze an Portx den Pin kanal_daten[0].on_off_pin (für mich)
verständlicher ist.
Scheitere aber schon bei der Zuweisung/Befüllung. Was mache ich falsch,
bzw. wie geht es richtig?
Gruß, Hans
1
#include<stdlib.h>
2
// Anzahl an Kanaelen
3
#define MAX_CH 4
4
// Aufzaehlung fuer die verfuegbaren Kanaele
5
enumnutzbare_kanaele{CH1=1,CH2=2,CH3=3,CH4=4};
6
// structure fuer Infos zum Anschluss der HW
7
structkanal_info{
8
enumnutzbare_kanaelenummer;
9
uint8_ton_off_pin;
10
uint8_tflowcontrol_pin;
11
uint8_tpwm_pin;
12
uint8_tpwm_timer;
13
};
14
// Array mit Infos/Daten fuer die Kanaele erstellen
Hans Schmidt schrieb:> Scheitere aber schon bei der Zuweisung/Befüllung. Was mache ich falsch
Das sagt dir eigentlich der Compiler.
Schau dir dazu auch mal an, wie OCR0A etc. definiert ist. Das ist kein
uint8_t.
Oliver
Hmmm, stehe leider weiter auf dem Schlauch...
@Wilhelm: na ja, normalerweise schreibe ich so etwas wie
meinArray[meinIndex] = gewünschterWert
Aber in einer Anleitung hieß es, ich muss immer das struct davor
schreiben. Eine Alternative wäre es per typedef einen neuen Typen zu
definieren. Das hatte ich aber nicht gemacht, um immer in Erinnerung zu
behalten: das ist ein struct.
Zum return Wert: eine (ur-)alte Version eines AVR Compilers hatte das
mal angemeckert. Gerade ausprobiert und wird aktuell tatsächlich nicht
angemahnt ==> fliegt demnächst raus.
@Oliver: Bei mir sind die ganzen Pins und Register defines die vom Wert
her in einen unit8 passen würden.
1
#define OCR0A _SFR_IO8(0x27)
Ich habe nur keine Ahnung was hinter dem eigentlichen define/dem special
functions register IO8 steht, evtl. ist da auch ein weiterer Fehler weil
dies den Wert 0x27=39dez noch einmal "aufbläht"
Bin leider so schlau wie vorher... Könnt ihr mir bitte noch einen Wink
mit dem Zaunpfahl geben?
Hans Schmidt schrieb:> @Wilhelm: na ja, normalerweise schreibe ich so etwas wie> meinArray[meinIndex] = gewünschterWert
Und genau das steht bei Dir eben nicht.
Bei Dir steht (in etwa)
datatype meinArray[meinIndex] = gewünschterWert;
Hans Schmidt schrieb:> @Oliver: Bei mir sind die ganzen Pins und Register defines die vom Wert> her in einen unit8 passen würden.#define OCR0A _SFR_IO8(0x27)
Dann schau doch mal nach ;-)
Armin J. schrieb:> const struct IRToCommandMappingStruct IRMapping[] ={> {COMMAND_BLINK, IR_COMMAND_FLAG_REGULAR, &doLedBlink20times,> blink20times },> {COMMAND_ON, IR_COMMAND_FLAG_REGULAR, &doLedOn, LEDon }> };
Und das ist keine Wertzuweisung, so wie er es machen möchte ...
Wilhelm M. schrieb:> Und das ist keine Wertzuweisung, so wie er es machen möchte ...
Möchte er das? Oder macht er das nur, weil er nicht weiß, wie eine
richtige Initialisierung geht?
Aber gut, auch Zuweisung geht.
Wilhelm M. schrieb:> Hans Schmidt schrieb:>> // für korrekte Syntax was zurückgeben>> return 0;>> Nicht notwendig: main() ist in verschiedenen Aspekten besonders.
Eine eher überflüssigen Regel, die man auch nicht unbedingt kennen muss.
Hallo,
@Oliver: mein Fehler. Ja, das muss natürlich rein, sonst sind die
Pindefinitionen nicht dabei. Da habe ich zu viel eingekürzt.
@Armin: danke dir. Da die Zuordnung konstant ist (spiegelt ja die HW
Anschlüsse wieder), reicht hier in der Tat eine "Konstante" auch aus und
ist sogar vermutlich die bessere Wahl
@Wilhelm: ja, das weiß ich. Das hatte ich aber wie gesagt bewusst so
gemacht. Hatte mich an der Stelle an diese Erklärung hier gehalten:
http://c-buch.sommergut.de/Kapitel13/Strukturen.shtml
Abschnitt Arrays aus Strukturen
1
/* nur eine Struktur initialisieren */
2
structadressekunden[100]={
3
{"Enn","Georg",236324,43788}
4
};
Dort steht grob gesagt "immer struct" davor
Habe zuerst die avr/sfr_defs.h nciht gefunden, die sagt mir
Hans Schmidt schrieb:> Abschnitt Arrays aus Strukturen/* nur eine Struktur initialisieren */> struct adresse kunden[100]={> {"Enn", "Georg", 236324, 43788}> };> Dort steht grob gesagt "immer struct" davor
Nein, es steht genau einmal davor - bei der Definition des Arrays.
Das wäre bei dir der Teil:
Hans Schmidt schrieb:> // Array mit Infos/Daten fuer die Kanaele erstellen> struct kanal_info kanal_daten[MAX_CH];
Und danach versuchst du, lauter neue Arrays mit gleichem Namen zu
definieren, eins mit 0 Elementen, eins mit einem Element u.s.w.:
> // Kanalinformationen in die Variable schreiben> struct kanal_info kanal_daten[0] = {CH1, PIND7, PINC0, PIND6, OCR0A};> struct kanal_info kanal_daten[1] = {CH2, PIND2, PINC1, PIND5, OCR0B};> struct kanal_info kanal_daten[2] = {CH3, PINC4, PINC2, PIND3, OCR2B};> struct kanal_info kanal_daten[3] = {CH4, PINC5, PINC3, PINB3, OCR2A};
Du musst lernen, was in C die drei Begriffe Definition, Initialisierung
und Zuweisung bedeuten. Denn das obige Beispiel nutzt eine Definition
mit Initialisierung. Du nutzt eine Definition ohne Initialisierung,
dafür machst du nachher Zuweisungen, die du aber so schreibst wie
Initialisierungen.
Einfach gesagt:
Hallo Rolf,
danke dir für die Klarstellung.
Dann ist das Beipiel in dem von mir gewählten Link "unglücklich", bzw.
weil immer nur Codeschnipsel da stehen aus dem Zusammenhang gerissen.
Denn dort gibt es dann doch auch eine Re-Definition, oder? Zuerst 100
Elemente (0...99) und dann eine Re-Defintion mit Initialisierung. Oder
kapiere ich es immer noch nicht?
Hans Schmidt schrieb:> Zuerst 100 Elemente (0...99) und dann eine Re-Defintion mit> Initialisierung. Oder kapiere ich es immer noch nicht?
Im Prinzip ist das richtig. Allerdings darfst du es nicht zweimal
definieren. Du müsstes die erste Definition also weglassen.
Hier kommt dann noch eine weitere Sache hinzu: Die Deklaration. Damit
wird nur der Name und Typ einer Variablen bekannt gemacht, aber sie wird
noch nicht erstellt.
Rolf M. schrieb:> Eine eher überflüssigen Regel, die man auch nicht unbedingt kennen muss.
Das main() aber 2 (-3) Signaturen hat, sollte man aber schon kennen.
Hans Schmidt schrieb:> Denn dort gibt es dann doch auch eine Re-Definition, oder?
Mache Dir den Unterschied zwischen Deklaration und Definition klar. Ist
absolut zentral in C/C++. Schaue mal nach ODR (one-definition-rule).
Als Eselsbrücke: für eine Definition benötigt der Compiler irgendwie
Speicher (für Variable, Funktionskörper, ...), bei einer Deklaration
wird nur der Name/Typ eines Symbols bekannt gemacht.
Hans Schmidt schrieb:> /* nur eine Struktur initialisieren */> struct adresse kunden[100]={> {"Enn", "Georg", 236324, 43788}> };Rolf M. schrieb:> Einfach gesagt:> Typ Name; // Definition> Typ Name = Wert; // Definition mit Initialisierung> Name = Wert; // Zuweisung
@Hans
Was du oben machst, ist die "Definition mit Initialisierung". Allerdings
für das erste Element (Index '0'!!) von 100 Elementen. Aber: das darf
nur einmal vorkommen. Die Variable "kunden" ist aber vorher schon
definiert worden. Dir bleibt in dem Fall nur die "Zuweisung":
Rolf M. schrieb:> Aber gut, auch Zuweisung geht.
1
kunden[99]=(structadresse){"Enn","Georg",236324,43788};// bei 100 Elementen ist '99' der letzte Index!