Verzweigungsdurchlauf, obwohl die Bedingung FALSE ist

OP #6496082
Lesenswert?

Hallo! Bin neu hier und habe ein großes Problem: Beim normal Betrieb 
geht das Programm immer in die Verzweigungen, die jedoch FALSE sind. 
Komischerweise beim Debuggen nicht. An was kann das liegen?

Bitte um nützliche Hilfe!
lg Tobias
Angehängte Dateien:
Beitrag #6496122 wurde von einem Moderator gelöscht.
#6496137
Lesenswert?

Marc V. schrieb:
> Tobias K. schrieb:
>> Nein ich mache immer einen neuen BUILD vor dem Upload. Wie kann ich
>> diesen Fehler jetzt asubessern?
>
>  if (start) entfernen, so schwer zu verstehen?

Vielleicht ist sein Sinn dass er diesen Code noch weiterentwickeln 
möchte, und später durch eine Tastereingabe die Variable Start setzt.
Der aktuelle Stand ist evtl. nur fürs testen.

Hirn einschalten bevor man postet!
Gast #6496139
Lesenswert?

Tobias K. schrieb:
> Nein ich mache immer einen neuen BUILD vor dem Upload. Wie kann
> ich diesen Fehler jetzt asubessern?

Was nützt das builden, wenn man eventuell eine veraltete Datei aus dem 
falschen Directory hochladt.

Es gibt so viele Möglichkeiten, die schief gehen können, man muss von 
vorne mit dem Suchen anfangen (führt er ein blink Beispielprogramm in 
realeade und in debug korrekt aus...)

Neulich hatte ich z.B. einfach den USB-Stecker im falschen Board drin 
stecken.

An fehlerhaftem Compiler dass er in if-Zweige eintaucht deren Bedingung 
false ist liegt es jedenfalls nie.
(Firma: Vescomp) #6496163
Lesenswert?

