Taschenrechner-Logik

Hallo,

ich bin kein DAU und ich hatte früher auch kleinere Sachen mit C++, Java und Visual Basic programmiert.

Ein Hallo-Welt bekomme ich mit Arduino auch noch hin. Aber schon kleinste Mathematische Berechnungen werden zum Hürdenlauf.

Wo ist der Unterschied, wenn ich

i++;
i = i + 1;

schreibe (davon ausgehend, dass i als Integer deklariert ist)?

Wir hocken jetzt zu zweit an dem Projekt und brauchen fast 30 Zeilen Code, damit Arduino eine Zahl als Zahl und nicht als Ascii-Code erkennt.

Wir machen das natürlich von grundauf, wir wollen schließlich etwas lernen.

Wenn i = i + 1 nicht funktioniert, wie programmiere ich dann einen Taschenrechner? Zumal jedes Zeichen als Ascii-Code ankommt...

LG

DA

Sollte eigentlich das Gleiche sein. :-?

Was geht da nicht...?

Wenn ich i ausgebe, sagt er mir "i+1".

Hast Du uns mal den Code, bitte...?

Und wie gibst Du "i" aus?

Hi,

bist Du sicher, dass i als int deklariert ist?

Gruß

Sebastian

schreibe (davon ausgehend, dass i als Integer deklariert ist)?

Davon kann man beim Programmieren nicht ausgehen.

Die Variable wird wie folgt deklariert:

int i=0;

Weitere Infos dazu gibts in der Arduino Reference:
http://www.arduino.cc/en/Reference/Int

Wenn i = i + 1 nicht funktioniert, wie programmiere ich dann einen Taschenrechner?

Mit der richtigen Deklaration gehen auch Taschenrechnerfunktionen.

Wie gesagt: Am Besten wärs, wenn Du den Sourcecode hier reinhängst. :slight_smile:

Wir hocken jetzt zu zweit an dem Projekt und brauchen fast 30 Zeilen Code, damit Arduino eine Zahl als Zahl und nicht als Ascii-Code erkennt.

Wenn ich i ausgebe, sagt er mir "i+1".

Das hört sich für mich so an als ob jemand die zu berechnende Formel über das Terminal an den Arduino sendet !

Nur müsste man dazu erst einmal einen vernüftigen Formelparser programmieren ! Der zudem auch noch eine korrekte Berechnungsreihenfolge erstellt.

Hier wird ein entsprechender Algorithmus beschrieben:
http://www.java-forum.org/allgemeines/12306-parser-fuer-mathematische-formeln.html

Ok, hier der Code.
Mir ist klar, dass ich anstatt "anzahl = anzahl + 1" auch "++anzahl" schreiben kann, aber die "1" soll später durch eine Variable ersetzt werden (z.B. "int z = 1").

Vielen Dank schon mal für die vielen Antworten.

void setup()
{
  Serial.begin(9600);
  Serial.println("Zahlen-Test");  // Programm-Titel
  Serial.println();
  Serial.flush();
}

void loop()
{  
  int anzahl=0;  // Anzahl der übertragenen Zeichen

  if(Serial.available()!=0)  // Wurde etwas übertragen?
  {   
    byte eingabe = Serial.read();
    for(x=0;x<=sizeof(eingabe)-1;x++)
    {
      if((eingabe>='0') && (eingabe<='9'))
      {
        anzahl = anzahl + 1;
        delay(100);
        Serial.println(anzahl);  // Ausgabe: "anzahl + 1"
        Serial.flush();  // Speicher leeren
      }
      else
      {
        Serial.println("Ende");
        break;
      }
    }
  }
  delay(1000);
}

Das hört sich für mich so an als ob jemand die zu berechnende Formel über das Terminal an den Arduino sendet !

Bisher wurde nur versucht, eine einzelne Zahl einzugeben. Und noch habe ich damit ja nicht viel gemacht. Ich hänge schon bei "anzahl = anzahl + 1".

Und das spuckt "anzahl + 1" aus?? :-?

Zu dumm dass ich hier auf der Arbeit keinen Arduino rumliegen hab, das hätt ich zu gern ausprobiert... :frowning:

Aber Inkrement funktioniert :slight_smile:

Wir haben da jetzt ein schönes Experiment zum Laufen bekommen, sogar über zwei Arduinos.

Wer Interesse daran hat:

int led=13;   
int pin=12;   
int value=0; 
int my_var;

void setup()
{

  Serial.begin(9600);
  pinMode(led,OUTPUT);    
  pinMode(pin,INPUT);
}

void loop()
{
  value=digitalRead(pin);
  if(Serial.available()==0)
    {
     digitalWrite(led,LOW);
    }  
  if(Serial.available()!=0)
    {
      digitalWrite(led,HIGH);
      Serielle_Daten();
      delay(500); 
    } 
    if (value==HIGH)
    {
     my_var++;
     Serial.print(my_var);
     delay(1500);
     my_var =0;    
    }
    //my_var=0;  
}


void Serielle_Daten()
{
  byte incomingByte;
    if (Serial.available()!=0);
    {
     incomingByte = Serial.read();
      while ((incomingByte >= '0') && (incomingByte <='9'))
      {
        my_var = my_var * 10 + (incomingByte - 48);
        delay(100);
        incomingByte = Serial.read();
      }
    }

}

Sorry wegen der Kommentarlosigkeit :wink:
Ein Elektriker ist halt kein Programmierer.

