C-array-Vergleich
Ist der defacto-Methode für den Vergleich von arrays (in C) zu verwenden memcmp
aus string.h
?
Ich soll zum vergleichen von arrays von ints und doubles in meine unit-tests
Ich bin nicht sicher, ob so etwas wie:
double a[] = {1.0, 2.0, 3.0};
double b[] = {1.0, 2.0, 3.0};
size_t n = 3;
if (! memcmp(a, b, n * sizeof(double)))
/* arrays equal */
oder schreiben Sie eine maßgeschneiderte is_array_equal(a, b, n)
Typ Funktion?
Ich denke du meinst memcmp. memset überschreiben würde das erste array.
IIRC
ja, memcmp, dass ist das, was ich meinte - das ist als gute Praxis zu empfehlen?
hängt davon ab, was Sie wollen.
IIRC
memset
wird sich ändern (set) Werte in das array so, dass nicht nützlich nur für Vergleich - arrays.ja, memcmp, dass ist das, was ich meinte - das ist als gute Praxis zu empfehlen?
hängt davon ab, was Sie wollen.
memcmp
vergleicht byte-für-byte, das kann nicht sein, was du willst (insb. mit floating-point-Werten).InformationsquelleAutor bph | 2011-12-06
Du musst angemeldet sein, um einen Kommentar abzugeben.
memcmp
tun würde, ein genaue Vergleich, das ist selten eine gute Idee für Schwimmer, und würde nicht die Regel zu Folgen, dass NaN != NaN. Für das Sortieren, das ist in Ordnung, aber für andere Zwecke, die Sie vielleicht zu tun, einen ungefähren Vergleich wie:was ist der bool-Datentyp? ist das nicht ein C++ Ding?
seit C99
bool
ist Teil von C. Es ist in<stdbool.h>
und kommt mit Makrostrue
undfalse
. Wenn Sie auf MSVC, können Sie nicht habenstdbool.h
da, der compiler unterstützt nur C89.mit gcc 4.6.1 - es scheint zu funktionieren OK, gute Sachen
Sie sollten es ändern in
if(!((fabs(x[i] - y[i]) <= eps))
, so können Sie behandeln eineNaN
. In Ihrem code, ein NaN-Wert wird nie wieder einfalse
InformationsquelleAutor Fred Foo
Ersetzen
memset
mitmemcmp
im code, und es funktioniert.In deinem Fall (wie die Größe der beiden arrays arrays sind identisch und bekannt während der Kompilierung) können Sie selbst tun:
InformationsquelleAutor Patrick B.
Mit
memcmp
ist grundsätzlich keine gute Idee. Beginnen wir mit den immer komplexer und arbeiten von dort herunter.Obwohl Sie erwähnt
int
unddouble
, möchte ich zunächst konzentrieren Sie sich aufmemcmp
als eine Allgemeine Lösung, wie zum vergleichen von arrays vom Typ:Das Hauptproblem dort ist, dass Implementierungen sind frei, hinzufügen Polsterung an den Strukturen an den Standorten 1 und 2, so dass ein Vergleich Byte für Byte untersucht, die potenziell falsch, obwohl die wichtigen bits passen perfekt.
Nun bis zu verdoppelt. Man könnte denken, dies sei besser, da es keine Polsterung gibt. Es gibt jedoch noch andere Probleme.
Die erste ist die Behandlung der
NaN
Werte. IEEE754 geht aus dem Weg, um sicherzustellen, dassNaN
ist nicht gleich zu jedem anderen Wert, inklusive sich selbst. Zum Beispiel der code:Ausgabe
illustriert den Unterschied.
Die zweite ist die Behandlung von plus-und minus-null. Diese sollten als gleich angesehen, für die Zwecke des Vergleichs, sondern, wie die bit-Muster sind unterschiedlich,
memcmp
werden sagen, Sie sind anders.Änderung der Deklaration/Initialisierung von
d1
undd2
in dem obigen code:wird, machen dies deutlich.
So, wenn Strukturen und Doppelzimmer sind problematisch, sicherlich ganze zahlen sind okay. Nachdem alle, Sie sind immer zwei die sich ergänzen, ja?
Nein, eigentlich sind Sie es nicht. ISO Mandate eines von drei Kodierungsverfahren für Ganzzahlen mit Vorzeichen und die zwei anderen (diejenigen, die' ergänzt und sign/magnitude) leiden unter einem ähnlichen problem als verdoppelt, die Tatsache, dass beide plus-und minus-null existiert.
So, während Sie sollten möglicherweise werden als gleich angesehen, wieder die bit-Muster sind unterschiedlich.
Sogar für unsigned ganze zahlen, haben Sie ein problem (es ist auch ein problem für vorzeichenbehaftete Werte). ISO-Staaten, dass diese zusagen Wert haben können bits and padding bits, und dass die Werte der padding-bits sind nicht spezifiziert.
So, auch für das, was scheinen kann, im einfachsten Fall
memcmp
kann eine schlechte Idee sein.InformationsquelleAutor paxdiablo
Die Funktion, die Sie suchen, ist
memcmp
, nichtmemset
. Finden Sie die Antworten auf diese Frage, warum es vielleicht nicht eine gute Idee, ummemcmp
ein array von Double-obwohl.InformationsquelleAutor Anthony
memcmp vergleicht zwei Speicherblöcke für die Anzahl der vorgegebenen Größe
memset verwendet wird, initialisieren Sie den Puffer mit einem Wert für die Größe gegeben
Puffer verglichen werden kann, ohne Verwendung von memcmp in folgender Weise. dasselbe kann geändert werden, für die unterschiedliche Datentypen.
InformationsquelleAutor codestriker