- fchao-Sinus-Wechselrichter AliExpress         
Seite 1 von 3 123 LetzteLetzte
Ergebnis 1 bis 10 von 26

Thema: Public variable erst später initialisieren

  1. #1
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    01.05.2009
    Beiträge
    118

    Public variable erst später initialisieren

    Anzeige

    LiFePo4 Akku selber bauen - Video
    Hallo,
    ich möchte in meinem Programm eine Public variable erst zu einem bestimmten Zeitpunkt initialisieren.
    Soll heißen: Ich hab eine Funktion appStart(), eine appProc() und eine appProcFocus(). Nun wird aus main() erst appStart() und dann in einer Schleife appProc() aufgerufen. Ebenfalls wird appProcFocus() unter best. Umständen aufgerufen. Nun müssen diese Funktionen unter einander kommunizieren, jedoch sollen die variablen erst mit appStart() initialisiert werden (RAM sparen).
    Wie kann ich es also schaffen public variablen während dem Betrieb zu erstellen (/danach auch wieder zu löschen)?

    Danke schon mal im vorraus.
    C_Classic


    Ps: Bin grad im Urlaub - kann eure antworten also nicht gleich ausprobieren.

  2. #2
    Da wirst du um malloc() nicht herum kommen. Damit reservierst du einen Speicherbereich zur Laufzeit. Deine Aufgabe ist es nun, den anderen Funktionen die Zugriff auf diesen Bereich brauchen per Pointer die Position im Speicher mitzuteilen. Ob du dadurch wirklich RAM sparst wage ich allerdings zu bezweifeln, insbesondere wenn man an die vielen Probleme denkt, die malloc so mit sich bringt

  3. #3
    Erfahrener Benutzer Roboter Experte Avatar von BurningWave
    Registriert seit
    22.12.2007
    Ort
    nahe Stuttgart
    Alter
    29
    Beiträge
    656
    Es kommt darauf an, wo deine Variable definiert ist. Ich nehme mal an, dass sie gleich am Anfang vin main() deklariert wird. An deiner Stelle würde ich sie auch als normale Variable erstellen und als Pointer an die Funktionen übergeben, da mir nicht ganz klar ist, wo du duch ein späteres Initialisieren RAM sparst. Alternativ definierst du in main() einen Pointer, den du deinen Funktionen übergibst, die Init-Funktion reserviert mittels malloc() speicher für den Pointer. Vor Programmende muss dieser aber mit free() wieder freigegeben werden.
    meine Homepage: http://www.jbtechnologies.de
    Hauptprojekte: Breakanoid 2 - Sound Maker

  4. #4
    Erfahrener Benutzer Robotik Einstein Avatar von Felix G
    Registriert seit
    29.06.2004
    Ort
    49°32'N 8°40'E
    Alter
    41
    Beiträge
    1.780
    Ganz ehrlich, mit malloc() RAM sparen zu wollen ist doch ein sehr ... esoterischer Ansatz

    Zunächst mal benötigt malloc() selbst schon einiges an Speicherplatz im Codesegment, und dazu kommt noch daß vor jedem mit malloc() reservierten Speicherbereich zusätzliche Informationen abgespeichert werden.

    Nehmen wir z.B. einen 32 Bit Integer, dann benötigt dieser als globale Variable genau 4 Byte Speicherplatz ... ein malloc(sizeof(uint32_t)) hingegen reserviert einen Speicherbereich der Größe "4-Byte + X", wobei X von der konkreten Implementierung des Heaps abhängig ist.
    So viele Treppen und so wenig Zeit!

  5. #5
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    01.05.2009
    Beiträge
    118
    Noch ne Idee von mir: kann ich das ganze auch mit einer Klasse in c++ machen (gibt doch nen AVR g++), die ich dann erst zu einem bestimmten zeitpunkt initialisiere?

  6. #6
    Erfahrener Benutzer Roboter Experte Avatar von BurningWave
    Registriert seit
    22.12.2007
    Ort
    nahe Stuttgart
    Alter
    29
    Beiträge
    656
    Ich glaube nicht, dass es einen Compiler gibt, der für AVRs C++ compilieren kann oder?

    Wenn doch, geht es, wäre sogar das beste. Falls du Hilfe brauchst frag.
    meine Homepage: http://www.jbtechnologies.de
    Hauptprojekte: Breakanoid 2 - Sound Maker

  7. #7
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    01.05.2009
    Beiträge
    118
    Klar gibt es den: avr-g++
    werde es dann mal wenn ich daheim bin probieren.

    Dann noch ne andere Frage: kann ich Klassen mit Indexen versehen? Also: Class App(0), Class App(1), ...

  8. #8
    Erfahrener Benutzer Robotik Einstein Avatar von Felix G
    Registriert seit
    29.06.2004
    Ort
    49°32'N 8°40'E
    Alter
    41
    Beiträge
    1.780
    Der AVR-GCC kann auch mit C++ umgehen, allerdings nicht zu 100%. Es gibt da so einige Sprachkonstrukte die (noch?) nicht unterstützt werden.

    Aber auch da stellt sich mir wieder die Frage, ob sich dadurch überhaupt RAM sparen lässt



    Vielleicht solltest du dich nicht so sehr auf dynamische Erzeugung von Objekten/Variablen konzentrieren, denn das ist prinzipbedingt immer mit zusätzlichem Overhead verbunden.

    Möglicherweise kann man dein Problem ja auf einem anderen Weg lösen, aber um das genau sagen zu können sind weitere Informationen notwendig.
    (welche Art von Daten werden wie zwischen den Funktionen übertragen?)
    So viele Treppen und so wenig Zeit!

  9. #9
    Erfahrener Benutzer Roboter Experte Avatar von BurningWave
    Registriert seit
    22.12.2007
    Ort
    nahe Stuttgart
    Alter
    29
    Beiträge
    656
    Ich finde C++ in deinem Fall ein bisschen unpassend, weil du sicher keinen RAM sparst, aber wenn es sein muss, mache eine Klasse CApp, die deine Methoden und die Variable als Member enthält. Dann hat sich dein Problem eh gelöst. Wenns sein muss könntest du deine Variable mit new im Konstruktor erzeugen (also wieder als Zeiger) und im Destruktor mit delete löschen.
    meine Homepage: http://www.jbtechnologies.de
    Hauptprojekte: Breakanoid 2 - Sound Maker

  10. #10
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    01.05.2009
    Beiträge
    118
    Ich glaube es liegt hier noch ein kleines Missverständnis vor (entweder bei mir oder bei euch wegen meiner unklaren Formulierung): Die Klassen werden Nicht ALLE sofort initialisiert (ich hoffe das ist das richtige Wort; initialisieren ist doch z.b. int x=0, sondern müssen vom "Benutzer" durch "app(x) starten" gestartet werden - und da soll dann die Klasse erstellt werden.

    _R2D2: ich verstehe gerade nicht ganz wie du das meinst. Könntest mir den Aufbau der klasse an nem Beispiel erläutern?

Seite 1 von 3 123 LetzteLetzte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

LiFePO4 Speicher Test