ArduinoForum.de - Das deutschsprachige Forum rund um den Arduino
Zentrale Variablen für verschiedene Klassen - Druckversion

+- ArduinoForum.de - Das deutschsprachige Forum rund um den Arduino (https://www.arduinoforum.de)
+-- Forum: Arduino-Allgemein (/arduino-Forum-Arduino-Allgemein)
+--- Forum: Programmierung (/arduino-Forum-Programmierung)
+--- Thema: Zentrale Variablen für verschiedene Klassen (/arduino-Thread-Zentrale-Variablen-f%C3%BCr-verschiedene-Klassen)



Zentrale Variablen für verschiedene Klassen - Smirgel - 28.10.2018 22:06

Hallo liebe Bastler, Frickler und Programmierer.

In einem komplexeren Projekt möchte ich aus verschiedenen Klassen auf Zentrale Daten zugreifen.
Sagen wir mal ich habe eine Hauptdatei.ino. Dazu verwende ich eine selbstgeschriebene Klasse für ein 128x64 Display. Hauptdatei.ino und die Display-Klasse sollen auf globale Werte zugreifen .

Mein Problem war es die Hauptdatei.ino als Objekt (quasi als Container für die globalen Werte) an die Display-Klasse zu übergeben. Deswegen habe ich eine weitere Klasse geschrieben, nennen wir sie mal Kernel, welche ausschließlich die Daten speichert und wieder zurückgibt. Die Kernel-Klasse wird in der Hauptdatei.ino Instanziiert und im setup() über eine display.initialize(Kernel kernel)-Funktion an die Display-Klasse übergeben.

Leider verhalten sich beide Kernel-Objekte, also in der Hauptdatei.ino und der Display-Klasse unabhängig voneinander.

Vielleicht hat jemand einen Tip für mich oder einen anderen Lösungsweg. Das wäre echt super.

Smi Ó_ò


Hauptdatei.ino
Code:
#include "Arduino.h"
#include "Wire.h"
#include "U8glib.h"
#include "Kernel.h"
#include "Display.h"

#define RIGHT     0
#define LEFT      1

Kernel kernel=Kernel();
Display display=Display();

bool readed;
byte encoderValue;


void setup(){
    Serial.begin(9600);
    Wire.begin(8);
    Wire.onReceive(receiveEvent);
    kernel.value=123;
    display.initialize(kernel);
}

void loop(){
    display.update();
    if(readed){
        switchEncoder();
        readed=false;
    }
}

void receiveEvent(int howMany) {
    encoderValue = Wire.read();
    readed=true;
}

void switchEncoder(){
    switch(encoderValue){
        case RIGHT:
            display.right();
            Serial.println(kernel.value);
            break;
        case LEFT:
            display.left();
            Serial.println(kernel.value);
            break;
    }
}


Kernel.h
Code:
#ifndef KERNEL_H_
#define KERNEL_H_

#include "Arduino.h"

class Kernel {

public:
    Kernel();
    byte value=0;
};

#endif


Kernel.cpp
Code:
#include "Kernel.h"

Kernel::Kernel() {}


Display.h
Code:
#ifndef DISPLAY_H_
#define DISPLAY_H_

#include "Arduino.h"
#include "U8glib.h"
#include "Kernel.h"

class Display {
    private:
    U8GLIB_ST7920_128X64_1X u8g;
    Kernel kernel;
    boolean redraw;

    public:
    Display();
    void initialize(Kernel k);
    void update();
    void left();
    void right();
};

#endif

Display.cpp
Code:
#include "Display.h"

Display::Display() : u8g(10,9,8,2,7,6,5,4,11,13,12,3) {
    redraw=true;
}

void Display::initialize(Kernel k){
    kernel=k;
}

void Display::update(){
    if (redraw) {
        u8g.firstPage();
        do{
            u8g.setFont(u8g_font_04b_03br);
            u8g.setFontPosTop();
            u8g.setPrintPos(1,1);
            u8g.print("VALUE: "+String(kernel.value));

        }while(u8g.nextPage());
        redraw=false;
    }
}

void Display::left(){
    if(kernel.value>0)kernel.value--;
    redraw=true;
}

void Display::right(){
    if(kernel.value<255)kernel.value++;
    redraw=true;
}



RE: Zentrale Variablen für verschiedene Klassen - Tommy56 - 29.10.2018 11:17

Versuche es mal mit der Übergabe als Pointer oder als Referenz. So wie es jetzt ist, wird eine Kopie übergeben.

Gruß Tommy


RE: Zentrale Variablen für verschiedene Klassen - Smirgel - 29.10.2018 16:56

Jup Tommy.
Danke für das richtige Stichwort. Mit Pointern hatte ich mich bisher noch nicht beschäftigt. Hab also keine Ahnung was ich da mache aber es funktioniert mit folgengen Änderungen:

Hauptdatei.ino
Code:
void setup(){
    Serial.begin(9600);
    Wire.begin(8);
    Wire.onReceive(receiveEvent);
    kernel.value=123;
    display.initialize(&kernel);  //<---
}


Display.h
Code:
class Display {
    private:
    U8GLIB_ST7920_128X64_1X u8g;
    Kernel* kernel;  //<---
    boolean redraw;
    .......

Display.cpp
Code:
void Display::initialize(Kernel* k){  //<---
    kernel=k;
}

void Display::update(){
    if (redraw) {
        u8g.firstPage();
        do{
            u8g.setFont(u8g_font_04b_03br);
            u8g.setFontPosTop();
            u8g.setPrintPos(1,1);
            u8g.print("VALUE: "+String(kernel->value));  //<---

        }while(u8g.nextPage());
        redraw=false;
    }
}

void Display::left(){
    if(kernel->value>0)kernel->value--;  //<---
    redraw=true;
}

void Display::right(){
    if(kernel->value<255)kernel->value++;  //<---
    redraw=true;
}

Und danke für die schnelle Antwort.

Grüße. Smi O_o


RE: Zentrale Variablen für verschiedene Klassen - Tommy56 - 29.10.2018 21:24

Prima, dass es funktioniert.

Gruß Tommy