INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.

Antwort schreiben 
 
Themabewertung:
  • 0 Bewertungen - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
Falsche Werte im Array
26.10.2019, 18:43
Beitrag #1
Falsche Werte im Array
Guten Abend und Hallo Forum,

ich arbeite schon seit längerem an einem Schulprojekt, in dem wir eine Digitaluhr mit alten CD/DVD-Laufwerken bauen. Diese Fahren ein/aus und zeigen dann die Uhrzeit an. Die Ansteuerung übernimmt in meinem Code die Klasse Laufwerk, welche den aktuellen Pin, an dem das Laufwerk angeschlossen ist, den Status (heißt ob es ein- oder ausgefahren ist) und Methoden zum ein- beziehungsweise ausfahren beinhaltet. Die Laufwerke verwaltet dann eine übergeordnete Klasse Ziffer, die immer jeweils 7 Laufwerke (Da wir mit einer 7-Segment-Anzeige, also 7 Laufwerken pro Ziffer arbeiten) ansteuern kann. Mein Problem: Wenn ich will, dass z.B. die Ziffer 8 erscheint (Alle Laufwerke fahren aus), dann steuert die Ziffer nicht die angegebenen Pins an, sondern irgendwelche! Bei mir sind es z.B. Pin 882 und Pin -32509. Was genau ist da passiert? Und wie kann ich diesen Fehler beheben? Nicht mal mein Projektbetreuer kann mir da weiterhelfen...

Hier mein Code:
Code:
// 4 Ziffern a 7 Laufwerke
int pins[4][7] = {
  {22,23,24,25,26,27,28},
  {29,30,31,32,33,34,35},
  {36,37,38,39,40,41,42},
  {43,44,45,46,47,48,49}
};

class Laufwerk
{
  private:
  
    int pin;
    bool ausgefahren;

  public:

    Laufwerk(int pin_arg) {
      pin = pin_arg;
      ausgefahren = false;
      Serial.println("[LAUFWERK] PIN "+String(pin)+" initialisieren...");
      pinMode(pin, OUTPUT);
      high();
      Serial.println("[LAUFWERK] PIN "+String(pin)+" initialisiert");
    }
    
    void high() {
      digitalWrite(pin, HIGH);
    }
    void low() {
      digitalWrite(pin, LOW);
    }
    
    void switchStatus() {
      if(ausgefahren) {
        ausgefahren = false;
      }
      else {
        ausgefahren = true;
      }
      low();
      delay(100);
      high();
    }
    
    void einfahren() {
      if(ausgefahren) {
        switchStatus();
      }
      Serial.println("[LAUFWERK] PIN "+String(pin)+" einfahren");
    }
    
    void ausfahren() {
      if(!ausgefahren) {
        switchStatus();
      }
      Serial.println("[LAUFWERK] PIN "+String(pin)+" ausfahren");
    }
};

class Ziffer
{
  private:

    Laufwerk *laufwerke[];

  public:

    Ziffer(int pins_arg[7])
    {
      Serial.println("[ZIFFER] initialisieren...");
      for(int i=0; i<7;i++)
      {
        laufwerke[i] = new Laufwerk(pins_arg[i]);
      }
      Serial.println("[ZIFFER] initialisiert");
    }

    void zeigeZiffer(int ziffer)
    {
      Serial.println("[ZIFFER] zeige Ziffer "+String(ziffer));
      switch(ziffer)
      {
        case 8:
          laufwerke[0]->ausfahren();
          laufwerke[1]->ausfahren();
          laufwerke[2]->ausfahren();
          laufwerke[3]->ausfahren();
          laufwerke[4]->ausfahren();
          laufwerke[5]->ausfahren();
          laufwerke[6]->ausfahren();
      }
    }
    
};

void setup() {
  Serial.begin(9600);
}

void loop() {
  //Wartet bis etwas ins Serial geschrieben wird, dann wir erst der Code ausgeführt
  if (Serial.available() > 0) {
    Serial.readString();

    Ziffer * testziffer = new Ziffer(pins[0]); // Diese Funktion funktioniert noch
    testziffer->zeigeZiffer(8); // Hier sollten im Serial ganz normal die Pins 22-28 angezeigt werden
    
  }

}

Und mein Output im Serial: (In Fett mein Problem)
Zitat:[ZIFFER] initialisieren...
[LAUFWERK] PIN 22 initialisieren...
[LAUFWERK] PIN 22 initialisiert
[LAUFWERK] PIN 24 initialisieren...
[LAUFWERK] PIN 24 initialisiert
[LAUFWERK] PIN 26 initialisieren...
[LAUFWERK] PIN 26 initialisiert
[LAUFWERK] PIN 28 initialisieren...
[LAUFWERK] PIN 28 initialisiert
[LAUFWERK] PIN 30 initialisieren...
[LAUFWERK] PIN 30 initialisiert
[LAUFWERK] PIN 32 initialisieren...
[LAUFWERK] PIN 32 initialisiert
[LAUFWERK] PIN 34 initialisieren...
[LAUFWERK] PIN 34 initialisiert
[ZIFFER] initialisiert
[ZIFFER] zeige Ziffer 8
[LAUFWERK] PIN 882 ausfahren
[LAUFWERK] PIN -32509 ausfahren
[LAUFWERK] PIN 26 ausfahren
[LAUFWERK] PIN 28 ausfahren
[LAUFWERK] PIN 30 ausfahren
[LAUFWERK] PIN 32 ausfahren
[LAUFWERK] PIN 34 ausfahren

Danke schonmal im Vorraus
Gruß Samuel
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
26.10.2019, 19:07
Beitrag #2
RE: Falsche Werte im Array
Welchen MC verwendet Ihr? Auf Arduino ist sowohl die Arbeit mit der Klasse String, als auch mit dynamisch erzeugten Objekten keine gute Idee.
Es sieht danach aus, als würden Speicherbereiche überschrieben.

Ihr prüft auch nicht ab, ob new überhaupt ein Objekt anlegen konnte.
Das solltet Ihr auf alle Fälle tun.
Zusätzlich könnt Ihr auch mal den freien RAM prüfen.

Code:
// Quelle: https://jeelabs.org/2011/05/22/atmega-memory-use/
int freeRam () {
   extern int __heap_start, *__brkval;
   int v;
   return (int) &v - (__brkval == 0 ? (int) &__heap_start : (int) __brkval);
}

Gruß Tommy

"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
27.10.2019, 14:19
Beitrag #3
RE: Falsche Werte im Array
(26.10.2019 19:07)Tommy56 schrieb:  Welchen MC verwendet Ihr? Auf Arduino ist sowohl die Arbeit mit der Klasse String, als auch mit dynamisch erzeugten Objekten keine gute Idee.
Es sieht danach aus, als würden Speicherbereiche überschrieben.

Ihr prüft auch nicht ab, ob new überhaupt ein Objekt anlegen konnte.
Das solltet Ihr auf alle Fälle tun.
Zusätzlich könnt Ihr auch mal den freien RAM prüfen.

Code:
// Quelle: https://jeelabs.org/2011/05/22/atmega-memory-use/
int freeRam () {
   extern int __heap_start, *__brkval;
   int v;
   return (int) &v - (__brkval == 0 ? (int) &__heap_start : (int) __brkval);
}

Gruß Tommy

Wir haben einen ATMega 2560.
Wie würde es denn aussehen, wenn man die Objekte nicht dynamisch erstellt?

Ich habe gerade geprüft ob die Objekte angelegt wurden. Mit einer if-Abfrage, ob das jeweilige Laufwerk != null ist, spuckt der mir überall ein true aus. Dann habe ich ihn nochmal alle Pins nachdem die Laufwerke instanziert wurden (im Ziffer-Konstruktor) ins Serial schreiben lassen und da zeigt er mir auch die richtigen an. Erst in der zeigeZiffer-Funktion sind die dann falsch.

Das mit dem Speichermangel habe ich ausprobiert, die Funktion die du geschickt hast gibt vor der Instanzierung 7821 und danach 7782 aus, also daran liegt es dann wohl nicht oder?

Gruß Samuel
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
27.10.2019, 15:41
Beitrag #4
RE: Falsche Werte im Array
Ok, dann wohl nicht.
Der Teil kommt mir komisch vor:
Code:
for(int i=0; i<7;i++)
      {
        // Stimmen die Pins?
        Serial.print(i); Serial.print(" - "); Serial.println(pins_arg[i]);
        laufwerke[i] = new Laufwerk(pins_arg[i]);
      }

Gruß Tommy

"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
27.10.2019, 17:45
Beitrag #5
RE: Falsche Werte im Array
(27.10.2019 15:41)Tommy56 schrieb:  Ok, dann wohl nicht.
Der Teil kommt mir komisch vor:
Code:
for(int i=0; i<7;i++)
      {
        // Stimmen die Pins?
        Serial.print(i); Serial.print(" - "); Serial.println(pins_arg[i]);
        laufwerke[i] = new Laufwerk(pins_arg[i]);
      }

