Element eines Arrays nach vorne verschieben
-
Hallo,
ich verwende folgende Struktur:
typedef struct wgui_window { int ID, posX, posY, width, height; char *caption; char active; SDL_Surface *image; SDL_Surface *imageActive; } WGUI_WINDOW;
Nun habe ich ein Array von diesem Datentyp. In diesem Array möchte ich ein hinteres Element an erste Stelle verschieben, so dass sich dieses über den Index 0 ansprechen lässt. Die restlichen Elemente sollen dabei nach hinten verschoben werden. Ich habe das nun mit folgendem Code versucht:
WGUI_WINDOW tempWindow; [...] for(i = 0; i < count; i++) { if(windows[i].ID == ID) { windows[i].active = true; // das Fenster ganz nach vorne verschieben if(i != 0) { printf("Vorher:\n"); for(j = 0; j < count; j++) printf("[%d] %s\n", j, windows[j].caption); printf("-----------\n"); memcpy(&tempWindow, &windows[i], sizeof(WGUI_WINDOW)); memmove(&windows[1], &windows[0], sizeof(WGUI_WINDOW)*i); memcpy(&windows[0], &tempWindow, sizeof(WGUI_WINDOW)); printf("Nachher:\n"); for(j = 0; j < count; j++) printf("[%d] %s\n", j, windows[j].caption); printf("--------------------------------------------------------\n"); } } else { windows[i].active = false; } }
Die Ausgabe dazu lautet wie folgt:
Vorher: [0] Fenster [1] Fenster 2 ----------- Nachher: [0] Fenster 2 [1] Fenster -------------------------------------------------------- Vorher: [0] Fenster 2 [1] Fenster [2] Fenster 3 ----------- Nachher: [0] Fenster 3 [1] Fenster 2 [2] Fenster --------------------------------------------------------
Demnach hat das ganze ja funktioniert. Mein Problem stellt nun aber das "Feld" image dar. Ich zeichne die einzelne Fenster mit folgendem Code:
if(windows[i].image != NULL) { dst.x = windows[i].posX; dst.y = windows[i].posY; dst.w = windows[i].image->w; dst.h = windows[i].image->h; if(windows[i].active) { SDL_BlitSurface(windows[i].imageActive, NULL, wgui_desktop, &dst); } else { SDL_BlitSurface(windows[i].image, NULL, wgui_desktop, &dst); } }
Es wird, durch die Verschiebung, nur noch das erste Fenster (das, mit der Beschriftung "Fenster") gezeichnet. Die restlichen werden übersprungen - image ist also gleich NULL. Kommentiere ich die oberen drei Zeilen für die Verschiebung aus:
//memcpy(&tempWindow, &windows[i], sizeof(WGUI_WINDOW)); //memmove(&windows[1], &windows[0], sizeof(WGUI_WINDOW)*i); //memcpy(&windows[0], &tempWindow, sizeof(WGUI_WINDOW));
werden alle Fenster gezeichnet - es muss also daran liegen. Ich habe aber keine Ahnung, wieso, bzw. mir fehlt auch jegliche Idee, wie ich das "Problem" debugen könnte (da habe ich wohl ein Defizit?).
Ich freue mich über jegliche Hilfe.
Mit freundlichen Grüßen
-
Ich habe mein Problem nun gefunden: Durch die Verschiebung der Elemente bekamen danach erstellte Elemente eine falsche ID zugewiesen. Dadurch gab es mehrmals die gleiche ID, was ein solches Fehlverhalten zur folge hatte...
-
Wenn du oft an der ersten Stelle einfügen musst und keinen konstant-schnellen Zugriff per Index auf die einzelnen Elemente brauchst, dann wärst du mit einer verketteten Liste weitaus besser dran, da dort das Einfügen an der ersten Stelle ein Klacks ist und man keine Arrayelemente durch die Gegend schieben muss
Ich kenne deinen restlichen Code nicht, aber vielleicht ist das ja eine Option für dich.