mikrocontroller.net

Forum: Compiler & IDEs struct Array: Einträge verschieben. Wie?


Autor: Sebastian B. (lufti)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Leute,

ich bin ein ziemlicher Neuling in C und bin hier über ein Problem
gestolpert. Vielleicht könnt ihr mir helfen!

Ich habe ein Array aus Structs. Es hat 20 Einträge.
typedef void (*pfunction)(void);

typedef struct
{
    uint id;
    ulong timestamp;
    ulong delay;
    uchar count;
    uchar priority;
    pfunction function;
    struct
    {
        uchar reload:1;
        uchar reload_endless:1;
        uchar reload_after_delay:1;
        uchar reserved:5;
    } parameters;
} strTaskEntry;

strTaskEntry xdata SCHEDULER_HIGH_strTaskList [20];

Situation:
Alle Speicherplätze des Array sind bis auf den Letzten mit wichtigen
Einträgen gefüllt.
Ein Eintrag soll zwischen SCHEDULER_HIGH_strTaskList[9] und
SCHEDULER_HIGH_strTaskList[10] geschoben werden. Da hinten ein Eintrag
fehlt (SCHEDULER_HIGH_strTaskList[19]) will ich alle Einträge von
SCHEDULER_HIGH_strTaskList[10] bis SCHEDULER_HIGH_strTaskList[18] um
einen Eintrag Richtung Ende verschieben.
z.B SCHEDULER_HIGH_strTaskList[11] soll den Inhalt (also ein Struct)
vom SCHEDULER_HIGH_strTaskList[10] bekommen.

Ich wollte das so machen:
for ( i2=11; i2!=19; --i )
{
    SCHEDULER_HIGH_strTaskList[i2+1] = SCHEDULER_HIGH_strTaskList[i2];
}

Aber der Compiler meckert:
error48: can not assign values to aggregates.

Habt ihr eine Idee?

Autor: The Daz (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
1. mein GCC frisst kein uint oder uchar
2. was ist xdata ?

Autor: T. Stütz (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
versuchs mal mit

memcpy(&SCHEDULER_HIGH_strTaskList[i2+1],SCHEDULER_HIGH_strTaskList[i2], 
sizeof(strTaskEntry));

Außerdem solltest du deine for-Schleife GANZ genau ansehen, die stimmt
nicht !

Gruss

Autor: T. Stütz (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sorry, beim 2. Argument fehlt ein "&"

memcpy(&SCHEDULER_HIGH_strTaskList[i2+1],&SCHEDULER_HIGH_strTaskList[i2] 
,sizeof(strTaskEntry));

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Oder gleich alle auf einmal, dann aber mit memmove:

memmove(SCHEDULER_HIGH_strTaskList + 11,
        SCHEDULER_HIGH_strTaskList + 10,
        sizeof(*SCHEDULER_HIGH_strTaskList) * 9);

Autor: The Daz (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das Zuweisen von structs ist gueltig also braucht man kein memcpy. Aber
die Abbruchbedingung fuer den for loop ist wirklich kaputt. Kannst du
mal deine ganze source dranhaengen ?

Autor: Sebastian B. (lufti)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Habe es jetzt überarbeitet.
Ob die Funktion da ist, habe ich noch nicht überprüft. Falls euch etwas
auffällt, teilt es mir bitte mit.

Anbei die das c file

Autor: Sebastian B. (lufti)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
.. und hier das header file.

Autor: Sebastian B. (lufti)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hab da ziemlichen Kappes programmiert g
Das Script hat nichtmal annähernd die Funktion, die es haben sollte ..
dafür habt ihr jetzt ein schlechtes Beispiel bekommen.
bye

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.