Gruß Tommy

Wenn ich dich richtig verstehe, denkst du, es liegt daran, dass im Ziffer-Konstruktor nicht die richtigen Pins als Argumente übergeben werden. Hab jetzt mal deinen Code ausgeführt aber da zeigt er mir noch die richtigen an. Und es würde ja auch Sinn machen, denn ab dem dritten Laufwerk scheint ja alles zu funktionieren.

Edit: Habe grade gesehen, dass im ersten Beitrag der Output vom Serial nicht ganz dem Arduino-Programm entspricht. Hier der aktuelle:

Zitat:[memCheck] 7805
[ZIFFER] initialisieren...
0 - 22
[LAUFWERK] PIN 22 initialisieren...
[LAUFWERK] PIN 22 initialisiert
1 - 23
[LAUFWERK] PIN 23 initialisieren...
[LAUFWERK] PIN 23 initialisiert
2 - 24
[LAUFWERK] PIN 24 initialisieren...
[LAUFWERK] PIN 24 initialisiert
3 - 25
[LAUFWERK] PIN 25 initialisieren...
[LAUFWERK] PIN 25 initialisiert
4 - 26
[LAUFWERK] PIN 26 initialisieren...
[LAUFWERK] PIN 26 initialisiert
5 - 27
[LAUFWERK] PIN 27 initialisieren...
[LAUFWERK] PIN 27 initialisiert
6 - 28
[LAUFWERK] PIN 28 initialisieren...
[LAUFWERK] PIN 28 initialisiert
[ZIFFER] initialisiert
[ZIFFER] zeige Ziffer 8
[LAUFWERK] PIN 898 ausfahren
[LAUFWERK] PIN -28413 ausfahren
[LAUFWERK] PIN 24 ausfahren
[LAUFWERK] PIN 25 ausfahren
[LAUFWERK] PIN 26 ausfahren
[LAUFWERK] PIN 27 ausfahren
[LAUFWERK] PIN 28 ausfahren
[memCheck] 7766
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
27.10.2019, 18:02
Beitrag #6
RE: Falsche Werte im Array
Man überliest den Fehler so schnell Wink
Code:
private:

    Laufwerk *laufwerke[7]; // <---- hier muss die 7 als Anzahl rein
Die Schreibweise mit der leeren [] ist nur machbar, wenn gleichzeitig der Inhalt initialisiert wird. Sonst musst Du die Länge angeben.

Gruß Tommy

"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
27.10.2019, 18:45
Beitrag #7
RE: Falsche Werte im Array
(27.10.2019 18:02)Tommy56 schrieb:  Man überliest den Fehler so schnell Wink
Code:
private:

    Laufwerk *laufwerke[7]; // <---- hier muss die 7 als Anzahl rein
Die Schreibweise mit der leeren [] ist nur machbar, wenn gleichzeitig der Inhalt initialisiert wird. Sonst musst Du die Länge angeben.

Gruß Tommy

Tommy, mein Retter! Angel Daran hat's gelegen. Vielen Dank und noch nen schönen Abend dir!
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
  Bit Array Groomit 3 77 Gestern 19:27
Letzter Beitrag: Tommy56
  zwei Werte im Eeprom ablegen senseman 2 317 14.12.2019 22:50
Letzter Beitrag: senseman
  DS3234 Werte auf Nextion Kurt 10 558 01.12.2019 16:27
Letzter Beitrag: Kurt
  atof array ausgeben Pet 6 380 27.11.2019 13:12
Letzter Beitrag: Pet
  wie kann ich ausgangspins aus einem array steuern? uwe.z 4 393 04.11.2019 21:46
Letzter Beitrag: Holzauge
  Werte in Arduino mittels Drucktaster eingeben und mittels Formel Wert berechnen Pauli33_student 5 405 04.11.2019 13:20
Letzter Beitrag: Peter_hno3
  2D String Array DirkTH 5 582 08.10.2019 09:07
Letzter Beitrag: Tommy56
  Float array über NRF24L01 senden und empfangen Flo3107 6 627 04.09.2019 21:55
Letzter Beitrag: Tommy56
  Array mit Wochentage füllen Hoffmakl 5 1.067 23.06.2019 18:57
Letzter Beitrag: Hoffmakl
  Textlänge (char) Array Blende8 3 682 08.04.2019 18:08
Letzter Beitrag: Tommy56

Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste