PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Arrays und Speicherverwaltung



setirli
18.08.2008, 10:43
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.

SprinterSB
18.08.2008, 11:03
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.

setirli
18.08.2008, 12:06
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

fhs
18.08.2008, 13:00
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

setirli
18.08.2008, 13:29
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

fhs
18.08.2008, 13:38
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

profirobi
22.11.2008, 20:01
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.