Gleichheit von zwei Structs?
-
Vertexwahn schrieb:
der Compilerhersteller wird doch wissen welches Bytepadding er verwendet
- das ist technisch lösbar
Das weisst du ja sogar als Programmierer.
Wenn man es richtig anstelllt, kann man structs durchaus mit memcmp() vergleichen.
-
das blöde ist ja, dass die padding bits theoretisch zufälligen inhalt haben können
es gibt aber sprachmittel, mit welchen man den Abstand zwischen zwei Datenelementen in einer Struktur ermitteln kann - warum sollte man den padding bits auch vergleichen - macht doch keinen sinn
-
Vertexwahn schrieb:
es gibt aber sprachmittel, mit welchen man den Abstand zwischen zwei Datenelementen in einer Struktur ermitteln kann
differenz der adressen? was hilft dir das?
Vertexwahn schrieb:
- warum sollte man den padding bits auch vergleichen - macht doch keinen sinn
na wenn man 'memcmp' benutzt scheitert das ja an den padding bits. das geht nur gut, wenn keine padding bits da sind (#pragma pack(1) o.ä.)
-
net schrieb:
na wenn man 'memcmp' benutzt scheitert das ja an den padding bits. das geht nur gut, wenn keine padding bits da sind (#pragma pack(1) o.ä.)
Oder wenn man konsequent den Speicher der Strukturen vor der Benutzung auf einen definierten Wert setzt (ist ja egal welcher). Also immer schön callocen
-
TactX schrieb:
net schrieb:
na wenn man 'memcmp' benutzt scheitert das ja an den padding bits. das geht nur gut, wenn keine padding bits da sind (#pragma pack(1) o.ä.)
Oder wenn man konsequent den Speicher der Strukturen vor der Benutzung auf einen definierten Wert setzt (ist ja egal welcher). Also immer schön callocen
benutzt du nur heap-variablen?
-
Nö. aber dazu gibt's memset()
-
TactX schrieb:
Nö. aber dazu gibt's memset()
cool. das isses. vor dem füllen der structs erstmal 'memset(&x, 0, sizeof(x))' und dann zum vergleichen 'memcpy()'. vertex: deine frage ist beantwortet
-
memcpy()?
Oder war das der Gag zum Smilie den ich nicht geblickt hab?
-
TactX schrieb:
memcpy()?
Oder war das der Gag zum Smilie den ich nicht geblickt hab?
kein gag. ich meinte 'memcmp()' hab mich verschrieben.
-
net schrieb:
TactX schrieb:
memcpy()?
Oder war das der Gag zum Smilie den ich nicht geblickt hab?
kein gag. ich meinte 'memcmp()' hab mich verschrieben.
ich glaube, memcmp ist das auch nicht ganz toll, wenn man folgendes hat:
struct wasweissich { char* str1; int c; }
denn sinnvoll wäre, wenn str1 von dem einem Struct das selbe Strings hätten, wie str1 von dem anderen struct, sprich bei
struct wasweissich a; struct wasweissich b; /* mache etwas mit a */ /* mache etwas mit b */ copmarestructs_with_memcpm(a,b);
da könnte es sein, dass a.str1 != b.str1 aber strcmp(a.str1,b.str1)==0, mit memcmp würde man aber FALSE haben, weil a.str1 != b.str1
-
Das ist klar, solche Fälle muss man dann halt speziell behandeln.
-
klar, kommt drauf an, wie man 'gleichheit' von structs definiert. ich würde sagen man sollte die structs als 'flach' ansehen, wenn sie byte-aligned sind bzw. vor der initialisierung mit memset() geplättet wurden und dann memcmp() klappt, sind sie auf jeden fall gleich. alles andere führt zu weit, dafür bräuchte man ja sowas wie 'reflection' in java (in c++ schimpft sich das doch 'rtti' nicht?), au weia