Tobias K. schrieb:
> Leider funktioniert es immer noch nicht :(

 Arithmetische Operationen die verglichen werden erstmal in Klammern
 schreiben, also anstatt:
1
    else if(t_ms - mt_ms< 1200) ...;
 so schreiben:
1
    else if((t_ms - mt_ms) < 1200) ...;

 oder:
1
    CurTime = t_ms - mt_ms;
2
    if(CurTime < Phase_1) ...;
vorher Phase_0 bis Phase_n_definieren und man braucht nachher nicht an
x Stellen im Programm Werte zu ändern.
Danach nochmal posten...
Gast #6496181
Lesenswert?

Thomas F. schrieb:
> WAS IST DARAN SO SCHWER ZU VERSTEHEN!

Du bist schwer zu verstehen, weil du so laut schreist.

Erkläre, was das Programm tun soll, und was stattdessen passiert. Woran 
hast du das erkannt.

Dein Beispiel sollte compilierbar sein. An solchen Code-Fragmenten kann 
man die Seiteneffekte und Rahmenbedingungen nicht ablesen.
OP #6496186
Lesenswert?

Es geht grundsätzlich um eine Ampelsteuerung. Diese Version ist jedoch 
nicht vollständig, da es mir nur um dieses eine Problem geht: Die erste 
Verzweigung, die lautet if (start) {...., wird trotz start = 0 
ausgeführt, was mich daran hindert, weiter zu machen und den vorhandenen 
Code zu testen. Meine frage, die ich gestellt habe lautet, an was das 
liegt und wie ich es beheben kann.

mfg Tobias
(Firma: Vescomp) #6496191
Lesenswert?

leo schrieb:
> Marc V. schrieb:
>> so schreiben:    else if((t_ms - mt_ms) < 1200) ...;
>
> Schwachsinn ...
> 
https://de.wikibooks.org/wiki/C-Programmierung:_Liste_der_Operatoren_nach_Priorit%C3%A4t
>
> leo

Noch ein Korinthenkacker...
Compiler kennt natürlich die Priorität, aber es ist einfach üblich,
so etwas durch Klammern zu trennen.
Niemand wird dem TO helfen, wenn man sich erst einmal durch 50 solche
Konstrukte durchkämpfen muss - warum denn auch?

Nichts konstruktives beizutragen, aber kluge Bemerkungen ausgoogeln...
Gast #6496196
Lesenswert?

Mein Gott! Ich kann kein C, aber normalerweise müßte das Programm ohne 
jede Reaktion durchrauschen, da der TO ja (mit Absicht) zu Anfang 
sämtliche Bedingungen unwahr gemacht hat, in dem er sie auf Null 
festgeklemmt hat.

Trotzdem werden die Verzweigungen durchlaufen und das ist sein Problem.

Jetzt aber:
Ooh, slip out the back, Jack
Make a new plan, Stan
You don't need to be coy, Roy
Just listen to me
Hop on the bus, Gus
(Firma: Vescomp) #6496202
Lesenswert?

Tobias K. schrieb:
> Es geht grundsätzlich um eine Ampelsteuerung. Diese Version ist jedoch
> nicht vollständig, da es mir nur um dieses eine Problem geht: Die erste
> Verzweigung, die lautet if (start) {...., wird trotz start = 0
> ausgeführt, was mich daran hindert, weiter zu machen und den vorhandenen
> Code zu testen. Meine frage, die ich gestellt habe lautet, an was das
> liegt und wie ich es beheben kann.

 Adresse im RAM wo sich start befindet, vor dem Start kontrollieren.
Gast #6496218
Lesenswert?

Na, dann schau dir doch mal das Stück code an:
1
    if (HAL_GPIO_ReadPin(taster_GPIO_Port, taster_Pin) == 0 & flanke == 1)
2
    {
3
      if (t_ms - pressStart >= 2)
4
      {
5
        if (start == 0) start = 1;
6
        else start = 0;
7
      }
8
      
9
      flanke = 0;
10
    }
Gast #6496222
Lesenswert?

Sorge mal für korrekte Einrückung.

Aber nicht nur deswegen ist in meinen Augen unlesbar. Die Logik ist 
überhaupt nicht erkennbar, weil du wie zu viel in einen großen Block 
geschrieben hast, Variablen-Namen die nichts aussagen und dann auch auch 
auf Kommentare verzichtet hast.

Wenn du mich jetzt kommerziell beauftragen würdest, da etwas zu ändern, 
würde ich erst einmal 8 Stunden für die Analyse anrechnen, 3 Stunden für 
die Dokumentation des ist-Zustandes und dann können wir über die 
eigentliche Änderung verhandeln.
Gast #6496224
Lesenswert?

Tobias K. schrieb:
> Jetzt hab ich es geschafft nur bleibt das Programm jetzt in Zeile 151
> hängen.

Das ist:
1
else if(t_ms - mt_ms < 8800) HAL_GPIO_WritePin(ampelA_Gelb_GPIO_Port, ampelA_Gelb_Pin, GPIO_PIN_SET);

In dieser Zeile kann das Programm unmöglich hängen blieben, es sei denn 
deine Hardware ist defekt. Dann wärst du aber wahrscheinlich gar nicht 
erst so weit gekommen.

Woran erkennst du, dass es genau dort hängt?

Kleiner Tipp: Beantworte meine Rückfragen, sonst klinke ich mich aus.
(Firma: Vescomp) #6496315
Lesenswert?

Stefan ⛄ F. schrieb:
> By the way:
>
> So eine Ampel ist eigentlich das Paradebeispiel für einen
> Zustandsautomaten. Damit könnte man lesbaren Code erstellen.

Natürlich.
Nur müsste man dann (im einfachstem Fall) Ampel_N, Ampel_S, Ampel_E
und Ampel_W definieren mit jeweils 3 Phasen für Rot, Gelb und Grün,
wahrscheinlich überschneidend.
Fussgänger sowie Rechts- und Linksabbieger nicht gerechnet.

Scheint für TO zu viel Arbeit im voraus, also am besten gleich loslegen
und wenn etwas nicht klappt, kann man immer noch im Forum nachfragen...

P.S. So etwas kann man ganz schnell und vor allem übersichtlich in
Excel nachbilden, dauert kaum 20 Minuten...
Gast #6496325
Lesenswert?

Stefan ⛄ F. schrieb:
> So eine Ampel ist eigentlich das Paradebeispiel für einen
> Zustandsautomaten. Damit könnte man lesbaren Code erstellen.

Wird aber so nicht gemacht. Bei einer etwas komplizierteren Ampel wird 
das schnell wirr.
Ampelanlagen werden in "Bildern" bescchrieben. Dabei wird die Kreuzung 
von oben betrachtet, mit allen Ampeln eingezeichnet.
Ein1 Ampel wird als grün angenommen, daraus folgt welche Ampeln rot sein 
müssen und welche auch noch Grün sein dürfen. So geht man von Ampel zu 
Ampel weiter die noch kein Grün hatte und ist dann fertig.

Das ist als Statemachine immer noch blöd.
Daher würde ich eine Beschreibungssprache für die Zustäne jedes Bildes 
machen und die dann sequentiell abarbeiten.

Das ganze kann man "invertieren" und damit eine permanente 
Sicherheitsüberprüfung laufen lassen.
#6496354
Lesenswert?

Marc V. schrieb:
> Scheint für TO zu viel Arbeit im voraus, also am besten gleich loslegen
> und wenn etwas nicht klappt, kann man immer noch im Forum nachfragen...

Das hat jetzt überhaupt nichts mehr mit der Frage von Tobias K. zu tun.

Sein Problem:
Es wird in if-Verzweigungen gesprungen obwohl die Bedingung 
offensichtlich FLASE ist.
Seine Frage:
Woran liegts und wie kann man es lösen?

Deine Auffassung:
Ampel -> Hausübung -> Fauler Schüler -> will das wir seine Hausübung 
machen


Marc V. schrieb:
> Natürlich.
> Nur müsste man dann (im einfachstem Fall) Ampel_N, Ampel_S, Ampel_E
> und Ampel_W definieren mit jeweils 3 Phasen für Rot, Gelb und Grün,
> wahrscheinlich überschneidend.
> Fussgänger sowie Rechts- und Linksabbieger nicht gerechnet.

Dies hat absolut gar nichts mehr mit der Frage von Tobias zu tun, das 
hat er auch nie gefragt und verwirrt ihn wsl. nur noch mehr.
Also vielen Dank für deine Nutzlose Hilfe, ab jetzt ist Tobias wohl 
besser ohne dich dran!
Beitrag #6496380 wurde von einem Moderator gelöscht.
Beitrag #6496385 wurde von einem Moderator gelöscht.
#6496388
Lesenswert?

Marc V. schrieb im Beitrag #6496380:
> if (start) entfernen, so schwer zu verstehen?

Das ist ja nicht die Lösung des Problems, da er später start durch einen 
Taster setzten möchte. Dies aber nicht möglich ist wenn der uC immer in 
die Verzweigung springt!!!

Auf das Niveau vom Rest der Nachricht möchte ich mich gar nicht erst 
herablassen....
Beitrag #6496399 wurde von einem Moderator gelöscht.
Beitrag #6496404 wurde von einem Moderator gelöscht.
Beitrag #6496413 wurde von einem Moderator gelöscht.
Gast #6496584
Lesenswert?

Tobias, du hast ja nun schon die zweite Variante der Ampelsteuerung, wo 
du nicht nachvollziehen kannst, warum sie tut, was sie tut.

in ernst gemeinter Tipp dazu:

Fange mit einfachen Programmen an, und lerne damit den Debugger sowie 
Logmeldungen (printf) zu benutzen. Danach kannst du deine Ampeln 
untersuchen.
#6496645
Lesenswert?

Tobias K. schrieb:
> Dies ist die richtige Datei, wo es in allen if-Verzweigungen hineingeht,
> obwohl deren Bedingung 0 ist.

Netter Versuch, die Fehlersuche anderen zu überlasssen. Aber es wird 
nicht klappen.

Der Trick bei der Fehlersuche ist, man betrachtet Programme nicht als 
großen monolithisch Block, sondern löscht erstmal alles weg, was mit dem 
Fehler (scheinbar) nichts zu tun hat und läßt nur das übrig, was den 
Fehler sichtbar macht.

Also kürze das Programm erstmal sinnvoll ein und dann sehen wir weiter. 
Es kann durchaus sein, daß Du dabei den Fehler schon selber findest.
Gast #6496757
Lesenswert?

Nick M. schrieb:
> Er braucht nichts kürzen, ich hab ihm schon gesagt, wo der Fehler ist.

Du meinst diesen Hinweis?

Nick M. schrieb:
> Dann erklär mal, warum du in der Schleife alles immer wieder 0 setzt,

Und du beziehst dich damit wahrscheinlich auf diese Codezeilen innerhalb 
der Schleife?

    static uint32_t mt_ms = 0;
    static _Bool start = 0;
    static _Bool sm1 = 0;
    static _Bool sm2 = 0;
    static _Bool sm3 = 0;
    static _Bool sm4 = 0;

Nun: da wird nichts "immer wieder auf 0 gesetzt". Die Variablen sind zu 
Beginn auf 0 initialisiert, während des weiteren Schleifendurchlaufs hat 
diese "Zuweisung von 0" bei der static Deklaration keinen Einfluss mehr.

https://de.wikibooks.org/wiki/C-Programmierung:_static_%26_Co.

Falls dein Hinweis sich auf ein "anderes Null-setzen" bezog, wäre eine 
Klärung hilfreich.

Von daher würde ich dem TO ebenfalls zu Peters Hinweis raten:

Peter D. schrieb:
> Also kürze das Programm erstmal sinnvoll ein und dann sehen wir weiter.
> Es kann durchaus sein, daß Du dabei den Fehler schon selber findest.

Und vor allem sollte der TO sich angewöhnen, besser zwischen seiner 
tatsächlichen Beobachtung und seiner (oft falschen) Interpretation zu 
unterscheiden. Er sieht z.B., dass eine LED unerwartet eingeschaltet 
wird. Er interpretiert hinein, dass Code innerhalb eines if-blocks 
ausgeführt wird, obwohl die Bedingung des if-blocks nicht erfüllt ist.

Diese Interpretation ist sicher falsch, denn solche Fehler macht der 
Compiler nicht.

Mögliche Erklärungen für die unerwartete Beobachtung sind:
- die LED wird an einer ganz anderen Codestelle angeschaltet, als vom TO 
vermutet
- die Bedingung der if-Abfrage ist während eines "späteren" 
Schleifendurchlaufs eben doch mal erfüllt, so dass der Code im if-block 
ausgeführt werden muss. Der TO hängt aber beim Durchdenken des Programms 
(bzw. durch durchsteppen des Programms im Debugger) noch in einem 
"früheren" Schleifendurchlauf fest, bei dem die Bedingung noch nicht 
erfüllt ist.

Genau für solche Denkfehler ist das Vereinfachen des Programms der 
sinnvolle Ansatz. Dasselbe gilt für "Debugausgaben" auf der seriellen 
Schnittstelle, die auch schon vorgeschlagen wurden. Anhand derer lässt 
sich erkennen, wie häufig die Schleife schon durchlaufen wurde, welchen 
Wert die Variablen zwischenzeitlich angenommen haben, ob die Bedingung 
der if-Anweisung zwischenzeitlich nicht doch mal erfüllt ist... Hier 
muss man allerdings aufpassen, dass das Versenden der seriellen 
Nachrichten das Timing des Programms nicht so stark verändert, dass es 
zu einem anderen Gesamtablauf führt. Zwischenzeitlich hatte der TO mal 
eine Codevariante gezeigt, wo eine Entprellung im 2ms Raster arbeitet - 
das könnte auf Verzögerungen durch den seriellen Monitor empfindlich 
reagieren.
Gast #6496781
Lesenswert?

Achim S. schrieb:
> Nun: da wird nichts "immer wieder auf 0 gesetzt". Die Variablen sind zu
> Beginn auf 0 initialisiert, während des weiteren Schleifendurchlaufs hat
> diese "Zuweisung von 0" bei der static Deklaration keinen Einfluss mehr.

Da hab ich natürlich dran gedacht. Ich hab aber so meine Zweifel, ob das 
innerhalb dem Block funktioniert. Zumindest ist die Konstruktion -so wie 
in dem Beispiel- extrem ungewöhnlich. Ich habs noch nie gesehen und hab 
es noch nie so selbst verwendet.
Innerhalb des obersten Blocks einer Funktion würde ich dir sofort 
zustimmen. Aber so ... ?
Gast #6496794
Lesenswert?

Nick M. schrieb:
> Ich hab aber so meine Zweifel, ob das
> innerhalb dem Block funktioniert.

Hm: ich sehe gerade, dass meine Verlinkung auf Wikibooks nicht 
funktioniert. Der . am Ende gehört zum Link, wird aber hier als 
Satzzeichen interpretiert, so dass man nicht beim eigentlich gewünschten 
Artiel landet. Bitte einfach den . in der Adressezeile des Browsers 
anhängen, die Beschreibung dort ist imho recht eindeutig.
Gast #6496806
Lesenswert?

Achim S. schrieb:
> Bitte einfach den . in der Adressezeile des Browsers
> anhängen, die Beschreibung dort ist imho recht eindeutig.

Das mit dem Link hab ich selbstständig geschafft. :-)
Die Beschreibung ist mir durchaus geläufig. :-)
Nur, das Konstrukt vom TO kenn ich nicht. Ich finde es so seltsam, dass 
der Kompiler-Hersteller es möglicherweise übersehen hat.

Das static innerhalb einer Funktion beschränkt die Sichtbarkeit der 
Variablen auf die Funktion. Ansonsten ist es wie eine static-Variable 
mit File scope und kann genauso initialisiert werden. Innerhalb der 
Schleife ist der scope aber nur in der Schleife. Und ob das so 
tatsächlich umgesetzt wurde ... wer weiß.

Klar, ich deklariere Variablen auch innerhalb eines Blocks. Aber 
statische? Kommt mir verquer vor.
Gast #6496812
Lesenswert?

Vergessen:

Noch dazugibt es keinen Grund die als static zu deklarieren. Einfach aus 
der Schleife rausziehen und fertig. Da muss dann niemand die Stirn 
runzeln warum das so geschrieben wurde.
Initialisierung von Variablen für einen Block geschieht normalerweise 
vor dem Block.
Gast #6496816
Lesenswert?

Nick M. schrieb:
> Ich finde es so seltsam, dass
> der Kompiler-Hersteller es möglicherweise übersehen hat.

Denkbar ist vieles, aber an diese Variante glaube ich nicht. Erstens 
halte ich es diesbezüglich mit Peter:

Peter D. schrieb:
> Der Compiler kennt die Regeln und hält sie ein.

(Alle Regeln, die sogar ich kenne, kennt der Programmierer eines 
etablierten C-Compilers mit Sicherheit).

Und wenn es wider aller Erwartung doch anders wäre, dann hätte es 
einfach dazu geführt, dass im Code des TO gar nichts passiert (alle LEDs 
auf dem Initialisierungswert bleiben).

Nick M. schrieb:
> Noch dazugibt es keinen Grund die als static zu deklarieren. Einfach aus
> der Schleife rausziehen und fertig.

viele Wege führen nach Rom.
Gast #6496829
Lesenswert?

Achim S. schrieb:
> (Alle Regeln, die sogar ich kenne, kennt der Programmierer eines
> etablierten C-Compilers mit Sicherheit).

Hihi, OK.
Ich hab jetzt auch nochmal auf Papier nachgeschlagen, da steht es 
deutlicher. Es gilt auch innerhalb eines Blocks innerhalb einer 
Funktion.

> viele Wege führen nach Rom.
Ich fahr lieber über die Brennerautobahn, statt mit 37 Elephanten 
Hannibals Weg nachzuvollziehen. :-)
#6496853
Lesenswert?

