Forum: Mikrocontroller und Digitale Elektronik Zeiger auf Elemente aus einem struct


von Großes F. (112)


Lesenswert?

Hallo,

ich hätte eine Frage zur C-Programmierung.

Ich habe ein struct, das wie folgt aufgebaut ist:
1
struct T_Messreihe
2
    {
3
uint16_t Messwert;
4
uint16_t Buffer_1[SAMPLES];
5
uint16_t Buffer_2[SAMPLES];
6
uint16_t Buffer_3[SAMPLES];    
7
uint16_t Bufferzeiger;
8
      
9
uint16_t Mittelwert_1;
10
uint16_t Mittelwert_2;
11
uint16_t Mittelwert_3;


Nun möchte ich in einer Funktion die Mittelwerte 1 bis 3 bestimmen, 
allerdings benötige ich nicht immer alle drei Mittelwerte.

Ich könnte nun also eine Funktion schreiben, die das struct als solches 
übergeben bekommt:
1
uin16_t Average(struct T_Messreihe* Data)
2
{
3
uint16_t Average_1 = 0;
4
uint16_t Average_2 = 0;
5
uint16_t Average_3 = 0;
6
7
{berechne Average_i};
8
  
9
Data->Mittelwert_1 = Average_1;
10
Data->Mittelwert_2 = Average_2;
11
Data->Mittelwert_3 = Average_3;
12
}

Das ist aber insofern ungünstig, weil die Buffer_1 bis Buffer_3 nicht 
gleichmäßig gefüllt werden und ich daher den Mittelwert eigentlich nur 
zu ganz bestimmten Zeitpunkten aktualisieren möchte.

Was ich also bräuchte wäre ein Funktionsaufruf in der Form
1
uin16_t Average("ZEIGER AUF ELEMENTE AUS DEM STRUCT")
2
{}

...nur wie baue ich eine solche Parameterübergabe, also so dass ich die 
Funktion "allgemein" halte und genau diejenigen Buffer auswerte, deren 
Mittelwert mich gerade interessiert?

mfg

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Großes Fragezeichen schrieb:
> Was ich also bräuchte wäre ein Funktionsaufruf in der Form
> uin16_t Average("ZEIGER AUF ELEMENTE AUS DEM STRUCT")
> {}

Und welche Elemente möchtest Du da übergeben?

Möchtest Du nur den Mittelwert eines der drei Arrays (Buffer_1 .. _3) 
berechnen, oder möchtest Du nur den Mittelwert eines Teiles der Arrays 
berechnen?

von Markus_AC (Gast)


Lesenswert?

Mach es doch so:
1
uin16_t Average(struct T_Messreihe* Data, int iCount1, iCount2, iCount3)
2
{
3
...
4
    calcAverage(Data->Buffer1, iCount1)
5
...
6
}

und dann
1
uin16_t calcAverage(uint16_t *pBuffer, int iCount)
2
{
3
    int i, Sum=0;
4
    for(i = 0; i < iCount; i++)
5
    {
6
        Sum += pBuffer[i];
7
    }
8
    return (uint16_t)(Sum/iCount);
9
}

von Oliver (Gast)


Lesenswert?

Ganz prinzipiell bekommt man in C eine Adresse über den Adress-Operator 
&.

Der lässt sich auf beinahe alles anwenden, incl. der Elemente eines 
Structs und/oder Arrays.

Ob das die Lösung für dein Problem ist, oder du eventuell die falsche 
Frage stellst, ist allerdings andere und weit wichtigere Frage.

Oliver

von Rolf Magnus (Gast)


Lesenswert?

Wenn ich dich richtig verstehe, willst du sowas wie einen Zeiger auf 
eine Kombination aus Buffer und Mittelwert. Warum kombinierst du die 
dann nicht einfach in einer struct?
1
struct Buffer
2
{
3
    uint16_t Werte[SAMPLES];
4
    uint16_t Mittelwert;
5
};
6
7
struct T_Messreihe
8
{
9
    uint16_t Messwert;
10
    struct Buffer Buffer_1;
11
    struct Buffer Buffer_2;
12
    struct Buffer Buffer_3;
13
    uint16_t Bufferzeiger;
14
};
15
16
uint16_t Average(struct Buffer* Data)
17
{
18
uint16_t Average_1 = 0;
19
20
{berechne Average_1};
21
  
22
Data->Mittelwert = Average_1;
23
}

Statt Buffer_1, Buffer_2 und Buffer3 könnte man auch gleich noch ein 
Array nehmen. Das macht's in der Regel an einigen Stellen auch 
einfacher.

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.