Kodierungsfrage

Hallo,
ich möchte folgendes in einem Sketch erreichen:

  • Aufruf einer Unterroutine mit 1 Übergabeparameter vom Typ byte
  • Substituierung des übergebenen Parameters in eine neue Variable
  • interpretieren des Inhalts der neuen Variable für die folgenden Abfragen/Zuweisungen usw.

Beispiel:

vorhandene int Variable Start_M1
zusammengesetzte Variable Hugo = Start_M1
ausführen (interpretieren) von Hugo als Variable Start_M1

Gibt es diese Möglichkeit unter C/C++ oder kann ich mein Ziel auch anders erreichen?

Grüße
Sylvia

Kai Neahnung was Du möchtest :frowning:

Was bedeutet "Substituierung", was ist eine "zusammengesetzte" Variable, was bedeutet "interpretieren"?

Aua. So ein Käse in Studenbriefen / Unterlagen mancher FHs drinnen. TO, besorg' dir ein online Tutorial über C und vergiss den Quatsch - ausser du musst das für eine Übung so lernen, dann bist angeschmiert :slight_smile:

Meine Interpretation Deiner Worte:

jomifa:

  • Aufruf einer Unterroutine mit 1 Übergabeparameter vom Typ byte

Nennt sich Funktion.

jomifa:

  • Substituierung des übergebenen Parameters in eine neue Variable

Könnte eine Wertzuweisung sein.

jomifa:

  • interpretieren des Inhalts der neuen Variable für die folgenden Abfragen/Zuweisungen usw.

Wertveränderung oder bei mir eine Ausgabe auf den seriellen Monitor.

Das könnte dann eventuell so aussehen:

void setup()
{
  Serial.begin(9600);
  Serial.println("Start");
  byte Start_M1 = 55;
  sub(Start_M1);
}

void loop() {}

void sub(byte Hugo) 
{
  Serial.print("Inhalt von Hugo: ");
  Serial.println(Hugo);
}

Hast Du das so gemeint?

Gibt es diese Möglichkeit unter C/C++ oder kann ich mein Ziel auch anders erreichen?

Merke: mit c++ geht "alles".

ich befürchte aber es liegt ein XY Problem vor

Du Fragst nach X, willst aber eigentlich Y.
Beschreibe nicht was du glaubst machen zu müssen, sondern beschreibe, was du machen willst!

// vor dem setup():

void myFunction (byte parameter)
{
  byte andereVariable = parameter;      //Substituierung des übergebenen Parameters in eine neue Variable
  andereVariable = andereVariable*2;   //interpretieren des Inhalts der neuen Variable für die folgenden Abfragen/Zuweisungen usw.
  Serial.println(andereVariable);
}


// und im Programm
//Aufruf einer Unterroutine mit 1 Übergabeparameter vom Typ byte
byte start_M1 = 42;  // Variablennamen immer klein beginnen lassen
myFunction (start_M1 );

agmue, war nun schneller ... na dann ...

DrDiettrich:
Kai Neahnung was Du möchtest :frowning:

Herablassend. Es heißt "keine Ahnung". Und das nehm ich dir sofort ab.

Hallo zusammen,
entschuldigt, dass ich mich wahrscheinlich etwas missverständlich ausgedrückt habe. Ich komme eben von einer anderen Programmiersprache, indem die gewünschte Funktion eben "INTERPRET" heist.
kann
Ich will es mal so versuchen. Ich möchte eine Funktion haben, die ich so benutzen kann, dass x dem übergegebnen Wert motorNummer entsprechen soll. Die realen Variablen lauten:

Motor1_T, Motor2_T usw.

Die Funktion soll also aus dem Teilen "Motor" und dem übergebenen Parameter motorNummer und dem abschließenden Teil "_T zusammengesetzt werden.Danach soll diese Variable ganz normal in der Abfragelogik:

if (digitalRead(Motorx_T) == 0 && (Situation_Mx == false))

.... usw.

genutzt werden können.

