- Labornetzteil AliExpress         
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
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    04.09.2011
    Ort
    Hessen
    Beiträge
    707
    Um endlich wieder bei
    Frage: Wie kriegt der Stack diesen Ablauf gebacken ?
    weiterzumachen:

    In C++ kommt noch eine weitere Komplexität hinzu. Das ist auch der Grund, warum gotos unerwartete Nebeneffekte haben können, die man nicht gut sieht, wenn über mehrere Bildschirmseiten gesprungen wird.

    Nehmen wir mal an, man verwendet Dinge aus einer Arduino Lib, hier zur Demonstration mal mit Debug-Ausgaben
    Code:
    struct Ding
    {
      ~Ding()
      {
        Serial.printf("Fertig");
      }
    }
    Wenn sowas jetzt in Code auftaucht, ein switch ist hier nur ein Beispiel
    Code:
    switch(i)
    {
      case 1:
      {
         Ding a;
         // ....
         break;
      }
      case 2:
        /...
    }
    
    Serial.printf("Test");
    Dann ist die Ausgabe
    Fertig
    Test

    Sowas kann auch passieren, wenn ein goto über { oder } hinwegspringt, vorwärts oder rückwärts.

    - - - Aktualisiert - - -

    Zitat Zitat von HaWe Beitrag anzeigen
    die Frage der Zwischenwerte wird ebenfalls in deinem Link diskutiert. Es bleibt dabei:
    switch/case basiert auf goto mit jump labels / jump tables und es entspricht NICHT if/ else if / else if.
    Dazu reicht es einfach aus dem Link zu zitieren
    ...
    Next, how do we jump to these calling targets?
    ...
    The logic is not too hard to understand. ...Rewrite the snippet like this:
    ...
    i2 = i;
    if i2 > 700 goto LN14;
    if i2 == 700 goto LN5;
    if i2 > 250 goto LN15;
    if i2 == 250 goto LN7;
    if i2 == 100 goto LN9;
    if i2 == 200 goto LN8;
    goto LN1;
    LN15:
    if i2 == 500 goto LN6;
    goto LN1;
    LN14:
    if i2 == 750 goto LN4;
    if i2 == 800 goto LN3;
    if i2 == 900 goto LN2;
    goto LN1;

  2. #2
    HaWe
    Gast
    und siehe da...:
    goto's, wer hätte das gedacht?
    Und keine if /else if/else if/... sondern nur hintereinander geschriebene if's.

    Natürlich kann man auch Fehler mit goto's machen, aber C ist ja gerade dafür entwickelt worden, um alles möglich zu machen - gehen tut alles mit C, der Programmierer ist für alles verantwortlich, auch für seine Fehler, und eben nicht die Programmiersprache oder der Compiler.

    Whatever -
    mein Standpunkt war ja nichts anderes als das gerade hier Beschriebene, goto's sind eben auch nicht viel anders als switch/case und keines ist schöner, besser oder vielseitiger oder mächtiger.

    Für if /else if/else if/ gilt das allerdings schon, was das besser oder vielseitiger oder mächtiger anbelangt. Ich denke, auf diesen Standpunkt können wir uns ohne weiteres einigen.

  3. #3
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    04.09.2011
    Ort
    Hessen
    Beiträge
    707
    Zitat Zitat von HaWe Beitrag anzeigen
    Für if /else if/else if/ gilt das allerdings schon, was das besser oder vielseitiger oder mächtiger anbelangt. Ich denke, auf diesen Standpunkt können wir uns ohne weiteres einigen.
    Ja sicher.

    Und ja, in Assembler wird if else zu einer Art if goto, ein else gibt es da nicht.

    Übrigens ist ein switch mittlerweile auch schon recht mächtig. Zwar noch nicht in der Arduino IDE, aber neuere C++ Compiler erlauben sowas
    Code:
    constexpr int quadrat(int n) noexcept
    {
    	return n * n;
    }
    
    int main()
    {
    	for (int i = 0; i < 10; i++)
    	{
    		switch (i)
    		{
    		case quadrat(1):
    			printf("i ist 1\r\n");
    			break;
    		case quadrat(2):
    			printf("i ist 4\r\n");
    			break;
    		case quadrat(3):
    			printf("i ist 9\r\n");
    			break;
    		default:
    			break;
    		}
    	}
        return 0;
    }
    Gerade in Visual Studio getestet.
    Geändert von Mxt (17.09.2016 um 11:24 Uhr)

  4. #4
    Erfahrener Benutzer Robotik Visionär Avatar von oberallgeier
    Registriert seit
    01.09.2007
    Ort
    Oberallgäu
    Beiträge
    8.695
    .. Und ja, in Assembler wird if else zu einer Art if goto, ein else gibt es da nicht ..
    Wirklich sehr lehrreiche Diskussion und informative Ausführungen! Sorry, dass mein OT Deinem Assembler-Zusatz folgt. Aber sind nicht diese ganzen
    Code:
    SBRC Rr, b Skip if Bit in Register Cleared if (Rr(b)=0) PC ← PC + 2 or 3 None 1/2/3
    SBRS Rr, b Skip if Bit in Register is Set if (Rr(b)=1) PC ← PC + 2 or 3 None 1/2/3
    ...
    BREQ k Branch if Equal if (Z = 1) then PC ← PC + k + 1 None 1/2
    Branch und Skip Befehle nicht genau für so ein "else" geeignet?
    Anm: Auszug aus Atmel-42735A-ATmega328/P_Datasheet_Complete-06/2016, S432, 36. Instruction Set Summary.
    Ciao sagt der JoeamBerg

  5. #5
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    04.09.2011
    Ort
    Hessen
    Beiträge
    707
    Wahrscheinlich ja. Die Aussage "kein else" ist ja eventuell auch wieder Architekturabhäng. Manchal gibt es nur ein "jump if zero" und "jump if not zero", da muss ein if else dann natürlich etwas umgebaut werden.

  6. #6
    Unregistriert
    Gast
    "goto" wurde meiner Meinung nach nur in höhere Programmiersprachen aufgenommen um den Maschinensprachlern den Aufstieg zu erleichtern und wurde später nicht entfernt, um am Vorkommen im Sourcecode auf den erstn Blick den Anfängerauthor vom Fortgeschrittenen unterscheiden zu können

  7. #7
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    04.09.2011
    Ort
    Hessen
    Beiträge
    707
    Manchmal gibt es nichts anderes (außer evtl. der Zerlegung in mehrere Funktionen)
    Code:
    for( ... ganzviel ...) {
      for( ... nochmehr ...) {
        for( ... immer mehr ...) {
          if (bedingung) {
            goto nix_wie_weg;
          }
        }
      }
    }
    
    nix_wie_weg:
    und wie schon oben zitiert, viele Parsergeneratoren erzeugen Code mit vielen gotos.

  8. #8
    Erfahrener Benutzer Robotik Einstein Avatar von i_make_it
    Registriert seit
    29.07.2008
    Ort
    Raum DA
    Alter
    56
    Beiträge
    2.814
    Zitat Zitat von Unregistriert Beitrag anzeigen
    "goto" wurde meiner Meinung nach nur in höhere Programmiersprachen aufgenommen um den Maschinensprachlern den Aufstieg zu erleichtern und wurde später nicht entfernt, um am Vorkommen im Sourcecode auf den erstn Blick den Anfängerauthor vom Fortgeschrittenen unterscheiden zu können

    GOTO wurde nicht in Hochsprachen "aufgenommen".
    In den ersten nicht Assembler Sprachen war GOTO und GOSUB die ersten und auch einzigen Verzweigungssmöglichkeiten in den Sprachen. Da wurde einfach eine eins zu eins Abbildung auf die verschiedenen JMP und BR Befehle vorgenommen.
    Erst mit ALGOL wurde WHILE, FOR, IF, ELSE für Verzweigungen eingeführt.
    GOTO funktioniert, denn beim Kompilieren werden alle modernen Konstrukte auf JMP und BR (bzw. ihren OPCode) zurückgeführt.
    Die modernen Konstrukte halten einem halt die Arbeit vom Halse selbst den Überblick zu behalten und vor allem fördert es die Verständlichkeit und Lesbarkeit des Quellcodes.

    Ich schreibe auch heute noch seitenlangen Code mit GOTO wenn es in der jeweiligen Sprache nichts anderes gibt. Allerdings bin ich es jetzt auch seit 34 Jahren so gewohnt.
    Dafür sitzte ich aber auch vor Quellcode den ich vor X Jahren selbst geschrieben habe und brauche meine Zeit um zu verstehen was ich damals da gemacht habe und warum.

    Ein Anfänger sollte sich halt überlegen ob er nicht gleich lernt zeitgemäß zu programmieren und sich zu verbessern oder Code zu produzieren der bei jeder Änderung fehleranfällig ist.
    Der Arduino Compiler sollte schon mit GOTOs klar kommen. Aber optimieren wird er den Code wohl nicht großartig.

    Es käme mal auf einen Versuch an die selbe Aufgabe einmal mit GOTOs und einmal ohne zu programmieren und dann zum einen festzustellen wie groß die beiden Compilate werden und welche Zykluszeiten sie dann bei der Ausführung haben.

    1993 habe ich das mal für ein IBM S360 System mit Assembler, COBOL und APL2 gemacht. War interessant.
    Geändert von i_make_it (17.09.2016 um 12:44 Uhr)

  9. #9
    HaWe
    Gast
    goto ist nicht mehr und nicht weniger zeitgemäß als switch/case oder if/else, und auch eine Zeitreise durch die Historie seit Adam und Eva in der Geschichte der Computer führt hier nicht wirklich weiter (wir reden schließlich von C und C++ jetzt und hier im Allgemeinen und bei Arduino im Besonderen, und nicht von Algol oder Cobol oder Fortran von anno einundleipzig). Die Verwendung ist sowohl reine Geschmackssache als auch abhängig von den individuellen Anforderungen im Programm, um unnötig komplizierte if/else/switch/case Verschachtelungen zu umgehen, und jedem Programmierer ist es selbstverständlich erlaubt, alle Befehle zu verwenden, die die Programmiersprache hergibt. Alles andere ist unsinniges und unzulässig verallgemeinerndes Geschwätz und eine ziemlich arrogante Bevormundung, die allesamt zu nichts führen, und wenn man hier auch hundert mal etwas anderes behauptet, wird es dadurch nicht richtiger.

  10. #10
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    27.08.2013
    Ort
    Region Basel
    Alter
    67
    Beiträge
    2.435
    Zitat Zitat von oberallgeier Beitrag anzeigen
    BREQ k Branch if Equal if (Z = 1) then PC ← PC + k + 1 None 1/2[/CODE]Branch und Skip Befehle nicht genau für so ein "else" geeignet?
    Jetzt zäumst du aber das Pferd von Hinten auf!

    Bedingte Verzweigungen gab es schon bei der "Analytical Engine" (1837) von Babbage. Allgemeine Probleme lassen sich nur mit bedingten Verzweigungen lösen.
    Lady Ada hat dann die Assembler-Sprache erfunden und z.B. der Begriff Mnemonic stammt von ihr.

    Das Vorgänger-Modell (die Differenzmaschine, angefangen 1822) war noch ein reiner Number-Cruncher. Da konnte man nur eine mathematische Formel Programmieren, welche dann von der Maschine abgearbeitet wurde.

    MfG Peter(TOO)

    - - - Aktualisiert - - -

    Hallo Mxt,
    Zitat Zitat von Mxt Beitrag anzeigen
    Wahrscheinlich ja. Die Aussage "kein else" ist ja eventuell auch wieder Architekturabhäng. Manchal gibt es nur ein "jump if zero" und "jump if not zero", da muss ein if else dann natürlich etwas umgebaut werden.
    Nein, man brauch nur ein GOTO
    Code:
    10  IF <Bedingung> GOTO 100
    20  REM hier ist der ELSE-Zweig
    .
    .
    90  GOTO 200
    100 REM hier beginnt der IF-Zweig
    .
    .
    200 REM hier geht das Programm weiter
    IF- und ELSE-Zweig kann man vertauschen wenn man die Bedingung invertiert.

    Bei manchen CPUs können bedingte Sprünge aber z.B. nur +/- 127 Byte weit springen. Dann muss man bei grösseren Zweigen auch mit GOTO nachhelfen.
    Code:
    10  IF <Bedingung> GOTO 30
    20  GOTO 100
    30  REM IF-Zweig
    .
    .
    90  GOTO 200
    100 REM ELESE-Zweig
    .
    .
    200 REM hier geht das Programm weiter
    MfG Peter(TOO)

    - - - Aktualisiert - - -

    Hallo Un,
    Zitat Zitat von Unregistriert Beitrag anzeigen
    "goto" wurde meiner Meinung nach nur in höhere Programmiersprachen aufgenommen um den Maschinensprachlern den Aufstieg zu erleichtern und wurde später nicht entfernt, um am Vorkommen im Sourcecode auf den erstn Blick den Anfängerauthor vom Fortgeschrittenen unterscheiden zu können
    Schau die mal ein altes BASIC an, so 1970 oder älter.

    Da gab es nur GOSUB und noch keine Prozeduren.
    Alle variablen waren global.
    Zeilen-Nummern waren zwingend und man konnte nur an Zeilennummern springen.

    Um Platz für Änderungen zu haben, hat man standardmässig die Zeilen in 10er Abständen nummeriert. Einen RENUMBER-Befehl gab es Anfangs nicht. Musste man zu viele Zeilen einfügen musste alle GOTOs von Hand anpassen


    Abgesehen davon:
    Strukturiert und Objektorientiert programmieren konnte man auch schon in Assembler. Allerdings lag das einzig und alleine in der Verantwortung des Programmierers.

    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
  •  

LiFePO4 Speicher Test