Forum: Compiler & IDEs Fehler beim Kompilieren von Gleitender Mittelwert Funktion / undefined reference to


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von PeterPanisch (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen,

Ich bin hier schon seit einiger Zeit stiller Mitleser und habe schon 
einige Probleme durch lesen in diesem Forum lösen können.

Leider verzweifel ich gerade an einem Code, den ich auf RN-Wissen 
gefunden habe. Nach stundenlanger Recherche kann ich hier keinen Fehler 
finden.

Der Compiler gibt mir immer wieder folgende Fehlermeldung:

Error  2  undefined reference to `AddToFloatAvg'
Error  3  undefined reference to `GetOutputValue'
Error  1  undefined reference to `InitFloatAvg'

Habe schon versucht die Funktionen mit extern und den Zeiger auf die 
Struktur mit volatile zu definieren. Leider ohne Erfolg...

Ich arbeite mit AVR Studio 6.2

Header
1
FloatingAverage.h
2
#ifndef FLOATING_AVERAGE_H
3
#define FLOATING_AVERAGE_H
4
5
#include <inttypes.h>
6
7
// Ueber wieviele Werte soll der gleitende Mittelwert berechnet werden?
8
// Zulaessige Werte 1..255
9
#define SIZE_OF_AVG  8
10
11
// Datentyp, ueber den der gleitende Mittelwert berechnet werden soll.
12
typedef uint16_t tFloatAvgType;
13
// typedef float tFloatAvgType;
14
15
// Wird nur intern fuer die Durchschnittsberechnung benutzt.
16
// Muss Zahlen fassen koennen, die SIZE_OF_AVG mal groesser als tFloatAvgType sind.
17
typedef uint32_t tTempSumType;
18
// typedef float tTempSumType;
19
20
// Die Struktur, in der die Daten zwischengespeichert werden
21
typedef struct
22
 {
23
  tFloatAvgType aData[SIZE_OF_AVG];
24
  uint8_t IndexNextValue;
25
 } tFloatAvgFilter;
26
27
28
// Initialisiert das Filter mit einem Startwert.
29
void InitFloatAvg(tFloatAvgFilter * io_pFloatAvgFilter,
30
      tFloatAvgType i_DefaultValue);
31
32
// Schreibt einen neuen Wert in das Filter.
33
void AddToFloatAvg(tFloatAvgFilter * io_pFloatAvgFilter,
34
       tFloatAvgType i_ui16NewValue);
35
36
// Berechnet den Durchschnitt aus den letzten SIZE_OF_AVG eingetragenen Werten.
37
tFloatAvgType GetOutputValue(tFloatAvgFilter * io_pFloatAvgFilter);
38
39
#endif
Quellcode
1
FloatingAverage.c
2
#include "FloatingAverage.h"
3
4
void InitFloatAvg(tFloatAvgFilter * io_pFloatAvgFilter, 
5
      tFloatAvgType i_DefaultValue)
6
{ 
7
   // Den Buffer mit dem Initialisierungswert fuellen:
8
  for (uint8_t i = 0; i < SIZE_OF_AVG; ++i)
9
  {
10
    io_pFloatAvgFilter->aData[i] = i_DefaultValue;
11
  }
12
  // Der naechste Wert soll an den Anfang des Buffers geschrieben werden:
13
  io_pFloatAvgFilter->IndexNextValue = 0;
14
} 
15
16
17
void AddToFloatAvg(tFloatAvgFilter * io_pFloatAvgFilter,
18
       tFloatAvgType i_NewValue)
19
{ 
20
  // Neuen Wert an die dafuer vorgesehene Position im Buffer schreiben.
21
  io_pFloatAvgFilter->aData[io_pFloatAvgFilter->IndexNextValue] =
22
    i_NewValue;
23
  // Der naechste Wert wird dann an die Position dahinter geschrieben.
24
  io_pFloatAvgFilter->IndexNextValue++;
25
  // Wenn man hinten angekommen ist, vorne wieder anfangen.
26
  io_pFloatAvgFilter->IndexNextValue %= SIZE_OF_AVG;
27
}  
28
29
30
tFloatAvgType GetOutputValue(tFloatAvgFilter * io_pFloatAvgFilter)
31
{
32
  tTempSumType TempSum = 0;
33
  // Durchschnitt berechnen
34
  for (uint8_t i = 0; i < SIZE_OF_AVG; ++i)
35
  {
36
    TempSum += io_pFloatAvgFilter->aData[i];
37
  }
38
  // Der cast is OK, wenn tFloatAvgType und tTempSumType korrekt gewaehlt wurden.
39
  tFloatAvgType o_Result = (tFloatAvgType) (TempSum / SIZE_OF_AVG);
40
  return o_Result;
41
}
Main
1
#include <stdio.h>
2
#include "FloatingAverage.h"
3
4
int main(void)
5
{
6
        // Datenstruktur anlegen:
7
        tFloatAvgFilter FilterVoltageBatt;
8
9
        // initialisieren und mit 0 fuellen
10
        InitFloatAvg(&FilterVoltageBatt, 0);
11
12
        AddToFloatAvg(&FilterVoltageBatt, 100);
13
        // jetzt steht 1 mal 100 und 7 mal 0 im Buffer:
14
        printf("100/8 = %d\n", GetOutputValue(&FilterVoltageBatt));
15
16
        AddToFloatAvg(&FilterVoltageBatt, 200);
17
        // jetzt steht 1 mal 100, 1 mal 200 und 6 mal 0 im Buffer:
18
        printf("300/8 = %d\n", GetOutputValue(&FilterVoltageBatt));
19
20
        AddToFloatAvg(&FilterVoltageBatt, 300);
21
        AddToFloatAvg(&FilterVoltageBatt, 200);
22
        // jetzt steht 1 mal 100, 2 mal 200, 1 mal 300 und 4 mal 0 im Buffer:
23
        printf("800/8 = %d\n", GetOutputValue(&FilterVoltageBatt));
24
25
        return 0;
26
}

Ich würde mich über Anregungen und Tipps freuen.

Grüße

: Verschoben durch Moderator
von Yalu X. (yalu) (Moderator)


Bewertung
0 lesenswert
nicht lesenswert
Vermutlich hast du vergessen, die Datei FloatingAverage.c deinem Projekt
hinzuzufügen.

von Der Andere (Gast)


Bewertung
0 lesenswert
nicht lesenswert
PeterPanisch schrieb:
> Habe schon versucht die Funktionen mit extern und den Zeiger auf die
> Struktur mit volatile zu definieren. Leider ohne Erfolg...

Mit Trial And Error Programming wirst du nicht glücklich werden.
Kauf dir ein gutes C Buch und arbeite es durch!

Das ist ein GUT gemeinter Tipp.

von PeterPanisch (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Danke, es war tatsächlich nicht Projekt hinzugefügt. Jetzt funktioniert 
es!

Danke auch für den Tipp mit Buch. Habe leider nur C Kenntnisse aus 
Hochschule.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.