Forum: Mikrocontroller und Digitale Elektronik C++ Dynamisches Objekt


von Christian K. (christiankarle)


Lesenswert?

Hallo liebe Community,

weis Jemand, wieso folgender Code nicht funktioniert?

Compiler: Error: Identifier "DMX" is undefined in "Main/Main.cpp", Line: 
16, Col: 14

#include "Configuration.h"
#include "DMX512.h"


void startup ( void ) {

    Configuration* DMX = new Configuration;
};


int main ( void ) {

    startup ( );
    //Application Code
    int i = DMX -> s_DMX_Config_struct.baudrate;
};

LG Christian

von Peter II (Gast)


Lesenswert?

Christian K. schrieb:
> weis Jemand, wieso folgender Code nicht funktioniert?

weil dmx nicht global ist.

von micha (Gast)


Lesenswert?

Eventuell weil DMX in main nicht bekannt ist ?
(wird ja nur lokal in Startup definiert)

von Der Andere (Gast)


Lesenswert?

Weil du erst mal ein C Buch lesen solltest.

Was sagt dir der Ausdruck: "scope of variables"

von Christian K. (christiankarle)


Lesenswert?

Ich dachte der new Operator legt mir ein Objekt auf dem Heap an. Wieso 
kann ich dann nicht mit dem Zeiger DMX auf das Objekt zugreifen?

von Kaj (Gast)


Lesenswert?

C-Buch aufschlagen, und dann such mal nach Scope...

Dein Objekt DMX existiert nach startup() nicht mehr.

Abgesehen davon hast du ein sauberes Speicherleck programmiert.

von Peter II (Gast)


Lesenswert?

Christian K. schrieb:
> Ich dachte der new Operator legt mir ein Objekt auf dem Heap an.
macht er auch

> Wieso kann ich dann nicht mit dem Zeiger DMX auf das Objekt zugreifen?
weil du keine Variabel hast die auf das Objekt zeit - du hast ein 
speicherloch geschaffen.

von Kaj (Gast)


Lesenswert?

Christian K. schrieb:
> Ich dachte der new Operator legt mir ein Objekt auf dem Heap an. Wieso
> kann ich dann nicht mit dem Zeiger DMX auf das Objekt zugreifen?
Das aendert ja nichts daran, dass das Objekt am Ende der Funktion 
zerstoert wird.

von Christian K. (christiankarle)


Lesenswert?

Könnte jemand mal ein Beispiel geben, wie man es anders machen kann? Ich 
würde gerne ein Objekt in einer Methode erstellen, auf welches ich im 
gesamten Programm zugreifen kann.

von Peter II (Gast)


Lesenswert?

Kaj schrieb:
> Das aendert ja nichts daran, dass das Objekt am Ende der Funktion
> zerstoert wird.

nein, wird es nicht. Der Zeiger wird zerstört das objekt aber nicht.

von Peter II (Gast)


Lesenswert?

Christian K. schrieb:
> Könnte jemand mal ein Beispiel geben, wie man es anders machen kann? Ich
> würde gerne ein Objekt in einer Methode erstellen, auf welches ich im
> gesamten Programm zugreifen kann.

wurde doch schon gesagt, du brauchst eine globale Variable.

von Kaj (Gast)


Lesenswert?

Peter II schrieb:
> nein, wird es nicht.
Ja, hab mich unsauber ausgedrueckt.

von Ralf G. (ralg)


Lesenswert?

Christian K. schrieb:
> Wieso kann ich dann nicht mit dem Zeiger DMX auf das Objekt zugreifen?
Weil die Funktion 'startup' die Position nicht preisgibt.

Die Alternative wäre:
1
Configuration* startup ()
2
{
3
  return new Configuration;
4
};

*Aber!* Hier fehlt noch die Prüfung, ob überhaupt ein Objekt angelegt 
werden konnte. Und du musst dich natürlich auch noch um die spätere 
Freigabe des Objekts kümmern.

: Bearbeitet durch User
von Christian K. (christiankarle)


Lesenswert?

So?

#include "Configuration.h"
#include "mbed.h"
#include "DMX512.h"

Configuration *DMX;

void startup ( void ) {

    DMX = new Configuration;
};


int main ( void ) {

    startup ( );
    //Application Code
    int i = DMX -> s_DMX_Config_struct.baudrate;
};

von Kaj (Gast)


Lesenswert?

Peter II schrieb:
> du brauchst eine globale Variable.
Nein, braucht er nicht. Eine lokale Variable in main und ein return in 
startup reichen. Mit einer globalen Variablen kann man es machen, muss 
man aber nicht.

-------
Da war Ralf schneller :)

von Peter II (Gast)


Lesenswert?

Kaj schrieb:
> Nein, braucht er nicht.

oder doch. Er will im gesamten Programm darauf zugreifen. Damit müsste 
er an jeder Funktion das objekt übergeben - was bei thread schon schwer 
wird.

von Torsten R. (Firma: Torrox.de) (torstenrobitzki)


Lesenswert?

Christian K. schrieb:
> Könnte jemand mal ein Beispiel geben, wie man es anders machen kann? Ich
> würde gerne ein Objekt in einer Methode erstellen, auf welches ich im
> gesamten Programm zugreifen kann.
1
#include "Configuration.h"
2
#include "DMX512.h"
3
4
Configuration startup() 
5
{
6
    return Configuration();
7
};
8
9
Configuration DMX = startup();
10
11
int main() 
12
{
13
    //Application Code
14
    int i = DMX.s_DMX_Config_struct.baudrate;
15
};

C++ ist nicht C, aber auch nicht Java.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.