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


von Sebastian B. (lufti)


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.
1
typedef void (*pfunction)(void);
2
3
typedef struct
4
{
5
    uint id;
6
    ulong timestamp;
7
    ulong delay;
8
    uchar count;
9
    uchar priority;
10
    pfunction function;
11
    struct
12
    {
13
        uchar reload:1;
14
        uchar reload_endless:1;
15
        uchar reload_after_delay:1;
16
        uchar reserved:5;
17
    } parameters;
18
} strTaskEntry;
19
20
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:
1
for ( i2=11; i2!=19; --i )
2
{
3
    SCHEDULER_HIGH_strTaskList[i2+1] = SCHEDULER_HIGH_strTaskList[i2];
4
}

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

Habt ihr eine Idee?

von The Daz (Gast)


Lesenswert?

1. mein GCC frisst kein uint oder uchar
2. was ist xdata ?

von T. Stütz (Gast)


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

von T. Stütz (Gast)


Lesenswert?

Sorry, beim 2. Argument fehlt ein "&"

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

von Rolf Magnus (Gast)


Lesenswert?

Oder gleich alle auf einmal, dann aber mit memmove:

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

von The Daz (Gast)


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 ?

von Sebastian B. (lufti)


Angehängte Dateien:

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

von Sebastian B. (lufti)


Angehängte Dateien:

Lesenswert?

.. und hier das header file.

von Sebastian B. (lufti)


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

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.