0 Daumen
1,5k Aufrufe

Frage:

Entwickeln Sie eine Funktion für die Erkennung von Impulsflanken (steigende/fallende Flanken)
mit folgender Signatur:


int edgeDetect(double value)
{
       int edge = -1; // Flankenerkennung ist ausgeschaltet
       // edge = 0 ... fallende Flanke erkannt
       // edge = 1 ... steigende Flanke erkannt
       // eine Flanke gilt als erkannt bei mindestens 5 bis 10
       // aufeinander folgenden fallenden oder steigenden Werten

       return edge;
}…



kann hier jemand weiterhelfen? Es soll in C++ programmiert werden.


Vielen Dank vorab.

Avatar von

1 Antwort

0 Daumen
 
Beste Antwort
  1. Statische Variable prev anlegen, in der der letzte Wert gespeichert wird.
  2. Statische Variable dir anlegen, in der gespeichert wird, ob der aktuelle Wert größer als der Wert von prev oder kleiner als der Wert von prev ist.
  3. Statische Variable count anlegen, in der gespeichert wird vor wie vielen Werten dir letztmalig seinen Wert geändert hat.
  4. Prüfen welche der Alternativen value > prev, value < prev, value == prev zutrifft. Je nach Ergbnis die Werte von dir und count anpassen.
  5. Je nach Wert von dir und count den Wert von edge anpassen.
  6. Wert von prev anpassen.
Avatar von 5,7 k

Danke für Deine Tipps...Sind dann dir, prev und count jeweils als int zu deklarieren?

value ist ja die Variable mit dem Datentyp double , richtig?

Statische Variable prev anlegen, in der der letzte Wert gespeichert wird.

Dann wäre es zweckmäßig, wenn prev den gleichen Datentyp hat wie der letzte Wert.

Bei mir stellen sich da einfach immer noch zu viele Fragen:

Was muß ich wo deklarieren, wie klammere ich(Blockklammer usw)?

Eine "ähnliche" Frage gab es ja hier schon mal, aber eben nur ähnlich:

blob.png

Text erkannt:

Die Nulldurchgänge sollen ermittelt werden.
bool detectPoint (double value)
\{tatic double previous \( =0 \);
if (previous*value \( <0 \) ) \{
previous \( = \) value;
return true;
\} else \{
return false;
\}\( \quad \)
bool detectPoint (double value)
\{
static double previous \( =0 \);
if (previous*value \( <0 \) ) \{
previous = value;
return true;
\} else \{
return false;
\}
\}

Wobei sich mir hier auch wieder folgende Frage stellt:

Was bedeutet der *  zwischen previous und value? Ein Zeiger ist das aber nicht oder?

Oder wird tatsächlich was multipliziert?

Was muß ich wo deklarieren,

Variablen musst du deklarieren.

Innerhalb von Funktionen musst du sie deklarieren.

Genau genommen darfst du sie auch außerhalb von Funktionen deklarieren. Das ist aber schlechter Stil und wenn du siehst wie jemand soetwas macht, dann solltest du schreiend weglaufen.

Was bedeutet der *  zwischen previous und value?

Multiplikation. Die Idee ist, dass ein Nulldurchgang genau dann stattgefunden hat, wenn der aktuelle Wert und der vorherige Wert unterschiedliche Vorzeichen haben und das Produkt dieser beiden deshalb negativ ist. Wenn du dagegen Zahlen mit gleichem Vorzeichen multipliziert, dann kann das Ergebnis nicht negativ sein. Das ist aber für deine Aufgabe nicht relevant.

Ein Zeiger ist das aber nicht oder?

Nein. Wenn *value eine Zeigerdereferenzierung wäre, dann würde zwischen previous und *value kein Operator stehen. Das erkennt der Compiler und fasst * deshalb nicht als Zeigerdereferenzierungsoperator auf.

Oder wird tatsächlich was multipliziert?

Ja.

Bin hier leider noch nicht so recht weitergekommen bzw steh immer noch aufm Schlauch, was die richtige Deklaration bzw Initialisierung mit Werten angeht

Wie sieht denn dein aktuelles Programm aus?

Weiter bin ich hier, auch aus Zeitgründen, leider noch nicht gekommen. Bin halt grundsätzlich auch Elektriker, muß das hier aber machen.


blob.png

Text erkannt:

Flanke.txt - Notepad
File Edit Format View Help
int edgeDetect(double value)
\{
int edge \( =-1 \);
static double prev \( =0 \);
static double dir \( =0 \);
static int count \( =0 \);
\}
if (prev == value) \( \{ \) count ++ ;
return count);
return edge;
\}

Weiß auch nicht recht, wie ich was deklarieren und initialisieren muß und wie die Sache mit dem Wertevergleich funktioniert. Also in C++ weiß ich es nicht.

Bin für jede Hilfe absolut dankbar.

Versuche, die Datei zu kompilieren. Beseitige dann die Fehler, die dafür sorgen dass die Datei nicht komiliert werden kann.

blob.png

Text erkannt:

Generiere Quelltexte...
3 / 19 Pakete
Bearbeite Diagramme...
Speichere MainWnd.cpp.
Speichere TestFrame.cpp.
Kompiliere die Datei
KD_Flankenerkennung_A1V7.cpp.
Kompiliere die Datei MainWnd.cpp.
Kompiliere die Datei TestFrame.cpp.
TestFrame.cpp:233 Fehler: expected unqualified-id before '\{' token

Ende.

Das ist alles, was ich da bekomme...Was sagt mir das jetzt?

Eine Funktion besteht aus

  1. einem Datentyp für den Rückgabewert,
  2. dem Namen der Funktion,
  3. einer Liste von Parametern und
  4. einem Anweisungsblock.

Beispiel.

int main (int argc, char* argv[]) {
for (int i = 0; i < argc; ++i)
argv[i] = 0;
return 0;
}
  1. Der Datentyp für den Rückgabewert ist int.
  2. Der Name der Funktion ist main.
  3. Die Liste von Parametern ist (int argc, char* argv[]).
  4. Der Anweisungsblock beginnt mit { und endet mit }.

In deinem Programm folgt auf den Anweisungsblock der Funktion unmittelbar ein weiterer Anweisungsblock. Das ist in C++ nicht erlaubt.

Ein anderes Problem?

Stell deine Frage

Willkommen bei der Stacklounge! Stell deine Frage einfach und kostenlos

x
Made by a lovely community