Falls der TO noch mitliest:

Diese Zeilen
1
  static uint32_t mt_ms = 0;
2
  static uint32_t pressStart = 0;
3
  static _Bool durchgang = 0;
4
  static _Bool flanke = 0;
5
  static _Bool start = 0;
6
  static _Bool sm1 = 0;
7
  static _Bool sm2 = 0;
8
  static _Bool sm3 = 0;
9
  static _Bool sm4 = 0;
werden nur EINMAL ausgeführt, beim ersten Durchlauf der 
while-Schleife.

merciless
#6496969
Lesenswert?

Tobias K. schrieb:
> Dies ist die richtige Datei, wo es in allen if-Verzweigungen hineingeht,
> obwohl deren Bedingung 0 ist.

Der Code sieht erstmal so aus, als sollte er wirklich nichts tun. Aber 
solche If-Ketten sind der Horror, da kann man schnell den Überblick 
verlieren.
Hat aber lange gedauert, ehe Du endlich das Main zeigst.

Was dann noch fehlt, um welches Target geht es überhaupt, welche 
Toolchain (IDE, Compiler, Debugger).
Ist denn alles richtig eingestellt?
Meintest Du Debugger oder Simulator?

Probier erstmal ein einfacheres Programm, z.B. Blink-LED.
Gast #6497874
Lesenswert?

