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_
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.
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);
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?
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).
__Son´s B. schrieb:> Jonathan schrieb:>> Naiv?>> Weder sonderlich Niveau-, noch Humorvoll.
Gute Selbsteinschätzung.
Nebenbei: Du pflegst eine putzige Rechtschreibung.
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!
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!
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???
__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.
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?
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.
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?
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!)
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.
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 :-)
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
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.
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.