- SF800 Solar Speicher Tutorial    Werbung      
Ergebnis 1 bis 10 von 69

Thema: Welche Möglichkeiten der Fehlersuche hat man beim Arduino?

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    HaWe
    Gast
    Aber es ist halt jedem selbst überlassen wie er Programmiert.
    Dafür muß man dann aber auch hinnehmen das es immer wieder zur selben Diskussion kommt, wenn man solchen Code vorlegt.
    ist ja ok, wenn man nicht iwas immer nur pauschal verteufelt. Selbst erfahrene Programmierer verwenden u.U. goto, und in diesem jetzt folgenden sehr speziellen Fall sah ich auch keine andere Möglichkeit, als es meinem Vorbild bei der Arduino- und Raspi-Portierung gleich zu tun: http://www.mindstormsforum.de/viewto...p=66103#p66103
    http://www.mindstormsforum.de/viewto...p=66103#p67841
    ceterum censeo, auch switch/case ist nichts anderes als ein verkapptes goto.

    @fredyxxx, zurück zum
    while(!digitalRead(testpin));
    while( digitalRead(testpin));
    https://www.arduino.cc/en/Reference/DigitalRead
    ...: funktioniert das jetzt so?

  2. #2
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    18.03.2013
    Beiträge
    242
    Zitat Zitat von HaWe Beitrag anzeigen
    @fredyxxx, zurück zum

    while(!digitalRead(testpin));
    while( digitalRead(testpin));
    ...: funktioniert das jetzt so?
    Hallo HaWe,

    ja, erstaunlicherweise funktioniert es nur mit Semikolon's so. Mit geschweiften Klammern verhält es sich anders. Ich hatte das für einen Fehler gehalten, weil der Befehl hier http://https://www.arduino.cc/en/Reference/While mit Klammern beschrieben ist.

    Das mit dem digitalRead hatte ich wohl ohne darüber nachzudenken sowieso schon richtig gemacht.

    vG
    fredyxx

  3. #3
    HaWe
    Gast
    jap, in den Klammern steht der Körper:
    while(Bedingung) {Körper}
    der Körper wird solange wiederholt ausgeführt, wie die Bedingung True ist.
    Er soll aber gar nichts öfters ausführen, sondern nur warten, solange die Bedingung wahr ist, also die Taste (noch) NICHT gedrückt wurde.
    Daher brauchen wir keinen Körper:
    ! (digitalRead(13) ) // Taste an dPin13 nicht gedrückt
    Sobald sie gedrückt wurde, soll er printen,
    und dann wieder warten, solange eine neue Bedingung True ist :
    (digitalRead(13) ) // Taste an dPin13 (weiterhin ) gedrückt, (noch) nicht losgelassen
    - ebenfalls ohne irgendwas dabei zu tun.
    Sobald die Taste losgelassen wurde (ButtonUp), macht er dann ganz normal mit den Folgebefehlen weiter.
    Bild  

  4. #4
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    07.03.2011
    Beiträge
    1.899
    Zitat Zitat von HaWe Beitrag anzeigen
    jap, in den Klammern steht der Körper:
    while(Bedingung) {Körper}
    der Körper wird solange wiederholt ausgeführt, wie die Bedingung True ist.
    Er soll aber gar nichts öfters ausführen, sondern nur warten, solange die Bedingung wahr ist, also die Taste (noch) NICHT gedrückt wurde.
    Daher brauchen wir keinen Körper:
    Wenn du schon so lang ausholst, dann bitte richtig:

    nach einem while wird der nächste Befehl ausgeführt, solange die Bedingung wahr ist. Und zwar ein und genau ein Befehl. Wird im Körper, wie du das bezeichnet hast, mehr als ein Befehl gebraucht, fasst man sie durch geschweifte Klammern zu einem Befehl zusammen. Mindestens ein Befehl muß aber dastehen, zur Not ein leerer Befehl, der nur aus dem Semikolon, dem Befehlsende in C, besteht. Ein C NOP gewissermaßen. Gute Praxis ist, selbst wenn es nur einen Befehl ist, ihn in geschweiften Klammern zu schreiben. Zusammen mit passenden Einrückungen sieht man dann viel schneller, was alles zur Schleife gehört.

    Code:
    while ( digitalRead(13) ) {
        ;
     }
    Und natürlich wird etwas öfter ausgefürt, nämlich das Lesen des Portpins. Wenn man das deutlich machen will, sollte man schreiben:
    Code:
    while ( true ) {
          if ( digitalRead(13) == 1 ) {
              break;
          }
    }
    So kapiert jeder sofort, worum es geht, selbst wenn er nach Jahren noch mal auf diesen Code stößt.

    MfG Klebwax
    Strom fließt auch durch krumme Drähte !

  5. #5
    HaWe
    Gast
    ich denke, das war unnötig wie ein Kropf :-/

  6. #6
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    07.03.2011
    Beiträge
    1.899
    Zitat Zitat von HaWe Beitrag anzeigen
    ich denke, das war unnötig wie ein Kropf :-/
    Wenn Hr. Doktor nicht mehr zu meckern hat, war ja alles richtig

    MfG Klebwax
    Strom fließt auch durch krumme Drähte !

  7. #7
    Unregistriert
    Gast
    Zitat Zitat von Klebwax Beitrag anzeigen
    nach einem while wird der nächste Befehl ausgeführt, solange die Bedingung wahr ist. Und zwar ein und genau ein Befehl. ...
    Das finde ich jetzt toll und sehr schön zusammengefaßt. Danke.

  8. #8
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    27.08.2013
    Ort
    Region Basel
    Alter
    68
    Beiträge
    2.435
    Zitat Zitat von HaWe Beitrag anzeigen
    ist ja ok, wenn man nicht iwas immer nur pauschal verteufelt. Selbst erfahrene Programmierer verwenden u.U. goto, und in diesem jetzt folgenden sehr speziellen Fall sah ich auch keine andere Möglichkeit, als es meinem Vorbild bei der Arduino- und Raspi-Portierung gleich zu tun: http://www.mindstormsforum.de/viewto...p=66103#p66103
    http://www.mindstormsforum.de/viewto...p=66103#p67841
    GOTOs sind bei einem erfahrenen Programmierer ein (seltener) Ausnahmefall und nicht die Regel.

    Du wirst da GOTOs bei der Fehler- oder Ausnahme-Behandlung finden, also immer nur dann, wenn der normale Programmablauf abgebrochen werden muss, bzw. eine lineare Abarbeitung des Programms nicht mehr möglich ist.

    In C wären noch setjmp() und longjmp(), bzw. in C++ catch(), throw usw. Damit kann man dann auch an eine Position ausserhalb der aktuellen Funktion springen.

    MfG Peter(TOO)

    - - - Aktualisiert - - -

    Zitat Zitat von Klebwax Beitrag anzeigen
    Wenn du schon so lang ausholst, dann bitte richtig:

    nach einem while wird der nächste Befehl ausgeführt, solange die Bedingung wahr ist. Und zwar ein und genau ein Befehl. Wird im Körper, wie du das bezeichnet hast, mehr als ein Befehl gebraucht, fasst man sie durch geschweifte Klammern zu einem Befehl zusammen. Mindestens ein Befehl muß aber dastehen, zur Not ein leerer Befehl, der nur aus dem Semikolon, dem Befehlsende in C, besteht. Ein C NOP gewissermaßen.
    In C darf überall wo ein Befehl stehen darf auch ein Block (ein oder mehrere Befehle in geschweiften Klammern) stehen!
    Hinzu kommt noch, dass bei den neueren C-Versionen (ab C99 ?) in so einem Block auch lokale Variablen deklariert werden dürfen, welche dann nur innerhalb diese Blocks gültig und sichtbar sind.

    MfG Peter(TOO)
    Manchmal frage ich mich, wieso meine Generation Geräte ohne Simulation entwickeln konnte?

Ähnliche Themen

  1. 18 PWM Kanäle - Welche Möglichkeiten?
    Von Hardware-Entwickler im Forum Elektronik
    Antworten: 7
    Letzter Beitrag: 19.12.2015, 14:16
  2. Antworten: 8
    Letzter Beitrag: 21.10.2014, 09:18
  3. Möglichkeiten der AVR/Arduino PWM?
    Von ichbinsisyphos im Forum Arduino -Plattform
    Antworten: 10
    Letzter Beitrag: 23.02.2013, 09:03
  4. Spannungen mit PC-Computer Messen. Welche Möglichkeiten?
    Von petermetertr im Forum PC-, Pocket PC, Tablet PC, Smartphone oder Notebook
    Antworten: 14
    Letzter Beitrag: 26.08.2009, 16:36
  5. 20 mikrovolt-Hirnwellen registrieren-Welche möglichkeiten?
    Von Thomas Wellheim im Forum Allgemeines zum Thema Roboter / Modellbau
    Antworten: 13
    Letzter Beitrag: 18.12.2004, 18:43

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

    Werbung      fchao-Sinus-Wechselrichter AliExpress