Ich greife diesen sehr informativen Fred noch mal auf, weil er (fast) genau mein Prob trifft.
Jetzt komme ich progtechnisch aus der Delphi-Ecke und bin des C nicht soooo mächtig. Zum anderen ist mein Mega zum selbstprobieren noch nicht da.
Also hier erstmal ein theoretische Anfrage.
Die Aufgabenstellung mal kurz:
Ich möchte einen Stepper sozusagen eine "Figur" fahren lassen - soll heissen: Einige U's langsam vorwärts, diverse U's schneller vorwärts, dann einige U's gemäßigt rückwärts usw. Dazu bekommt die Steuerung/der Arduino jeweils ein Kommando aus Integern: Richtung, Anzahl Steps, Geschwindigkeit (und ggf.noch ein paar mehr).
Eine "Figur" (oder auch Sequenz) besteht aus aus einer definierten Anzahl gleicher Kommandos, deren Anzahl nicht festliegt !
D.h., es können mal weniger als 10 sein oder auch nur ein Kommando, durchaus aber auch mal mehr. 20, 50, 100 ?
So ein Kommando würde ich dann in eine Struktur verpacken wollen:
typedef struct CMD_record
{
int Dir;
int Steps;
int Speed;
};
Das wäre doch so weit OK - oder ?
Nun kommt die Dynamik ins Spiel. Ich bräuchte ein Array aus der o.g. Struct in variabler Länge, da ich wie gesagt nicht weiß, wie lang so eine Sequenz ist/werden kann. Statisch zu groß vereinbart verballer ich entweder immer jede Menge Speicher oder bekomme umgekehrt nie/selten eine komplette Sequenz in den Speicher.
Also liegt der Gedanke nahe, ein dynamischen Array aus o.g. Struktur zur Laufzeit anzulegen.
In Delplhi für mich kein Thema, aber auf dem Arduino mit C .....
Der steuernde PC würde erst mal anfragen, ob ich für "NumSeq" auch genug Speicher habe.
Als (globale) var würde ich definieren:
CMD_record* CMD_Seqence
Wäre folgendes zum "Speicherholen" richtig ?! (mit calloc gleich alles auf 0 setzen)
CMD_Sequence = (int*) calloc (NumSeq * (sizeof (CMD_Record)));
Ist dieses (int*) vor dem calloc OK so ? Sind ja alles nur int's ....
Ob nun wie auch immer OK oder nicht (ihr werdet mich sicher belehren) - wie bekomme ich heraus, das diese Alloziierung auch erfolgreich war ?
Sprich (noch) genügend Speicher vorhanden und Befehl erfolgreich ?
Oder muss/sollte man das vorher prüfen ? Wenn ja, wie ?
Vorrausgesetzt, alles ist "grün", würde ich dann in meine Seriell-Auswerteroutine die Daten vom PC wie folgt setzen:
for (int i=0; i<NumSeq; i++) {
/* hier wird jeweils vorher Dir, Steps und Speed ausgewertet */
CMD_Sequence.Dir[i].Dir = Dir;
CMD_Sequence.Dir[i].Steps = Steps;
CMD_Sequence.Dir[i].Speed = Speed;
}
Und zum Schluss: Wie werde ich die alloziierten Daten in CMD_Sequence wieder rückstandsfrei los ?
Zusatzfrage für die Spezi's:
Wenn man solche "Aktionen" z.B. mit/bei mehreren Motoren durchführt, welche alle unabhängig laufen und unterschiedlich lange "Figuren" haben, könnte ich mir sehr gut vorstellen, das irgendwann mal der Speicher in der Belegung etwas "zerklüftet" ist und sich größere Blöcke nicht mehr am Stück belegen lassen.
Managed ein Arduino so etwas selbsttätig oder muss man da mit so was wie in der Art eines Festplattendefragmentieres ran und aufräumen ?