Zeiger auf Elemente aus einem struct

OP #3172147
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
Gast #3172171
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
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
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

Eine eigene Frage? Dieser Thread ist über 13 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.