- 12V Akku mit 280 Ah bauen         
Ergebnis 1 bis 7 von 7

Thema: Arrays und Speicherverwaltung

  1. #1

    Arrays und Speicherverwaltung

    Anzeige

    E-Bike
    Hallo,
    Ich habe ein noch nicht identifiziertes Problem. Vielleicht könnte mir hier jemand helfen.

    In meinem Programm werden jede halbe Minute Gewichtswerte abgefragt und in einer Grafik dargestellt. Meine Grafik zeigt die letzten 112 Werte, die ich in einer Array aufbewahre. Um die Gewichtswerte je nach Bereich in verschiedenen Farben anzuzeigen, wird jedes Mal einzelne Werte mit einer for-Schleife in einen anderen Array kopiert und einzeln angezeigt. D.h. nur um den aktuellen Gewichtswert anzuzeigen, 112 Mal hin und her kopiert.

    Nun das Problem ist, irgend wann ein Mal bleibt die Grafik hängen oder positioniert die Gewichtswerte falsch auf der Grafik. Ein paar Mal hat die Applikation sogar total abgestürtzt.

    Ich habe die Vermutung, dass die ganze Arrays den Stack überlasten und zu unvorhersehbaren Probleme führen.

    Wie kann soll am besten mit Arrays umgehen? Muss man für Arrays unbedingt Speicherplatz reservieren und dann wieder freigeben, auch wenn man die Grösse des Arrays weiss.

    Jede Hilfe wird sehr geschätzt.

  2. #2
    Erfahrener Benutzer Robotik Einstein Avatar von SprinterSB
    Registriert seit
    09.06.2005
    Ort
    An der Saar
    Beiträge
    2.802
    Wenn die Arraygröße bekannt ist, dann kannst Du es doch einfach statisch anlegen.

    #define WERTE_SIZE 112
    typ_t werte[WERTE_SIZE];

    Ausserdem reicht es doch, die Adresse des Feldanfangs zu übergeben, es muss nicht das ganze Feld kopiert werden.
    Disclaimer: none. Sue me.

  3. #3
    Danke Georg für deine Antwort.
    Ich lege meine Arrays auch alle statisch an. Ich weiss nicht genau ob mein Problem genau an Arrays liegt aber ich habe diese Vermutung. Aus irgend einem Grund bleibt die Grafik hängen oder manchmal es kommt zum Programmabsturz.

    Ich habe 2 Arrays:
    1- double Array1[112] // speichert letzten 112 Messwerte
    2- double Array2[112] = {0, 0 , 0, .... ,0 ,0} // ein Zwischenspeicher

    Habe ich einen Messwert, wird dieser in Array1 abgelegt. Bevor die Grafik angezeigt wird, kopiere ich in einer for-Schleife die einzelne Werte in Array2, damit einzelne Messwerte in entsprechender Farbe angezeigt werden.

    for (i=0; i<=111; i++)
    {
    Array2[i] = Array1[i];
    Zeige alle Werte von Array2[] auf der Grafik an; // hier wird nur eine einzige Säule angezeigt, da alle andere immer NULL sind.
    for (i=0; i<=111; i++)
    {
    Array[2] =0; // Zwischen-Array wieder nullieren
    }
    }

    Meine Frage ist, ist mein Umgang mit Arrays so richtig? Oder muss ich für sie am Anfang Speicherplatz reservieren und dann wieder freigeben oder anders pflegen. Kann das der Grund, warum die Grafik manchmal friert oder meine Applikation abstürzt?

    mfg Sait

  4. #4
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    24.02.2006
    Ort
    3. Planet eines kleinen Sonnensystems in einem Seitenarm der Milchstraße
    Alter
    70
    Beiträge
    622
    Hallo Sait,

    das statische Anlegen/Verwenden der Arrays ist schon in Ordnung. Welchen AVR benutzt Du (Hintergrund der Frage: wie viel Platz bleibt für den Stack?)? Was sagt GCC über die Speichernutzung?

    Den Platz dynamisch anzulegen und wieder freizugeben wird eher Nachteile bringen.

    Gruß

    Fred
    Only entropy comes easy. - Anton Checkhov

  5. #5
    Hallo Fred,

    Entschuldige mich für meine Unwissenheit, aber AVR sagt mir nichts. Ich weiss auch nicht genau, wo man nachsehen kann, wie viel Platz für den Stack übrig bleibt. Wenn Du aber Speichernutzung meinst, im Taskmanager sehe ich ungefähr 8 MB für meine Applikation. Ich benutze LabWindows CVI (C for virtual instrumantation) und dort sehe ich unter "Build Options" maximum stack size 100000 Byte.

    Gruss
    Sait

  6. #6
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    24.02.2006
    Ort
    3. Planet eines kleinen Sonnensystems in einem Seitenarm der Milchstraße
    Alter
    70
    Beiträge
    622
    Hallo Sait,

    Dein Beitrag steht in der Rubrik "Atmel AVR Controller und Programmierung", deshalb bin ich davon ausgegangen, dass Du einen AVR programmierst.

    Von LabWindows CVI habe ich keine Ahnung - da sollte Dir besser jemand helfen, der auch etwas von Deiner Entwicklungsumgebung versteht.

    Inwieweit handelt es sich denn um eine Echtzeit-Anwendung?

    MfG

    Fred
    Only entropy comes easy. - Anton Checkhov

  7. #7
    Neuer Benutzer
    Registriert seit
    22.11.2008
    Ort
    FRA
    Beiträge
    1

    Array

    Hallo,

    falls noch aktuell, im Code sind 2 ineinander geschachtelte For Schleifen, die den gleichen Index i verwenden, das müsste das Problem sein.

    Hinweis von einem Softwerker: Verwendet für Variablen eindeutig sprechende Namen, Buchstaben kosten nix.

Berechtigungen

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

Labornetzteil AliExpress