Forum: Mikrocontroller und Digitale Elektronik Werteübergabe an Funktion()


von __Son´s B. (bersison)


Lesenswert?

Hallo - verzweifle am meiner Spg-Überwachung.
Folgend habe ich ein Werteübergabe-Problem.

_FEHLER_
Ohne die Testvarianten zu aktivieren, gibt
"StatusNeu = SpgUeberwach_Auswertung(MittelWert);"
nur Werte von 1-3, nicht aber 4,5 zurück.

_TEST_
nur Testvariante (*1) aktiviert => Prog. funktioniert NICHT! (siehe 
FEHLER)
nur Testvariante (*2) aktiviert => Prog. funktioniert!

_AUSZUG_
1
int main()
2
{ ...
3
  uint16_t MittelWert; //Bereich 0-1023
4
  uint8_t StatusNeu; //Bereich 1-5
5
  ...
6
  // MittelWert=700;  //Testvariante 0-1023(*1) 
7
  StatusNeu = SpgUeberwach_Auswertung(MittelWert);
8
  SpgUeberwach_Ausgang(StatusNeu);
9
}
10
11
uint8_t SpgUeberwach_Auswertung(uint16_t MittelWert)
12
{
13
  static uint8_t LedAktuell; //Bereich 1-3
14
  uint8_t StatusNeu;  //Bereich 1-5
15
16
  // MittelWert=700;  //Testvarante 0-1023 (*2)
17
  ...
18
  // Hier folgt ein Block der die 
19
  // Eingangswerte (0-1023), 5 Zuständen (1-5) zuordnet.
20
21
  return StatusNeu;
22
}

[Code-Tags ergänzt – Mod.]

: Bearbeitet durch Moderator
von Klaus W. (mfgkw)


Lesenswert?

Häh?

Verstehe kein Wort, sorry.

Wo soll denn der Rückgabewert herkommen?
Aus dem Code, den du versteckst?

: Bearbeitet durch User
von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Dicker Bug in Zeile 42.

von Mitlesa (Gast)


Lesenswert?

Chinesisch für Anfänger.

von __Son´s B. (bersison)


Lesenswert?

Klaus W. schrieb:
> Wo soll denn der Rückgabewert herkommen?

Wie beschrieben aus dem Zuordnungs-Block.

Der Block ist nicht das Problem - daher weg gelassen.
Da bei aktivieren Testvariante (*2) alles Folgende funktioniert, liegt 
der Fehler vor (*2) davor!
Daher vermute ich, dass es sich um die Werteübergabe der Funktion 
handelt. Aber verstehen tuh ich nicht.

von __Son´s B. (bersison)


Lesenswert?

Frank M. schrieb:
> Dicker Bug in Zeile 42.

Gehts genauer?

von Jonathan (Gast)


Lesenswert?

__Son´s B. schrieb:
> Frank M. schrieb:
>> Dicker Bug in Zeile 42.
>
> Gehts genauer?

Naiv?

von Mark B. (markbrandis)


Lesenswert?

__Son´s B. schrieb:
> Frank M. schrieb:
>> Dicker Bug in Zeile 42.
>
> Gehts genauer?

Nein. Weil Du die dafür relevanten Informationen nicht zeigst.

von argc,argv (Gast)


Lesenswert?

eigentlich müßte der Compiler meckern...
ist main() bekannt, daß SpgUeberwach_Auswertung() als Argument
ein uint16_t will?

versuchs mal in main mit:

StatusNeu = SpgUeberwach_Auswertung((uint16_t)MittelWert);

von __Son´s B. (bersison)


Lesenswert?

Jonathan schrieb:
> Naiv?

Weder sonderlich Niveau-, noch Humorvoll.

von Daniel A. (daniel-a)


Lesenswert?

__Son´s B. schrieb:
> Frank M. schrieb:
>> Dicker Bug in Zeile 42.
>
> Gehts genauer?

Das ist Allgemeinwissen:
https://de.m.wikipedia.org/wiki/42_(Antwort%29

: Bearbeitet durch User
von __Son´s B. (bersison)


Lesenswert?

argc,argv schrieb:
> eigentlich müßte der Compiler meckern...
> ist main() bekannt, daß SpgUeberwach_Auswertung() als Argument
> ein uint16_t will?
>
> versuchs mal in main mit:
>
> StatusNeu = SpgUeberwach_Auswertung((uint16_t)MittelWert);

