Struct: Elemente "verschieben"
-
Hallo,
ich habe folgenden Code:
struct my_struct { int val1; int val2; int val3; }; void my_func(int val, int *adr) { //code } int main(int argc, char* argv[]) { my_struct i; my_func(1,&(i.val2)); return 0; }
Jetzt würde ich gerne die Adressen der Elemente des structs je um einen bestimmten Offset verschieben. Die struct sollte also vom Prinzip her so aussehen:
struct my_struct { int val1; int offs1; int val2; int offs2; int val3; };
Die Elemente offs dienen dabei nur dem Verschieben der anderen Elemente.
Gibt es einen einfachen Weg, dies zu realisieren, ohne die struct ändern zu müssen (Dabei geht es mir mehr um die "Arbeit" diese per Hand zu ändern, die struct selbst darf sich ruhig ändern.)?
Mir würde jetzt nur einfallen, die übergebene Adresse in der my_func zu shiften. Dies würde aber bedeuten, dass ich alle Funktionen, die diese geänderte struct nutzen sollen, anpassen müsste.
Jemand eine andere Idee?
-
Zwischen den val1, 2 und 3 sollen eine bestimmte Anzahl Bytes liegen? Dann mach doch ein Array mit ein paar Leerstellen.
-
Ok, meine Beispiel struct war etwas schlecht gewählt. Die Elemente sind natürlich nicht alle vom gleichen Typ, daher ist ein Array keine Option. Oder meintest du etwas anderes?
-
Die Offsets sind doch gut. Du brauchst bloß eine Stelle im Programm ändern (außer du benutzt Elementinitialisierungslisten) und schon hast du, was du möchtest. Oder verstehe ich dich gerade nicht richtig?
-
Du meinst die Offsets direkt in der struct, also das:?
struct my_struct { int val1; int offs1; int val2; int offs2; int val3; };
Das würde ich gerne vermeiden, sofern es eine andere, einfache Möglichkeit gibt, da ich die Struktur evtl. später nochmal ohne die Offsets benötige.
Falls es natürlich keine weitere, relativ einfache Lösung gibt, würde ich es dann mit den Offsets machen.
-
Damit hast du eine alte Struktur ohne Abstände sowie die neue mit:
#include <iostream> using namespace std; struct s2 { int VALUE1; char value1[5]; //Abstand in Bytes int VALUE2; char value2[2]; //-//- }; struct s1 //ohne Abstaende { int VALUE1; int VALUE2; }; s2 create_s2(s1 alt) { s2 neu; neu.VALUE1=alt.VALUE1; neu.VALUE2=alt.VALUE2; return neu; } int main() { s1 alt; alt.VALUE1=1; alt.VALUE2=2; s2 neu=create_s2(alt); cout << neu.VALUE1 << neu.VALUE2; return 0; }
Edit: C-Fans können sich cout durch scanf ersetzt denken.
-
Was willst du überhaupt erreichen? Bei solch technischen Spezialfragen kommt mir wieder der Verdacht, dass hier eine komplizierte Lösung für ein an sich einfaches Problem gebaut wird.