Der Sketch läuft, wenn folgende 2 Anpassungen gemacht werden.

int anzahl=0;
Vor der Setuproutine platzieren.

for(int x=0;x<=sizeof(eingabe)-1;x++)
Deklaration von x fehlt.

Anschliessend zählt das Programm jeweils um 1 hoch sobald man eine Zahl über den seriellen Monitor eingibt.

int anzahl=0;  // Anzahl der übertragenen Zeichen

void setup()
{
  Serial.begin(9600);
  Serial.println("Zahlen-Test");  // Programm-Titel
  Serial.println();
  Serial.flush();
}

void loop()
{  
  

  if(Serial.available()!=0)  // Wurde etwas übertragen?
  {  
    byte eingabe = Serial.read();
    for(int x=0;x<=sizeof(eingabe)-1;x++)
    {
      if((eingabe>='0') && (eingabe<='9'))
      {
        anzahl = anzahl + 1;
        delay(100);
        Serial.println(anzahl);  // Ausgabe: "anzahl + 1"
        Serial.flush();  // Speicher leeren
      }
      else
      {
        Serial.println("Ende");
        break;
      }
    }
  }
  delay(1000);
}

Ein Elektriker ist halt kein Programmierer.

Muss nicht, aber kann. Ich habe beides studiert.

Ein Programm ohne Kommentare ist wie ein verdrahteter Schaltschrank ohne farbige und beschriftete Drähte.

Sowohl Kommentare wie auch die Beschriftungen dienen nicht zur korrekten Funktion der Anwendung/des Programmes. Helfen aber dem Techniker/Programmierer bei der Fehlersuche oder beim Erweitern der Lösung. :wink:

for(int x=0;x<=sizeof(eingabe)-1;x++)
Deklaration von x fehlt.

Anschliessend zählt das Programm jeweils um 1 hoch sobald man eine Zahl über den seriellen Monitor eingibt.

Das mit dem int ist mir nachher auch aufgefallen, typischer copy&paste-Fehler (hatte x ganz oben deklariert).

Ist mir alles zu hoch, bei einem funzt es, beim anderen nicht.

Muss nicht, aber kann. Ich habe beides studiert.

Ich habe das Studium versucht, habe dann aber die Flucht ergriffen, als die Dozentin im Schweinsgalopp durch Java gedüst ist. Deswegen komme ich jetzt wahrscheinlich auch nicht mit Arduino klar. Der olle Hamster hat mir den Garaus gemacht :wink:

(hatte x ganz oben deklariert).

Vielleicht solltest Du mal den ganzen Code posten, vielleicht kommt das Problem von was "weiter oben"... :wink:

@DarkAngel1004
Wie bereits gesagt, mit den beiden Anpassungen hat der Sketch, ich habe diesen mit Copy/Paste von hier übernommen, funktioniert.

Beachte, dass ich die Deklaration int anzahl=0 aus dem Loop() entfernt habe. Das wäre sonst doppelt.

Kopier doch einfach nochmals mein getestes Programm bei dir rein.
So schwer kann das nicht sein. :wink:

Wo ist der Unterschied, wenn ich

i++;

i = i + 1;



schreibe (davon ausgehend, dass i als Integer deklariert ist)?

Historisch gesehen wurden die ++ und -- Notationen eingeführt, um die Assemblerinstruktion INC und DEC nutzen zu können, was effizienter war als +1 oder -1 zu rechnen. Das war zu einer Zeit, wo Compiler noch keine Optimiser hatten und Programmierer selbst auf solche Dinge achten mußten.

Wenn du den Ausdruck in der oben zitierten Form gebrauchst, macht es keine großen Unterschied. Erste wenn du böse Dinge wie das folgen Beispiel machst, merkst du Unterschiede:

void doppelprint(int a, int b) {
  Serial.println(a);
  Serial.println(b);
}

doppelprint (i++, i);
doppelprint ((i = i + 1), i);

Das erste gibt zwei aufeinanderfolgende Zahlen, das zweite zwei gleiche. Solche Dinge sollten aber in sauberem Code nicht all zu häufig vorkommen, weshalb das ganze eher akademische Haarspalterei ist.

Korman

Hallo noch einmal.

Ich finde es wirklich nett, dass ihr versucht, mein Problem zu verstehen und sogar eine Lösung dafür zu finden.

Leider ist das Arduino für mich so etwas wie ein Blinker. Geht, geht nicht...

Ich geb's auf. Ich bin zu doof dafür. In der Zeit, die ich brauche, damit das Arduino alleine einen einzigen Satz, den ich in der Konsole eingebe, darstellen kann, habe ich in den meisten anderen Programmiersprachen ein fertiges Programm vor mir liegen.

Die Suche hier im Forum ist für mich auch "Böhm'sche Dörfer", eine simple Umleitung über Google... Und trotzdem wird nichts gefunden, wenn ich etwas suche.

LG

DA

In der Zeit, die ich brauche, damit das Arduino alleine einen einzigen Satz, den ich in der Konsole eingebe, darstellen kann, habe ich in den meisten anderen Programmiersprachen ein fertiges Programm vor mir liegen.

Wenn du ein fertiges Programm in C oder C++ hast, läuft es auch am Arduino mit nur minimalen Änderungen. Da ist der Arduino nicht schlimmer als jede andere Umgebung.

Korman