Anfängerfrage

Hallo,

ich habe ein Problem bei dem ich nicht weiterkomme. Vielleicht kann mir jemand helfen oder ein Stichwort nennen was ich nachschlagen kann?

Ich möchte eine Variable einlesen und den erhaltenen Text als Methode auf eine Klasse anwenden.

Mir fällt nicht ein nach was ich noch suchen könnte hat einer ne Idee oder kann mir ein Beispiel geben? Ich kann es bisher mit einem case-Statement lösen, gibt es da einen eleganteren Weg?

snoobi:

Ich möchte eine Variable einlesen und den erhaltenen Text als Methode auf eine Klasse anwenden.
Mir fällt nicht ein nach was ich noch suchen könnte hat einer ne Idee oder kann mir ein Beispiel geben? Ich kann es bisher mit einem case-Statement lösen, gibt es da einen eleganteren Weg?

Ich verstehe ehrlich gesagt nur Bahnhof. Bist Du sicher, dass Du die Dinge, die Du beschreibst, richtig verstanden hast? Was meinst Du mit „Text als Methode auf eine Klasse anwenden“?

Ein Text ist eine Zeichenfolge, die in einem String-Objekt oder einem char-Array abgelegt ist.
Eine Methode ist eine Funktion einer Klasse.
Eine Klasse ist sozusagen der Bauplan oder die Vorlage für ein Objekt bzw. eine Instanz/Ausführung dieser Klasse.

Gruß

Gregor

Ich kann es bisher mit einem case-Statement lösen, gibt es da einen eleganteren Weg?

Nicht wirklich.

Alternativ: Ein Array mit Methodenzeiger (Zeiger auf Methoden)

Hi

snoobi: ich habe ein Problem bei dem ich nicht weiterkomme. Vielleicht kann mir jemand helfen oder ein Stichwort nennen was ich nachschlagen kann?

Nennt sich 'Netiquette' und beinhaltet, einen aussagekräftigen Titel zu wählen.

Nebenbei verstehe auch ich nicht, was Du überhaupt vor hast.

Hättest Du ein (nicht) funktionierendes Beispiel?

MfG

Ich finde die Frage ist klar formuliert!

Er möchte, in etwa die eval() Funktionalität, wie sie Interpretersprachen bieten.

Nur leider ist C++ eine Kompilersprache, und damit sind die Methodenbezeicher zur Laufzeit nicht erreichbar. Nur zur Kompilezeit. Siehe: FUNCTION

Hi

Ok, aber selbst wenn es eine Funktionalität ähnlich eval() gäbe, müsste man die Übergabe trotzdem parsen und auf ‘Nettigkeit’ prüfen - NIEMALS eine User-Eingabe direkt ausführen (zumindest in Sprachen wie PHP fährt man damit besser … und länger).

MfG

Die Sprache ist eigentlich egal, sie bestimmt höchstens die Menge der "bösen Zeichen" und die Art des Parsens. Tun sollte man es in keiner Sprache.

Gruß Tommy

Danke für die Antworten, ich musste erstmal einiges nachlesen.

@postmaster-ino: Sorry wegen der fehlenden Netiquette. Ich habe noch keine 5 Posts in meinem Leben abgesetzt, da fehlt mir die Übung. Mir würde aber auch nichts viel besseres einfallen als Thema, weil ja eben mein Problem war, dass ich nicht wusste wonach ich so genau fragen soll.

Combi hat Recht, das wäre wohl das was ich suche, jedenfalls wenn ich " eval() "richtig verstehe. Sind Interpretersprache und Skriptsprache dasselbe?

Ich verstehe den Vorschlag mit "Ein Array mit Methodenzeiger (Zeiger auf Methoden)" nicht so richtig. Könnte mir da jemand ein einfaches Beispiel zeigen? Oder auch eine Quelle, die für Anfänger gut verständlich ist, quasi für "blöde"... =) Das mit den Zeigern durchschaue ich noch nicht so ganz, vielleicht verstehe ich es nach der 101. Erklärung.

Ich nehme an der Hinweis "niemals eine Usereingabe direkt ausführen" geht in Richtung Injection wie beim SQL? Für mich wäre das aber prinzipiell erstmal egal bzgl. Sicherheit, so weit bin ich noch lange nicht.

Schaue dir mal den "CmdMessenger" an. Vielleicht bietet der dir ja schon alles, was du brauchst.

Sind Interpretersprache und Skriptsprache dasselbe?

Nicht unbedingt. Aber als grobe Vereinfachung reicht mir das hier. Denn viel Auswahl gibt es in der Arduino Welt sowieso nicht.

Ich verstehe den Vorschlag mit "Ein Array mit Methodenzeiger (Zeiger auf Methoden)" nicht so richtig

War als Ersatz für switch case gedacht.

statt

switch (i) {
case 0: func_a(); break;
case 1: func_b(); break;
...
}

ein Array von Function pointern aufsetzen und i als Index, um eine davon aufzurufen... Hier ist die Frage gut beantwortet.

//typedef void (*FunctionPointer)(void);
using FunctionPointer = void (*)(void); 


void tuwasA()
{
  Serial.println("tuts ");
}

void tuwasB()
{
  Serial.println("ganz ");
}

void tuwasC()
{
  Serial.println("gut ");
}


FunctionPointer functions[] = {tuwasA,tuwasB,tuwasC};

void setup(void) 
{
  Serial.begin(9600);
  for(FunctionPointer f:functions) f();

}

void loop(void) 
{

}

Du willst doch nur neumodischen Kram wie  using statt  typedef und  for(x:list) statt  for ( ; ; ) vorführen.

Hast ja Recht, das muss man Anfängern beibringen, die anderen bleiben bei ihrem gewohnten. ;)

Wem es liegt, der nutzt es. Der Rest blendet es aus.

Ich bin nur einer der Überbringer dieser Nachricht.

Die For() ist mir beim lesen des Kapitels über Vektoren und Iteratoren über den Weg gelaufen. Beim erkunden der C++11 Erweiterungen.

Das using habe ich von unserem gescheiten Forenkollegen.