Go Down

Topic: Probleme mit Costum Class (Read 247 times) previous topic - next topic

Jendrik

Hi Leute,
ich habe hier ein Projekt, bei dem sich bis zu vier Wemos mit einem Ultraschallsensor mit einem fünften Wemos verbinden sollen. Je nachdem wie viele Clients verbunden sind, leuchten entsprechend viele Dioden.
Sobald ein Client eine bestimmte Entfernung misst, soll dem Server bescheid gegeben werden.
Die Kommunikation läuft soweit. Leider wird aber die Diode nicht geschaltet. Wenn ich mir anschaue, welcher Wert in den Variablen steht, sehe ich NULL. Das mysteriöse ist, dass beim Verbinden die Dioden ordnungsgemäß geschaltet werden. Aber auch da ist der Inhalt der Zählervariablen NULL.
Kann mir jemand erklären was hier schief läuft?

Hier wird die Diode geschaltet:
Code: [Select]
void Lock::registerDevice() {
  sensorCount++;
  for (int i = 0; i<sensorCount; i++)
    leds[i].setColor(red);                                       //leds werden geschaltet

  Serial.println("connected");
  Serial.println("sensorCount " +sensorCount);      //Ausgabe: "sensorCount  "
}



Hier nicht:
Code: [Select]
void Lock::setRing() {
  Serial.println("activeSensors " +activeSensors);  //Ausgabe: "sensorCount  "
  for (int i = 0; i < activeSensors; i++)
    leds[i].setColor(blue);                                     //leds werden nicht geschaltet

  if (activeSensors == sensorCount)
    allSensorsActive = true;
  else
    allSensorsActive = false;
}


Den vollständigen Code findet ihr hier.

combie

#1
Nov 12, 2017, 11:49 am Last Edit: Nov 12, 2017, 11:50 am by combie
Code: [Select]
Serial.println("activeSensors " +activeSensors);  //Ausgabe: "sensorCount  "
Diese Zeile ist unsinn!

Die gibt bei mir "veSensors" aus.

Testcode:
Code: [Select]

const int activeSensors = 4;

void setup(void) 
{
 Serial.begin(9600);
 Serial.println("activeSensors " +activeSensors);
}

void loop(void)
{

}
"Freiheit, Gleichheit, Brüderlichkeit!"
Aber wie gelangen wir zu den Tätigkeitswörtern?
Quelle: Stanislaw Jerzy Lec

michael_x

Quote
Diese Zeile ist unsinn!
Die gibt bei mir "veSensors" aus.
Das ist ja auch so programmiert.

Die Idee mit dem + Zeichen ist natürlich völlig daneben, ausser man will einen Text erst ab dem soundsovielten Zeichen ausgeben.

Gibt auch eine Programmiersprache, da kann man Strings mit & zusammensetzen.

Hier bei Arduino besteht der Super-Luxus darin, dass man print mit allen möglichen Datentypen aufrufen kann und es kommt meist das raus, was sich naive Benutzer vorstellen:
Serial.print("activeSensors "); Serial.println(activeSensors);
Das erste gibt einen konstanten Text aus, das zweite wandelt eine Integer-Variable in ihre Dezimal-Darstellung und gibt diesen Text aus.

Jendrik

Vielen Dank für die Hilfe. Da habe ich wohl zuviel Java-Kontakt gehabt in letzter Zeit.

Nichts desto Trotz funktioniert diese Zeile tadellos:
Code: [Select]
Serial.println("n: "+ mName + " name: " +mName);

Scheinbar bekommt es dem Programm nicht sonderlich gut. Nutzt man es wie vorgesehen, klappt es besser. Jetzt komme ich weiter.

combie

"Freiheit, Gleichheit, Brüderlichkeit!"
Aber wie gelangen wir zu den Tätigkeitswörtern?
Quelle: Stanislaw Jerzy Lec

Tommy56

Diese Zeile bekommt aber dem RAM deines Arduino auf die Dauer nicht. Die String-Klasse fragmentiert Deinen RAM.

Gruß Tommy
"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)

combie

Da ist keine String Klasse, weit und breit nicht zu sehen.
Sehe zumindest keine.

