Zeiger auf Elemente aus einem struct

OP #3172147
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
Persönliche Seite #3172166
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?
Gast #3172171
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
}
Gast #3172174
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
Gast #3172215
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren