Werteübergabe an Funktion()

OP #4490586
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.]
Gast #4490689
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);
OP #4490698
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?
#4490831
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!
#4490837
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
}
OP #4490857
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!
Angehängte Dateien:
OP #4490863
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???
#4490986
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.
OP #4490999
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?
OP #4491013
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!)
Gast #4491014
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.
Gast #4491190
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
OP #4497350
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.
Persönliche Seite #4497366
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren