Probleme mit der Void funktion

Hallo ich bin gerade ein wenig an ausprobieren und hänge momentan an ein Problem fest wo ich nicht weiter komme.

byte portB;
String cProgram = "0";
String Program = "0";
int schleife = 0;

void cProgram1() {
  int schleife = 1;
  Program = Program1();
}
void Program1() {
  Serial.println ("Program1");
}

void cProgram2() {
  int schleife = 1;
  Program = Program2(};
}
void Program2() {
  Serial.println ("Program2");
}

void cProgram3() {
  int schleife = 1;
  Program = Program3();
}
void Program3() {
  Serial.println ("Program3");
}

void cProgram4() {
  int schleife = 1;
  Program = Program4();
}
void Program4() {
  Serial.println ("Program4");
}

void cProgram5() {
  int schleife = 1;
  Program = Program5();
}
void Program5() {
  Serial.println ("Program5");
}

void cProgram6() {
  int schleife = 1;
  Program = Program6();
}
void Program6() {
  Serial.println ("Program6");
}

void cProgram7() {
  int schleife = 1;
  Program = Program7();
}
void Program7() {
  Serial.println ("Program7");
}

void cProgram8() {
  int schleife = 1;
  Program = Program8();
}
void Program8() {
  Serial.println ("Program8");
}
void Programer() {
  while(Program == 0)
  Serial.println ("Programier modus Aktiv");
  delay(2000);
}

void setup() {
  Serial.begin(9600);
  portB = PINB;
  switch (portB) {
    case 0: cProgram = cProgram1(); break;
    case 1: cProgram = cProgram2(); break;
    case 2: cProgram = cProgram3(); break;
    case 3: cProgram = cProgram4(); break;
    case 4: cProgram = cProgram5(); break;
    case 5: cProgram = cProgram6(); break;
    case 6: cProgram = cProgram7(); break;
    case 7: cProgram = cProgram8(); break; 
    default: cProgram = Programer(); break;
  }
  cProgram;
  Program;
}

void loop() {
  if (schleife == 1) {
    Program;
  }
  
  delay (500);
}

ich bekomme bei der Zeile "Program = Program1();" die fehlermeldung "exit status 1
no match for 'operator=' (operand types are 'String' and 'void')" woran liegt das und wie kann man das lösen?

Mit freundlichen Grüßen
Maikel

http://www.willemer.de/informatik/cpp/funktion.htm

(deleted)

Und eine Erklärung was du mit deinem "Wurmcode" erreichen möchtest.

ich bekomme bei der Zeile "Program = Program1();" die fehlermeldung "exit status 1

Die Zeile ist ja noch harmlos....

Diese ist schlimmer:

Program = Program2(};

Leider hast du vergessen zu sagen, was du "wirklich" erreichen möchtest.
Das wäre aber wichtig, wenn man das "Wie ist das zu erreichen, was ich erreichen will?" auflösen möchte.

Des weiteren scheinst du da Dinge/Funktionen durchnummerieren zu wollen.
Aus meiner Sicht ist durchnummerieren quasi immer ein Irrtum.

   portB = PINB;
  switch (portB) {
    case 0: cProgram = cProgram1(); break;
    case 1: cProgram = cProgram2(); break;
    case 2: cProgram = cProgram3(); break;
    case 3: cProgram = cProgram4(); break;
    case 4: cProgram = cProgram5(); break;
    case 5: cProgram = cProgram6(); break;
    case 6: cProgram = cProgram7(); break;
    case 7: cProgram = cProgram8(); break;
    default: cProgram = Programer(); break;
  }

ist für eine abfrage von einen Vierer DIP Switch am anfang des progammes zuständig

dadurch soll er z.B. zu

void cProgram1() {
  int schleife = 1;
  Program = Program1();
}

springen und
soll wenn ich fertig bin aus den EEPROM werte lesen (Temperatur und ein paar einstellungen für den PID regler)