Nee, er addiert ein paar Adressen aufeinander und nutzt das dann als Zeiger in den Speicher.

"Freiheit, Gleichheit, Brüderlichkeit!"
Aber wie gelangen wir zu den Tätigkeitswörtern?
Quelle: Stanislaw Jerzy Lec

Tommy56

Da er schreibt, dass es funktionieren würde (also die verkettete Anzeige raus kommt), muss es wohl eine impliziete Verkettung über die Klasse String sein, die println ausgibt.

Gruß Tommy
"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)

combie

#8
Nov 13, 2017, 12:17 pm Last Edit: Nov 13, 2017, 01:29 pm by combie
Nöö...

Zurück zum Anfang:
Code: [Select]
void Lock::setRing() {
  Serial.println("activeSensors " +activeSensors);  //Ausgabe: "sensorCount  "
  for (int i = 0; i < activeSensors; i++)
    leds[i].setColor(blue);                                     //leds werden nicht geschaltet


Serial.Println() bekommt das Additionsergebnis aus Adresse des Strings und der Variablen activeSensors.

Diese neue/berechnete Adresse wird von Println als  char * akzeptiert.
Stinknormale Pointer Arithmetik.
Im Grunde völlig ok, wenn es denn so gewollt wäre.
Aber das ist es wohl nicht.

Da activeSensors in dem Fall Null ist, wird die Zeichenkette "sensorCount " ausgegeben.
Die Schleife wird nicht durchlaufen, weil activeSensors == 0
Damit ist auch klar, warum die LEDs nicht reagieren.

In meinem Beispiel habe ich  activeSensors = 4 gesetzt.
Dann wird der String auch erwartungsgemäß vorn abgeschnitten.

Ich will gar nicht wissen, was ausgegeben wird, wenn die berechnete Adresse irgendwann über den String hinweg zeigt.



"Freiheit, Gleichheit, Brüderlichkeit!"
Aber wie gelangen wir zu den Tätigkeitswörtern?
Quelle: Stanislaw Jerzy Lec

Tommy56

Ich glaube Dir. Warum schreibt er aber dann in #3, das diese Zeile funktionieren würde?
Quote
Nichts desto Trotz funktioniert diese Zeile tadellos:
Code: [Select]

Serial.println("n: "+ mName + " name: " +mName);

Das klingt für mich, als würde er die gewünschte Ausgabe bekommen.
Unklar.

Gruß Tommy
"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)

combie

#10
Nov 13, 2017, 02:56 pm Last Edit: Nov 13, 2017, 03:16 pm by combie
Quote
Warum schreibt er aber dann in #3, das diese Zeile funktionieren würde?
Vielleicht weil sie keine Fehlermeldung wirft....?
Wer kann es wissen....

Im Nachsatz folgt dann unmittelbar:
Quote
Scheinbar bekommt es dem Programm nicht sonderlich gut.
Und das hört sich dann gar nicht mehr so gesund an.

Entspricht dann aber schon eher den Vorstellungen, die ich so habe, von den Abläufen.

---

Ich schätze mal, das beruht alles auf den oben schon genannten Java Vorstellungen.
Die muss man allerdings über Bord werfen.
Denn Java kennt keine Pointer, und um die dreht es sich hier.

Die Alternative wäre:
Das ist ein wohldurchdachter Geniestreich!

 :o Aber davon muss ich erst noch überzeugt werden :o
"Freiheit, Gleichheit, Brüderlichkeit!"
Aber wie gelangen wir zu den Tätigkeitswörtern?
Quelle: Stanislaw Jerzy Lec

Jendrik

Wie nett das sich durch mein Post noch eine interessante Unterhaltung ergeben hat.
Die Zeile mit der erfolgreich "String-Addition" funktioniert erwartungsgemäß.
Nachdem ich aber überall diesen Fehler beseitigt habe, hat auch mein Code erwartungsgemäß funktioniert und hat nicht mehr, an mir völlig unverständlichen Stellen, den Geist aufgegeben. Das meinte ich mit "Scheinbar bekommt es dem Programm nicht sonderlich gut."

Nochmal vielen Dank für eure Hilfe. Wieder was gelernt :-)

Go Up