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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

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.