danach soll er das passende programm aufrufen

void Program1() {
  Serial.println ("Program1");
}

soll dann das programm abfahren und über ein display anzeigen wie weit er ist und Temperatur und feuchte mit angeben.

void Programer() {
  while(Program == 0)
  Serial.println ("Programier modus Aktiv");
  delay(2000);
}

soll später auf eine serielle abfrage warten und die variablen im EEPROM aktualisieren

miticoeu:

   portB = PINB;

switch (portB) {
    case 0: cProgram = cProgram1(); break;
    case 1: cProgram = cProgram2(); break;
    case 2: cProgram = cProgram3(); break;
    case 3: cProgram = cProgram4(); break;
    case 4: cProgram = cProgram5(); break;
    case 5: cProgram = cProgram6(); break;
    case 6: cProgram = cProgram7(); break;
    case 7: cProgram = cProgram8(); break;
    default: cProgram = Programer(); break;
  }

Ein Grund Funktionen zu schreiben ist es gerade sowas zu vermeiden! z.B. indem man die Nummer mit der man was machen will als Parameter an die Funktion übergibt

Weiterhin bin ich dagegen, die Dinge durchzunummerieren.
Das wird dir noch auf die Füße fallen, vermutlich.

Offensichtlich suchst du Funktionszeiger.
Naja.. wenn das die Lösung ist...
Hier mal eine Überarbeitung:

using FunctionPtr = void(*)();

byte portB;
FunctionPtr cProgram = nullptr;
FunctionPtr Program  = nullptr;
int schleife = 0;

void cProgram1() {
  int schleife = 1;
  Program = Program1;
}
void Program1() {
  Serial.println ("Program1");
}

void cProgram2() {
  int schleife = 1;
  Program = Program2;
}
void Program2() {
  Serial.println ("Program2");
}

void cProgram3() {
  int schleife = 1;
  Program = Program3;
}
void Program3() {
  Serial.println ("Program3");
}

void cProgram4() {
  int schleife = 1;
  Program = Program4;
}
void Program4() {
  Serial.println ("Program4");
}

void cProgram5() {
  int schleife = 1;
  Program = Program5;
}
void Program5() {
  Serial.println ("Program5");
}

void cProgram6() {
  int schleife = 1;
  Program = Program6;
}
void Program6() {
  Serial.println ("Program6");
}

void cProgram7() {
  int schleife = 1;
  Program = Program7;
}
void Program7() {
  Serial.println ("Program7");
}

void cProgram8() {
  int schleife = 1;
  Program = Program8;
}
void Program8() {
  Serial.println ("Program8");
}
void Programer() {
  while(not Program)
  {
   Serial.println ("Programier modus Aktiv");
   delay(2000);
  }
}

void setup() {
  Serial.begin(9600);
  portB = 0b01111 & PINB;
  switch (portB) {
    case 0: cProgram = cProgram1; break;
    case 1: cProgram = cProgram2; break;
    case 2: cProgram = cProgram3; break;
    case 3: cProgram = cProgram4; break;
    case 4: cProgram = cProgram5; break;
    case 5: cProgram = cProgram6; break;
    case 6: cProgram = cProgram7; break;
    case 7: cProgram = cProgram8; break;
    default: cProgram = Programer; break;
  }

  if(cProgram) cProgram();
  if(Program) Program();
  
}

void loop() {
  if (schleife == 1) {
    if(Program) Program();
  }
 
  delay (500);
}

Tipp: Zeiger immer auf Gültigkeit prüfen....
(wenn schon Zeiger, dann auch erhöhte Aufmerksamkeit)

Verstehe mal was "void" bedeutet.

void(funktion(void)
{
irgendwas
}

Void bedeutet ohne Übergabewert.
Wie kanst Du einen Rückgabewert in eine Variable speichern wenn die Funktion nichts zurückgibt?
Außerdem lerne wie arrays funktionieren.
Grüße Uwe