__Son´s B. schrieb:
> _AUSZUG_
> int main()
> { ...
>   uint16_t MittelWert; //Bereich 0-1023

Deklaration steht im main()
Reicht das nicht?

von argc,argv (Gast)


Lesenswert?

aber nicht die Deklaration der Funktion

von argc,argv (Gast)


Lesenswert?

noch nie was debugged?
dann guck Dir halt in SpgUeberwach_Auswertung() mal an,
was in Mittelwert steht

von Nemesis (Gast)


Lesenswert?

argc,argv schrieb:
> noch nie was debugged?

Endlich mal einer der eine Lösungsmöglichkeit aufzeigt.
Benutzt eigentlich niemand den zum Compiler zugehörigen Debugger?
(Mein Prof. wollte den auch nie benutzen).

von __Son´s B. (bersison)


Lesenswert?

argc,argv schrieb:
> noch nie was debugged?

Leider nein!
Auch mit dem Simulator habe ich mich noch nicht beschäftigt.

von Jonathan (Gast)


Lesenswert?

__Son´s B. schrieb:
> Jonathan schrieb:
>> Naiv?
>
> Weder sonderlich Niveau-, noch Humorvoll.

Gute Selbsteinschätzung.

Nebenbei: Du pflegst eine putzige Rechtschreibung.

von Chris L. (kingkernel)


Lesenswert?

Benutze einfach den Debugger. Lass dein Programm bis zur entsprechenden 
Stelle laufen. Mit einem Breakpoint hälst du ihn direkt in der Zeile vor 
dem Aufruf der Funktion an. Dann lässt du das Programm Zeile für Zeile 
weiterlaufen und schaust dir an, was in den jeweiligen Variablen drin 
steht.

Es kann passieren, dass dir der Compiler die Variablen wegoptimiert, 
dann musst du mit volatile arbeiten.

Nun kannst du sehen, was dein Programm genau macht. Denn es kann sein, 
dass es etwas völlig anderes (logisches) macht, was du nicht 
vorhergesehen hast.


Wenn du möchstest das man dir hier Hilfe (oder überhaupt erst helfen 
kann) dann reduziere deinen Code soweit, bis nur noch der Code übrig 
ist, der das Problem verursacht (und auch weiterhin noch verursachen 
muss). Dann poste diese Code komplett als Compilierbares Beispiel, dann 
können auch andere sich das ganze anschauen und Compilieren/Debuggen.
Bei deinem Code oben fehlen Beispielsweise alle wichtigen Stellen. Ich 
bin mir nämlich ziemlich sicher, dass der Fehler in den Zeilen zu finden 
ist, von denen du glaubst, das er dort nicht zu finden sei!

von __Son´s B. (bersison)


Lesenswert?

argc,argv schrieb:
> aber nicht die Deklaration der Funktion

uint8_t SpgUeberwach_Auswertung(uint16_t MittelWert)

von Michael B. (laberkopp)


Lesenswert?

Und wie verhält sich dein Programm, wenn du schreibst:
1
uint8_t SpgUeberwach_Auswertung(uint16_t MittelWert)
2
{
3
  static uint8_t LedAktuell; //Bereich 1-3
4
  uint8_t StatusNeu;  //Bereich 1-5
5
6
  // Hier folgt ein Block der die 
7
  // Eingangswerte (0-1023), 5 Zuständen (1-5) zuordnet.
8
9
  return StatusNeu;
10
}
11
12
int main()
13
{ ...
14
  uint16_t MittelWert; //Bereich 0-1023
15
  uint8_t StatusNeu; //Bereich 1-5
16
  ...
17
  MittelWert=700;  //Testvariante 0-1023(*1) 
18
  StatusNeu = SpgUeberwach_Auswertung(MittelWert);
19
  SpgUeberwach_Ausgang(StatusNeu);
20
}

: Bearbeitet durch User
von __Son´s B. (bersison)


Angehängte Dateien:

Lesenswert?

Chris L. schrieb:
> Wenn du möchstest das man dir hier Hilfe (oder überhaupt erst helfen
> kann) dann reduziere deinen Code soweit, bis nur noch der Code übrig
> ist, der das Problem verursacht (und auch weiterhin noch verursachen
> muss). Dann poste diese Code komplett als Compilierbares Beispiel, dann
> können auch andere sich das ganze anschauen und Compilieren/Debuggen.

Siehe Anhang.
Danke schon mal!

von __Son´s B. (bersison)


Lesenswert?

Michael B. schrieb:
> Und wie verhält sich dein Programm, wenn du schreibst:uint8_t

>   MittelWert=700;  //Testvariante 0-1023(*1)
>   StatusNeu = SpgUeberwach_Auswertung(MittelWert);
>   SpgUeberwach_Ausgang(StatusNeu);

Genau hier (*1) wirft das Prog einen falschen Wert aus.
"MittelWert=700;" in der Funktion SpgUeberwach_Auswertung() (siehe *2) 
klappt einwandfrei! Daher kann ich mir nur ein Übergabeproblem 
vorstellen >>> aber wo ist der Fehler???

von argc,argv (Gast)


Lesenswert?

uint8_t SpgUeberwach_Auswertung(uint16_t MittelWert)
{
  static uint8_t LedAktuell; //Bereich 1-3
  uint8_t StatusNeu;  //Bereich 1-5

 printf("Mittelwert=%d\r\n",Mittelwert);

 /* Rest */

von Michael B. (laberkopp)


Lesenswert?

__Son´s B. schrieb:
> Siehe Anhang.

Ach du Kagge, immer noch das Programm dass sich auf 5 Zeilen kürzen 
lässt
und in dem unser bersison den Überblick verloren hat weil er aus 5 
Anweisungen mal eben 50 Anweisungen machte.

von __Son´s B. (bersison)


Lesenswert?

argc,argv schrieb:
> uint8_t SpgUeberwach_Auswertung(uint16_t MittelWert)
> {
>   static uint8_t LedAktuell; //Bereich 1-3
>   uint8_t StatusNeu;  //Bereich 1-5
>
>  printf("Mittelwert=%d\r\n",Mittelwert);
>
>  /* Rest */

Habe keine Terminal-Ausgabe. Bekomme ich auch nicht so schnell hin.

von Cyblord -. (cyblord)


Lesenswert?

Die Funktion void SpgUeberwach_Ausgang(uint8_t StatusNeu) nimmt eine 
Byte Variable, wird aber mit "MittelWert" gefüttert welches als uint16_t 
deklariert ist. Da fällt dir nix auf?

von Michael B. (laberkopp)


Lesenswert?

Cyblord -. schrieb:
> Die Funktion void SpgUeberwach_Ausgang(uint8_t StatusNeu) nimmt eine
> Byte Variable, wird aber mit "MittelWert" gefüttert

Nö, wird sie nicht, sondern mit uint8_t StatusNeu.

Aber er hat sich völlig in den überzogenen if's in 
SpgUeberwach_Auswertung vergaloppiert und den Überblick verloren.

Da wird ein static uint8_t LedAktuell verglichen, das nie gesetzt wurde, 
und entweder 0 oder zufällig ist aber zu Beginn nie 1 oder 2 oder 3 hat.

Er weigert sich den Code so wie in diesem Forum schon gezeigt 
aufzuräumen und wundert sich über Fehler.

Dem Mann ist nicht zu helfen.

von __Son´s B. (bersison)


Lesenswert?

Cyblord -. schrieb:
> Die Funktion void SpgUeberwach_Ausgang(uint8_t StatusNeu) nimmt eine
> Byte Variable, wird aber mit "MittelWert" gefüttert welches als uint16_t
> deklariert ist. Da fällt dir nix auf?

Nicht wirklich...

"void SpgUeberwach_Ausgang(uint8_t StatusNeu)" wird mit StatusNeu (8bit) 
gefüttert. Die Funktion hat keinen Rückgabewert.
Im main() wird die Var. "uint8_t StatusNeu;" deklariert.
Was hat "StatusNeu" mit dem "MittelWert" zu tun?

von __Son´s B. (bersison)


Lesenswert?

Michael B. schrieb:
> Da wird ein static uint8_t LedAktuell verglichen, das nie gesetzt wurde,
> und entweder 0 oder zufällig ist aber zu Beginn nie 1 oder 2 oder 3 hat.

Ok!
Dein Hinweis zu LedAktuell ist richtig - die Zeile wurde bei 
Code-Umstrukturieren versehentlich gelöscht. Werde mich morgen drum 
kümmern.
(Rest deiner Behauptung ist daneben - zukünftig bitte einfach weg 
lassen!)

von Doh! (Gast)


Lesenswert?

Mal ganz davon abgesehen, dass static LedAktuell in der Auswertung nie 
gesetzt wird, aber immer überprüft ...

Meine Vermutung: Du glaubst LEDAktuell in der Auswertung in in der 
Ausgabe wären die gleichen Variablen. Sind sie nicht.

Lese dich schlau über Variablendeklaration und Gültigkeiten.

von Doh! (Gast)


Lesenswert?

Ich sollte zwischendurch mal F5 d5rücken :-D

von Cyblord -. (cyblord)


Lesenswert?

Da kommt man auch ganz durcheinander bei der wirren Namensgebung. Das 
ist eher ein Logikrätsel, als ein übersichtliches Programm.

von Michael B. (laberkopp)


Lesenswert?

__Son´s B. schrieb:
> (Rest deiner Behauptung ist daneben - zukünftig bitte einfach weg
> lassen!)

Tja, Wahrheiten werden von dir nicht gerne gehört.

von Klaus W. (mfgkw)


Lesenswert?

Cyblord -. schrieb:
> Da kommt man auch ganz durcheinander bei der wirren Namensgebung. Das
> ist eher ein Logikrätsel, als ein übersichtliches Programm.

Ich habe noch nicht mal überhaupt ein Programm gesehen :-)

von Echte Computer sind PCs überlegen (Gast)


Lesenswert?

Nemesis schrieb:
> argc,argv schrieb:
>> noch nie was debugged?
>
> Endlich mal einer der eine Lösungsmöglichkeit aufzeigt.
> Benutzt eigentlich niemand den zum Compiler zugehörigen Debugger?
> (Mein Prof. wollte den auch nie benutzen).

(ich will nicht und kann nicht hier Jemand von C/C++ wegbewegen, 
aber...)

Systematisches Vorgehen beim Programmieren macht Debugger so gut wie 
überflüssig.
Solange man sich für komplexe/komplizierte Programmiersprachen 
entscheidet, leidet man auch darunter: der eigene Kopf muss dauernd 
Sprachdetails berücksichtigen, was ordentlich vom Zielproblemlösen 
abhält/ablenkt.

Ein Vergleich, nur um meine Richtung zu unterstreichen: wieviele "A4 
Seiten" umfasst die Syntaxdefinition (z.B. In EBNF) von C? Sehr viele...
Im Vergleich dazu Modula-2? 2 (zwei!) Seiten. (lieber was neuzeitigeres? 
Lua - hab ich nich konkret da, duerfte aber ebenso im kl.einstelligen 
Bereich sein)
Diese 2 Sprachen sind nich/nur wenig minder mächtig als C.
Also kommt man damit im Kopf +"auf der Werkbank" schneller voran in der 
eigentlichen Aufgabe weil sie "eine Grössenordnung" weniger im Wege 
stehen. Die Parser fallen entspr. einfacher = sicherer = schneller aus.

Aber ja: mit so'n'em Gewucher von Sprache wie C/C++ braucht man schon 
ein Debugger.

Bei der in diesem Fall ans Licht gelegte Systematik wird's aber dem 
besten Debugger übel...  X-P

von __Son´s B. (bersison)


Lesenswert?

Doh! schrieb:
> Mal ganz davon abgesehen, dass static LedAktuell in der Auswertung nie
> gesetzt wird, aber immer überprüft ...

Programm läuft jetzt (fast) einwandfrei!!!
(Nur definierter Startzustand ist noch fehlerhaft.)

Wie geschrieben, wurde ein großes lauffähiges main(), in viele kleine 
Funktionen gesplittet. Hier sind 3 Var. (u.a. LedAktuell) in 2 
Funktionen dauernd übersehen worden.

Daher an dieser Stelle ein großes DANKESCHÖN für euren Fingerzeig 
darauf.

: Bearbeitet durch User
von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Echte Computer sind PCs überlegen schrieb:
> Systematisches Vorgehen beim Programmieren macht Debugger so gut wie
> überflüssig.

Deswegen sind die von Dir favorierten Sprachen ja auch so irrwitzig 
erfolgreich; praktisch niemand mehr programmiert in den fehlerträchtigen 
C/C++-Sprachen.




Nein?

Ach. Dies ist nicht der Ort für Programmiersprachen-Flamewars, die 
wurden bereits andernorts ad nauseam ausgefochten.

von __Son´s B. (bersison)


Lesenswert?

__Son´s B. schrieb:
> Programm läuft jetzt (fast) einwandfrei!!!
> (Nur definierter Startzustand ist noch fehlerhaft.)

ALLES läuft jetzt!

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.