Achim M. schrieb:
> Zustände sequentiell abarbeiten ist übrigens auch eine Statemachine.

Ja, aber die State Machine dazu wurde nicht per Hand erstellt.
Da hilft es nicht wirklich weiter wenn du nur auf den zweiten Teil des 
Satzes eingest.

Dennoch herzlichen Dank für deinen Hinweis.
#6497900
Lesenswert?

Achim S. schrieb:
> Zwischenzeitlich hatte der TO mal
> eine Codevariante gezeigt, wo eine Entprellung im 2ms Raster arbeitet -
> das könnte auf Verzögerungen durch den seriellen Monitor empfindlich
> reagieren.

Die war mir auch aufgefallen, wobei mir 2 ms etwas arg kurz für eine 
Entprellung erscheinen. Vielleicht klappt es deshalb auch beim Debuggen, 
weil das langsamer ist oder gar nur in einem Emulator läuft.

Thomas F. schrieb:
> Sein Problem:
> Es wird in if-Verzweigungen gesprungen obwohl die Bedingung
> offensichtlich FLASE ist.

… obwohl er der Meinung ist, dass sie false sein müsste. Wenn da 
nämlich reingesprungen wird, obwohl sie offensichtlich false ist, ist 
der Compiler oder der µC kaputt.

> Also vielen Dank für deine Nutzlose Hilfe, ab jetzt ist Tobias wohl
> besser ohne dich dran!

