mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik C++ Dynamisches Objekt


Autor: Christian K. (christiankarle)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Peter II (Gast)
Datum:

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

weil dmx nicht global ist.

Autor: micha (Gast)
Datum:

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

Autor: Der Andere (Gast)
Datum:

Bewertung
1 lesenswert
nicht lesenswert
Weil du erst mal ein C Buch lesen solltest.

Was sagt dir der Ausdruck: "scope of variables"

Autor: Christian K. (christiankarle)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Kaj (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Peter II (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Kaj (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Christian K. (christiankarle)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Peter II (Gast)
Datum:

Bewertung
1 lesenswert
nicht 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.

Autor: Peter II (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Kaj (Gast)
Datum:

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

Autor: Ralf G. (ralg)
Datum:

Bewertung
0 lesenswert
nicht 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:
Configuration* startup ()
{
  return new Configuration;
};

*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
Autor: Christian K. (christiankarle)
Datum:

Bewertung
0 lesenswert
nicht 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;
};

Autor: Kaj (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 :)

Autor: Peter II (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Torsten R. (Firma: robitzki.de) (torstenrobitzki)
Datum:

Bewertung
0 lesenswert
nicht 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.
#include "Configuration.h"
#include "DMX512.h"

Configuration startup() 
{
    return Configuration();
};

Configuration DMX = startup();

int main() 
{
    //Application Code
    int i = DMX.s_DMX_Config_struct.baudrate;
};

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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.