"Interessanter" C++ Code mit mBlock

Ich habe mich in den vergangenen Tagen ein wenig mit grafischen Programmierumgebungen beschäftigt. Ich bin ja eigentlich kein großer Fan von grafischer Programmierumgebung (im Zusammenhang mit C++), aber demnächst sind kurze Workshops geplant für Leute zwischen 9 und 13 Jahren und aus vorigen Veranstaltungen ist bekannt, dass das Tippen (von Programmcode) in dieser Altersgruppe für die meisten eine ziemliche Qual ist. :slight_smile:

So wollen wir (ich mache das gemeinsam mit einem Kollegen) es diesmal mit einer grafischen Programmierumgebung versuchen. Wir haben uns für mBlock entschieden. https://ide.mblock.cc/

Die Basis von mBlock ist wohl Scratch und man kann verschiedene Hardware programmieren (auch in unterschiedlichen Sprachen).
Man kann zum Beispiel Arduino Uno als "Gerät" wählen und verschiedene Libraries hinzufügen. Da wir mit Neopixel/WS2812 arbeiten wollen, habe ich eine passende Library gesucht und es ausprobiert.
Nachdem man ein Tool zum Upload heruntergeladen und installiert hat, funktioniert es recht gut. Der "grafische Code" wird zuerst in C++ "umgewandelt", das Kompilieren erfolgt am Server von mBlock, der entstandene Maschinencode wird dann mit dem Upload-Tool auf den Uno geladen. Das läuft prinzipiell einigermaßen glatt.

Ich persönlich finde dieses "grafische Zeug" ja nicht sooo prickelnd, aber ich bin ja auch nicht die Zielgruppe (und habe mit Tippen überhaupt kein Problem). :slight_smile:
Für einfache Projekte und zum ersten Einstieg kann das schon passen (wir werden es merken).

Den generierten C++ Code kann man sich anschauen, aber er ist nicht direkt veränderbar. Und hier komme ich endlich zu meiner eigentlichen Frage...

Als Beispiel habe ich einfach mal den berühmten Blink-Sketch in mBlock erstellt.

mblock_blink
Hier zusammen mit dem generierten C++ Code:

Und hier nochmal der C++ Code:

// generated by mBlock5 for <your product>
// codes make you happy

#include <Arduino.h>
#include <Wire.h>
#include <SoftwareSerial.h>

void _delay(float seconds) {
  long endTime = millis() + seconds * 1000;
  while(millis() < endTime) _loop();
}

void setup() {
  pinMode(9,OUTPUT);
  while(1) {
      digitalWrite(9,1);
      _delay(1);
      digitalWrite(9,0);
      _delay(1);

      _loop();
  }

}

void _loop() {
}

void loop() {
  _loop();
}

Wenn ich mir den generierten C++ Code anschaue, dann zieht es mir bei Funktion _delay die Schuhe aus, bei dieser Zeile:

long endTime = millis() + seconds * 1000;

Da gibt es also endTime (vorzeichenbehaftet) und millis (vorzeichenlos) und seconds (float) und es wird addiert...

Ich bin ja kein Profi-Programmierer, aber so viele unterschiedliche Datentypen in einer Berechnung, würde ich bei Code den ich selbst schreibe eher vermeiden. Vor allem bei den vorzeichenlosen und vorzeichenbehafteten Datentypen in einer Berechnung laufen mir Schauer über den Rücken. :slight_smile:
Aber vielleicht ist das auch nur meine Paranoia. :slight_smile:

Ich frage mich, was passiert beim Überlauf von "endTime". Der Überlauf wird wohl nach etwa 24,8 Tagen stattfinden, da wird "endTime" dann negativ.
Und dann wird wahrscheinlich endlos (bzw. 24,8 Tage) gewartet, denn ... (ich setze hier mal konkrete Zahlen ein, wie sie nach 24,8 Tagen ungefähr sein könnten):

while (2147483649 < -2147483000) _loop();

Oder sind meine Überlegungen falsch?

Nein, da wird wirklich endlos gewartet, weil der Wert von millis() niemals kleiner als 0 wird.

Ich möchte hier aber etwas beschwichtigend eingreifen. Mit der grafischen Programmierumgebung kann man erste Programmierschritte machen, aber das wird niemand ernsthaft für einen Sketch einsetzen, der länger als 24 Tage laufen soll. Somit ist dieser Fehler zwar unschön, aber für den vorgesehenen Anwendungszweck nicht wirklich behindernd.

Das würde ich nicht so sehen. Gerade der Anfänger verlässt sich auf solche Codegeneratoren und ist dann auch der Meinung, dass der erzeugte Code richtig sei. Deshalb betrachte ich solche gravierenden Fehler als falsches Zeichen an die Leute, die damit etwas lernen wollen/sollen.

Gruß Tommy

Warum nicht? :wink: Ist bunt, klickbar und funktioniert.
Inhaltliches Aussehen hatte ich zum Jahreswechsel bei irgendner HandyApp fürn Cocktailmaker... - da war das genauso gebaut und ich hab mich erstmal reinlesen müssen, was der User da macht ...

also wenn so ein code generiert wird, dann würde ich das nicht herzeigen wollen.

Wendest du mblock richtig an? gibts da vieleicht etwas wie man "setup" und "loop" schöner hinbekommt?

Ich finde das gut!
Denn alles ist zu gebrauchen, und sei es auch nur als abschreckendes Beispiel.

Dafür ist es auf alle Fälle geeignet :wink:

Gruß Tommy

Wenn mblock von mir wäre, wäre ich froh, dass das Arduino-Demobeispiel "funktioniert" und mich um meine zigTausend anderen Probleme kümmern.
Die Probleme bei solchen Klick-Umgebungen sind doch eher, was man fest und was man wie parametrierbar machen soll. Und das fest vorgegebene soll den Benutzer ja gar nicht interessieren.

Ob solcherart generierter Code geeignet ist, daran programmieren zu lernen, ist nicht der Maßstab.

Als abschreckendes Beispiel taugt es allemal.

1 Like

+1

Ich frage mich allerdings, ob es wirklich ratsam oder beabsichtigt ist, den aus der Grafik erzeugten C++ Code hinterher zu sezieren. Geht es nicht eher darum, ein Grundverständnis für Abläufe, Bedingungen und Strukturen eines "Computerprogramms" herzustellen?

Außerdem frage ich mich, ob es so eine Art der grafischen Herangehensweise auch für echte objektorientierte Herangehensweise gibt - da würde ich selbst gerne mal reinschauen.

Mach es lieber nicht :wink: es dürfte noch schrecklicher sein.

Gruß Tommy

Danke. Ja das stimmt natürlich - habe ich übersehen.

Also das Herzeigen des C++ Codes ist eher nicht geplant (unabhängig davon ob er gut oder schlecht ist). Aber stimmt - unbedingt würde ich so etwas nicht unbedingt herzeigen wollen.

Ich denke schon, dass ich es richtig anwende. Es gibt etliche Programmbeispiele. Dabei ist loop immer leer und nur setup ist "besiedelt", es gibt natürlich oft zusätzliche Funktionen.

Danke für alle Beiträge und Meinungen!

Es stimmt sicher, dass Anfänger sich darauf verlassen, dass es so (gut) funktioniert, wie @Tommy56 meint.
Andererseits soll es bei unserem Projekt hauptsächlich darum gehen Grundverständnis für Abläufe zu schaffen, wie @wno158 sagt, und Interesse an Mikrocontrollern und Programmieren zu wecken.

Was ich persönlich interessant finde: Es entsteht hier eine zusätzliche Ebene - diese grafische Ebene. Die C++ Ebene, die "darunter" liegt kann ich mir ansehen und einigermaßen verstehend lesen und eventuell beurteilen. Da kann ich dann zum Beispiel zu dem Ergebnis kommen: "Na sowas - das ist kein guter C++ Code, das müsste man eigentlich anders machen".
Aber das ist ja nicht die letzte Ebene. Darunter ist ja zumindest noch die Ebene des Maschinencodes den der Kompiler erzeugt. Der bleibt aber meist verborgen - zumindest für mich. Den kann ich nicht beurteilen ob er "gut, elegant" oder "schlecht, umständlich" ist. Einfach, weil ich den nicht lesen kann...
Ich könnte mich natürlich damit beschäftigen und dann könnte ich ihn auch lesen und verstehen, aber um ehrlich zu sein: ich fürchte, dass das wenig "Spaß" macht und dafür reicht mein Interesse höchstwahrscheinlich nicht ganz. :slight_smile:

Jedenfalls werden wir dieses grafische "Dings" mal ausprobieren und schauen, wie die jungen Leute darauf reagieren und wie sie damit umgehen.
Vielleicht hilft es den Einstieg ins Programmieren etwas zu erleichtern - trotz aller Unzulänglichkeiten.

Auf jeden Fall ist es gut zu wissen, wo die Schwächen liegen. :slight_smile:

Und diese Schwächen solltest Du (am Ende?) deinen Schülern auch mitteilen.

Gruß Tommy

Hallo,

das Zeug ist nicht dazu gedacht sich hinterher den Code anzuschauen. Das macht die Zielgruppe sowieso nicht. Jemand der Scratch Android programmiert wird sowas vermutlich auch finden.

Ja.
Erklären, das die Programme meist nicht für Dauerbetrieb taugen, weil die Möglichkeit besteht, dass sie nach ein paar Wochen "stehenbleiben" könnten, das werden wir uns vornehmen.

Ja, stimmt.

... nach dem (hier selbst eintragen) Durchlauf.
Speicher kommt (meist) früher als millis(). :slight_smile:

Bin nicht in einer Schule tätig, aber...
Das mit den "Schwächen" halte ich für die Altersgruppe 9 - 13 für nicht lebensnotwendig - oder unterschätze ich die?
Stattdessen regt vielleicht am Ende der Workshops ein Vergleich mit ordentlichem (handgeschriebenem) Code in der Arduino-IDE, der dasselbe tut, den einen oder die andere zum Weiterforschen an.

Ich bin ja auch nicht an einer Schule tätig :slight_smile:
Ich denke die Altersspanne von 9 bis 13 ist recht groß. Da sind die einen noch "richtige Kinder" und die anderen wirken schon "recht erwachsen". Und ich habe auch schon "kleine Nerds" dieses Alters kennen gelernt. (Ich würde mich wahrscheinlich als "alten Nerd" bezeichnen :slight_smile: ).
Aber für die meisten spielt es höchstwarhscheinlich keine große Rolle und ist wohl nicht lebensnotwendig, da hast du sicher Recht.

Ja, Anregung und Interesse wecken, genau darum soll es bei den Workshops gehen.

Die Zielgruppe von Kindern die keinen C-Code manuell schreiben weil sie das überfordert, ist eine Erklährung nicht zielführend.
Wenn sie den Unterschied verstehen würden könnte man gleich in C Programmieren und nicht grafisch.

Uwe

Wenn du wirklich Speicher-Mist baust, kommt der bei loop()-Zyklen im Millisekunden-Bereich "sofort". Nach 32 Sekunden geht auf AVR 8Bit-Hardware ein int-Vergleich mit millis() oder sowas ähnliches in die Hose.


Dass man in der Arduino-IDE in der Arduino-Sprache programmiert, woraus dann C++ generiert wird, und das ganze hochgeladen werden kann, ohne dass man makefiles erstellen muss, ... ist ja schon was für Dummies, oder?

:stuck_out_tongue:

Wie viele Möglichkeiten der Arduino-Hardware da der Einfachkeit (o.a. Gründen) geopfert werden, ist doch traurig, könnte man in anderen Foren diskutieren.

2 Likes

Mit diesen grafischen Dingern habe ich herzlich wenig am Hut!

Mein Rat:
Wenn der Generator Mist baut, sollte man dieses dem Erzeuger des Wunderwerks mitteilen, damit er es reparieren kann.
Denn das treibt die Sache in die richtige Richtung.
Im Forum lästern, ist vielleicht lustig, aber bringt nicht viel.

Ich habe schon weit über ein Dutzend solcher Requests abgesetzt. Meistens ist darauf positiv reagiert worden. Sowohl beim Arduino Core, als auch bei den verschiedensten Libs.