Ohne dich auch, denn du hast bisher genau gar nichts beigetragen, außer 
dich über die Antworten anderer zu beschweren.

Nick M. schrieb:
> Achim S. schrieb:
>> Nun: da wird nichts "immer wieder auf 0 gesetzt". Die Variablen sind zu
>> Beginn auf 0 initialisiert, während des weiteren Schleifendurchlaufs hat
>> diese "Zuweisung von 0" bei der static Deklaration keinen Einfluss mehr.
>
> Da hab ich natürlich dran gedacht. Ich hab aber so meine Zweifel, ob das
> innerhalb dem Block funktioniert.

Lokale Variable stehen immer in einem Block. Ob das der einer Funktion 
oder eines if ist, spielt keine Rolle.

> Zumindest ist die Konstruktion -so wie in dem Beispiel- extrem ungewöhnlich.

Finde ich nicht. Ich hab sie schon oft gesehen.

> Ich habs noch nie gesehen und hab es noch nie so selbst verwendet.
> Innerhalb des obersten Blocks einer Funktion würde ich dir sofort
> zustimmen. Aber so ... ?

Warum sollte man das tun, wenn sie dort gar nicht benötigt wird?

Nick M. schrieb:
> Vergessen:
>
> Noch dazugibt es keinen Grund die als static zu deklarieren. Einfach aus
> der Schleife rausziehen und fertig. Da muss dann niemand die Stirn
> runzeln warum das so geschrieben wurde.
> Initialisierung von Variablen für einen Block geschieht normalerweise
> vor dem Block.

Eine gängige Regel lautet, den Scope einer Variable so klein wie möglich 
zu halten, also möglichst nicht irgendwo weit vorher definieren, sondern 
erst da, wo man sie auch braucht.
Andererseits sollte man sich generell die Nutzung von static innerhalb 
von Funktionen gut überlegen, da sie dann nicht mehr reentrant sind. In 
diesem Fall spielt das keine Rolle, weil es eh um main() geht.
Gast #6498160
Lesenswert?

Rolf M. schrieb:
>> Also vielen Dank für deine Nutzlose Hilfe, ab jetzt ist Tobias wohl
>> besser ohne dich dran!
>
> Ohne dich auch, denn du hast bisher genau gar nichts beigetragen, außer
> dich über die Antworten anderer zu beschweren.

Na, immerhin hab ich den TO dazu gebracht die komplette Version 
rauszurücken weil einfach Teile fehlten.

Dein Beitrag bisher bestand genau aus NULL. Also, hau weiterhin 
unberechtigt aufs Blech, du hast dein Publikum auf deiner Seite.

Rolf M. schrieb:
> Warum sollte man das tun, wenn sie dort gar nicht benötigt wird?

Man benötigt überhaupt keine static dafür, das ist der Punkt. Und eine 
static in einem tieferen Block ist einfach schlechter Stil. Erst recht 
wenn es sinnlos ist.

> Andererseits sollte man sich generell die Nutzung von static innerhalb
> von Funktionen gut überlegen,

Komisch, bei mir bemängelst du die von dir postulierten Regeln.
Also, bis jetzt lediglich rumgestänkert.
Für den ersten Beitrag nicht schlecht.
Dann warte ich auf weitere "Beiträge" von dir.
#6498359
Lesenswert?

Nick M. schrieb:
> Rolf M. schrieb:
>>> Also vielen Dank für deine Nutzlose Hilfe, ab jetzt ist Tobias wohl
>>> besser ohne dich dran!
>>
>> Ohne dich auch, denn du hast bisher genau gar nichts beigetragen, außer
>> dich über die Antworten anderer zu beschweren.
>
> Na, immerhin hab ich den TO dazu gebracht die komplette Version
> rauszurücken weil einfach Teile fehlten.

Schreibst du hier auch unter dem Namen Thomas F. mit, oder warum fühlst 
du dich angesprochen?

> Dein Beitrag bisher bestand genau aus NULL. Also, hau weiterhin
> unberechtigt aufs Blech, du hast dein Publikum auf deiner Seite.

Wenn du mein Posting nicht verstehst, halt dich doch einfach zurück.
Gast #6498641
Lesenswert?

Achim S. schrieb:

> Und vor allem sollte der TO sich angewöhnen, besser zwischen seiner
> tatsächlichen Beobachtung und seiner (oft falschen) Interpretation zu
> unterscheiden.

Das auf jeden Fall.

> Er sieht z.B., dass eine LED unerwartet eingeschaltet
> wird. Er interpretiert hinein, dass Code innerhalb eines if-blocks
> ausgeführt wird, obwohl die Bedingung des if-blocks nicht erfüllt ist.
>
> Diese Interpretation ist sicher falsch, denn solche Fehler macht der
> Compiler nicht.

Das stimmt so leider nicht. Als Ausrede für den Compiler gibt es nämlich 
die Erfindung "UB" (undefined behaviour). D.h.: wenn der Programmierer 
irgendwo irgendwas hinschreibt, was "UB" ist, kann das gesamte 
Programm im Prinzip machen, was es will und es wäre immer noch formal 
korrekt. So jedenfalls die Auffassung der Compilerbauer...

Und nein, wenn man was hinschreibt, was "UB" ist, gibt es meistens keine 
Fehlermeldung, und leider nur allzu oft nichtmal eine Warnung. Es sei 
denn, man schaltet spezielle Warnungen explizit ein. Dann wird man aber 
wiederum mit Warnungen oft vollkommen zugetextet. Je nachdem, was man an 
fremden Quellen benutzt...

Das ist natürlich vollkommen krank, aber absolut typisch für diese 
Bullshit-Sprachen C und C++ und deren wahnwitzige Benutzer.

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