Variablen vs Pin Deklaration

Am Anfang eines Sketches deklariert man ja die Pins und die Variablen, - bei den Variablen kann man ja gleich einen Basiswert mit angeben. Z.B.:

byte AusgabePin = 10;
byte Ausgabewert = 10;

Ich frage mich jetzt: wie unterscheidet die IDE beim compilieren dass einmal ein Pin und das zweite mal ein Inhalt gemeint ist?

Hierbei sicher noch nicht, erst bei der weiteren Verarbeitung.
Z.B. als Pin, oder es bleibt eine Variable.

Daher sollte man PINs auch als const definieren

Acha dann wie?

Gar nicht
FĂŒr die Logik ist der Programmierer zustĂ€ndig.
Also du!

Stellt man es geschickt an, kann man die Pinnummer auch im Datentype unterbringen

Hier eine Blink.ino

#include <CombiePin.h>

using Led = Combie::Pin::OutputPin<LED_BUILTIN>; // UNO Pin 13

void setup(void) 
{
   Led{}.init();
}

void loop(void) 
{
    Led{}.toggle();
    delay(1000);
}

Nur ist daran nicht zu erkennen, ob es eine Pin-Definition ist.
Auch Variable dĂŒrfen const sein.

Du sprichst das was ich vermutet habe gelassen aus... :slightly_smiling_face:

Habe was gefunden
https://rurandom.org/justintime/w/Arduino-like_pin_definitions_in_C%2B%2B

Dann ist es keine Variable mehr. Variablen, sind wie der Name schon sagt, variabel. Konstanten sind konstant.

https://www.learncpp.com/cpp-tutorial/constant-variables-named-constants/

das was du hingeschrieben hast sind zwei Variablen.
Ob du das dann fĂŒr ein "Pin" verwendest oder nicht, unterscheidet der Compiler nicht.

Ich vermute da ein XY Problem. Worum geht es dir genau?

const byte AusgabePin = 10;
byte Ausgabewert = 10;

void setup() { 
  pinMode(AusgabePin , OUTPUT);
}

void loop() {
  analogWrite(AusgabePin , Ausgabewert );
  Ausgabewert++; 
}

So passt alles.
Wenn du jetzt

byte AusgabePin = 10;
const byte Ausgabewert = 10;

void setup() { 
  pinMode(AusgabePin , OUTPUT);
}

void loop() {
  analogWrite(AusgabePin , Ausgabewert );
  Ausgabewert++; 
}

schreibst, gibt es folgende Fehlermeldung:

Arduino: 1.8.16 (Windows 10), Board: "Arduino Uno"


C:\Users\Testuser\Documents\Arduino\sketch_aug14a\sketch_aug14a.ino: In function 'void loop()':

sketch_aug14a:10:14: error: increment of read-only variable 'Ausgabewert'

   Ausgabewert++;

              ^~

exit status 1

increment of read-only variable 'Ausgabewert'

Wen du aber machst ohne Ausgabewert ++ funktioniert, das was du hier zeigst ist nicht die Antwort.
Ich kann kein Englisch, nur meine das das Wort const + variable hat andere Bedeutung als im normalem Leben, erwarte auch eine Antwort auf #4 :wink: , define darf man dafĂŒr nutzen, nur wo zu noch den preprocessor (oder precompiler) mitziehen wenn es geht ohne.
und es ist doch eine constante variable, schreibt dir doch der Compiler
read-only variable 'Ausgabewert'

.

Hier muss ich mal ein wenig quertreiben.

In C++ hat const durchaus mehrere Bedeutungen/Einsatzzwecke,

const sagt durchaus nicht, dass etwas konstant ist.
In den meisten FĂ€llen sagt es nur, das etwas "read only" ist.

constexpr ist schon deutlich nÀher an konstant dran.
Und consteval noch ein StĂŒckchen

Beispiele:

  1. const testA = 5;
    Ist read only fĂŒr das Programm, kann aber von außen geĂ€ndert werden.
  2. volatile const testA = 5;
    Dann bekommt das Programm auch die Ă€ußerliche Änderung mit.
  3. constexpr testA = 5;
    Das macht es wirklich unverĂ€nderlich und spart, in den meisten FĂ€llen, auch den Platz fĂŒr das benannte Objekt ein.

Wenn man dem Optimizer wirklich auf die SprĂŒnge helfen will, und Dinge "konstant" machen möchte, dann constexpr fĂŒr Pins verwenden. Oder eben, wie schon vorgefĂŒhrt, die Pinnummer im Datentype versenken, denn Datentypen Ă€ndern sich nicht zur Laufzeit. Sind also auf ihre eigene Art durchaus konstant.

Ich weiß, ich bin da etwas pingelig an der Stelle......

Bitte ersetze das Wort "etwas" durch "sehr".

Ich denke 99% der User hier wissen nicht wie die Konstante / Variable von "von außen geĂ€ndert werden" kann. Ich auch nicht.

Etwas nicht zu wissen, ist erstmal kein Drama. Werden wir doch alle mit nahe Null Wissen geboren. Das Drama beginnt, wenn man die WissenslĂŒcken mit Fantasie ausfĂŒllt. Also mit irrationalen Annahmen.

Merksatz:

Der Weg in die Hölle ist mit falschen Annahmen gepflastert.

Und ja: Der menschliche Geist neigt dazu, die weißen Flecken im Wissen bunt aus zu malen.
u.A. weil es fĂŒr viele echt unangenehm ist, sich Unwissen einzugestehen.
Dabei ist es doch gerade dieses EingestÀndnis, welches die eigene Entwicklung vorwÀrts treibt, treiben kann.

z.B. beim AVR, die ganzen Hardwareregister liegen im Adressraum, in dem auch das RAM liegt.
Diese Register können sich Ă€ndern, ohne dass das Programm dafĂŒr ursĂ€chlich ist.
Manche dieser Register dĂŒrfen nicht beschrieben werden. Sollten also read only fĂŒr das Programm sein.

1 Like

Ich hab vor dem lesen Deiner Schnipsel etwas mehr erwartet. :slight_smile:
Ausgehend von der Frage:

das mal abgewandelt:

const byte AusgabePin = 10;
byte Ausgabewert = 10;

void setup() { 
  pinMode(AusgabePin , OUTPUT);
}

void loop() {
  analogWrite(Ausgabewert, AusgabePin);  // :-)
  Ausgabewert++; 
}

Erst hier wird klar, was den Unterschied zwischen PIN und Wert ausmacht.
Und wie das ganz mÀchtg in die Hose gehen kann.

@herbk erst mit dem Aufruf der Funktion analogWrite() wird aus der Variablen (oder Konstanten) der jeweilige PIN und der zugewiesene Wert.
In Deinem Fall findest Du dazu das passende Äquivalent in Arduino.h und wiring_analog.c

(In letzterer dann auch den Hardwarebezug)

Hast du auch einen Vorschlag, wie man analogWrite() und digitalWrite() so absichert, dass ein vertauschen der Parameter nicht zu eine Fehlfunktion, sondern zu einer Meldung zur Kompilezeit fĂŒhrt?

Nein.

Es ging mir nur um das was ich gefragt hatte, kein Problem im Hintergrund :slight_smile:

Ich versuchs mal umzusetzen...

Danke, - hab's als gelöst markiert