Wie geht das?

Du willst den Variablennamen zur Laufzeit zusammensetzen? Also Du übergibst eine 1 und willst dann die Variable Motor_1 verwenden?

Warum plötzlich ein anderer Usernamen?

Gruß Tommy

Du bist da auf einem Irrweg

Man kann das gleich voll objektorientiert machen indem alle Eigenschaften eines Motors in einer Klasse zusammenfasst.

Man kann auch Motor-Objekte an Funktionen übergeben:

void tu_was(Motor& motor)
{
   motor.move(...);
}
Motor motor1;
...
tuwas(motor1);

Wenn man irgendeine Nummerierung braucht kann man auch ein Array aus Motor-Objekten anlegen. Sowas ist oft besser als Variablen durchzunummerieren. Vor allem wenn man mehrmals das Gleiche mit dem Objekt machen will

https://gcc.gnu.org/onlinedocs/cpp/Concatenation.html

Tommy56:
Warum plötzlich ein anderer Usernamen?

Anscheinend möchte Sylvia nicht mehr Joachim sein.

Nanu!

Oder "interpret" hat die Beziehung zu "jomifa" bendet!

zwieblum:
Concatenation (The C Preprocessor)

Aber mit der Concatenation kannst Du keinen Variablennamen bauen und das will der/die TO anscheinend.

Gruß Tommy

interpret:
Die Funktion soll also aus dem Teilen "Motor" und dem übergebenen Parameter motorNummer und dem abschließenden Teil "_T zusammengesetzt werden.

Am nächsten kommtst Du dem mit Arrays. Motor wird ein Array, und die motorNummer gibt an, welches Element des Arrays gemeint ist.

Aber wenn Du erklärst, wofür die Erzeugung synthetischer Variablennamen gut sein soll, dann gibt es sicher bessere Lösungen, z.B. Pointer.

Aber mit der Concatenation kannst Du keinen Variablennamen bauen und das will der/die TO anscheinend.

Das geht schon:

#define XXX(NAME,EXT) NAME ## EXT
void main () {
    int XXX(name,X)=10;
    printf("%d",nameX);
}
[/quote]

Mit diesen Dingerchen kannst du ein ziemlich transparentes Klassen/Objektsystem in C bauen.

Zur Präprozessorzeit war wohl nicht die Intention des TO, eher zur Laufzeit und da kann man Dein Prinzip nicht benutzen, da defines vorm Compiler aufgelöst werden.

Gruß Tommy

Spannende Frage, was der TO eigendlich gemeint haben könnte :slight_smile:

zwieblum:
Spannende Frage, was der TO eigendlich gemeint haben könnte :slight_smile:

Ja, denn woher weiß irgendein Programmteil, welche neue Namen erzeugt werden könnten, und welcher davon wofür benutzt werden soll?

Dann müßte doch der Name im fraglichen Programmteil schon vorher bekannt sein, dort könnte dann auch die entsprechende Variable deklariert werden. Dann läuft der Weg genau andersrum, die Zielvariable wird (per Pointer?) an das Unterprogramm übergeben, das den gewünschten Wert reinschreibt.

Vielen Dank für Eure Vorschläge. Habe mein Problem vorerst mit einem Array gelöst.

byte Motor[4][5] = {{A0, 0, 3, 7, 7}, // Motor 1
{A1, 0, 2, 6, 6}, // Motor 2
{A2, 0, 1, 5, 5}, // Motor 3
{A3, 0, 0, 4, 4}}; // Motor 4

Wenn du es sauberer machen willst erstelle eine Struktur namens Motor mit 5 Bytes die sprechende Namen haben. Und dann ein Array aus 4 Objekten

struct Motor
{
   const byte pin1;
   const byte pin2;
   ....
};

Motor motoren[4] = { ... };

Dann kann man sowas machen:

for (Motor& m : motoren)
   digitalWrite(m.pin1, HIGH);

Also für echt guten Spagetticode darf's nur ein eindimensonales Array sein.