Forum: Compiler & IDEs struct Rückgabe von Funktion


von SichFragender (Gast)


Lesenswert?

Kleine Frage
ich würde gerne die Rückgabe einer Funktion über eine globale Variable
vom Typ struct ermöglichen.Um Platz zu sparen(hab ich aus dem C-
Tutorial) versteht sich.
Kann ich verschiedene Datentypen in dieses Bitfeldfeld schreiben ohne
das es zu Fehlern kommt, wenn sich die Struktur über mehrere Byte
erstreckt.



1
// ***********************************************************
2
// Project:
3
// Author:
4
// Module description:
5
// ***********************************************************
6
// 
7
// -----------------------------------------------------------
8
// Struct 'Daten'
9
// Daten.bModus  -  0 Ankerspannung | 1 Moment
10
// Daten.iUsoll  -  Sollwert Steuerspannung
11
// Daten.iUst    -  Istwert Ankerspannung
12
// Daten.iI      -  Istwert Strom
13
// -----------------------------------------------------------
14
//
15
16
17
#include <avr\io.h>              // Most basic include files
18
#include <avr\interrupt.h>       // Add the necessary ones
19
#include <avr\signal.h>          // here
20
21
// Datentypen / Strukturen
22
  struct {
23
    unsigned char bModus:1;   // 1 BIT
24
    unsigned long iUsoll:16;  // 16 BIT  Sollwert Steuerspannung
25
    unsigned long iUst:16;    // 16 BIT  Istwert Ankerspannung
26
    unsigned long iI:16;      // 16 BIT  Istwert Strom
27
  }Daten;
28
  
29
// Funktionen
30
void init(void)  {
31
// PD0..PD7 Ausgang            - D/A Wandler über R2R Netzwerk
32
// PC0..PC2 Eingang (A/D Wandler)  - Eingang der Ist-Werte
33
// PC3 Eingang                - Betriebsmodus
34
// PC4..PC6 Ausgang            - HD44780 Display Steuerleitungen
35
// PB0..PB7 Ausgang            - HD44780 Display Datenleitungen
36
// DDRB - Data Direction Register B
37
// 1 Ausgang  |  0 Eingang
38
DDRB = 0xFF;
39
DDRC = 0x00;
40
DDRD = 0xFF;
41
42
// PullUp Widerstände der Eingänge PC0..PC3 aktivieren
43
PORTC = 0x0F;
44
}
45
46
void Lesen(void)  {
47
// Lesen der Eingangswert
48
// Usoll - PC0(ADC0)
49
// Ust  - PC1(ADC1)
50
// i    - PC2(ADC2)
51
// Modus  - PC3
52
Daten.bModus = PINC&(1<<PINC3);
53
}
54
55
int main(void) {
56
  unsigned long test = 0;
57
  void init(void);            // PORT Zustände setzen
58
   while(1) {
59
     void Lesen(void);
60
      Daten.bModus = PINC3;
61
   }
62
}

von The Daz (Gast)


Lesenswert?

Klar geht das. Aber :

Daten.bModus = PINC&(1<<PINC3);

wird wohl immer 0 im bModus Feld hinterlassen. Diese Zuweisung nimmt
das niederwertigste bit aus dem rechten Ausdruck und kopiert ihn nach
bModus.

von The Daz (Gast)


Lesenswert?

iUsoll, iUst und iI werden von dieser Operation nicht modifiziert.

von Karl heinz B. (kbucheg)


Lesenswert?

Na ja.
Wenn du schon Platz sparen willst, dann machs doch so:

struct {
  unsigned char bModus;
  unsigned int  iUsoll;    // 16 Bit
  unsigned int  iUst;      // 16 Bit
  unsigned int  iI;        // 16 Bit
} Daten;

in Summe dürfte diese Struktur kleiner sein, als
deine ursprüngliche. Es besteht kein Grund da mit
Bit-Angaben zu werken. Wenn es einen 16Bit Datentyp
gibt, benutze ihn auch!

PS: Warum benutzt heutzutage eigentlich jeder anonyme structs?
In ganzen 20 Jahren Industrieprogrammierung hab ich nicht eine
anonyme struct gebaut bzw. in fremden Libraries gesehen. Und hier
im Forum wimmelt es nur so davon.

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.