Strukturen vergleichen



  • Hallo liebe Gemeinde.Ich schlage mich jetzt schon ein paar Tage mit einem kleinen Problem rum.
    Ich habe folgende Strukturen:

    struct MESSUNG_SET{
    char PARA[3];
    }
    
    struct MESSUNG_AKTIVE{
    char PARA[3];
    }
    

    Diese werden jeweils in einem Array gespeichert.
    Nun möchte ich den Inhalt der beiden Strukturen vergleichen.
    Habe es so versucht:

    if (Set[Count].PARA == Aktive[Count].PARA)
    {
    Messung in Ordnung!
    }
    

    Leider geht dies nicht.Vorher hatte ich es mit strstr versucht.Hier hatte ich ein Ergebniss wenn nur ein Teil der gespeicherten Stings übereinstimmten.Es sollen aber alle Zeichen Übereinstimmen.
    Kann mir jemand sagen wie ich dies hin bekomme? 😕 😕



  • Arrays werden immer als Zeiger auf ihr erstes Element ausgewertet, du vergleichst also 2 Zeiger.

    Schau dir mal die Funktion memcmp an.



  • Janjan schrieb:

    Schau dir mal die Funktion memcmp an.

    Damit keine Missverständnisse aufkommen: Memcmp ist für den Vergleich von Strukturen im Allgemeinen ungeeignet. Er kann damit lediglich den Array PARA vergleichen - aber nicht die gesamt Struktur.

    Arrays werden immer als Zeiger auf ihr erstes Element ausgewertet,

    Nein, nicht "immer", höchstens "meistens" oder "fast immer",...



  • ☠c-hasser&# schrieb:

    ...Damit keine Missverständnisse aufkommen: Memcmp ist für den Vergleich von Strukturen im Allgemeinen ungeeignet...

    Nein, nicht "immer", höchstens "meistens" oder "fast immer" :p

    also zwei strukturen des gleichen typs lassen sich super vergleichen, bei unterschiedlichen wirds schon schwerer, evtl. hat man aber auch nen design fehler gemacht...

    lg lolo



  • noobLolo schrieb:

    ☠c-hasser&# schrieb:

    ...Damit keine Missverständnisse aufkommen: Memcmp ist für den Vergleich von Strukturen im Allgemeinen ungeeignet...

    Nein, nicht "immer", höchstens "meistens" oder "fast immer" :p

    also zwei strukturen des gleichen typs lassen sich super vergleichen

    Nein, das funktioniert eben nicht; auch nicht bei Strukturen des gleichen Typs - wegen der Paddingbits.



  • ☠c-hasser&# schrieb:

    noobLolo schrieb:

    ☠c-hasser&# schrieb:

    ...Damit keine Missverständnisse aufkommen: Memcmp ist für den Vergleich von Strukturen im Allgemeinen ungeeignet...

    Nein, nicht "immer", höchstens "meistens" oder "fast immer" :p

    also zwei strukturen des gleichen typs lassen sich super vergleichen

    Nein, das funktioniert eben nicht; auch nicht bei Strukturen des gleichen Typs - wegen der Paddingbits.

    ja an die dacht ich auch schon, könnte es nicht sein das die genullt werden oder so? werd mal versuchen was im standard zu finden... das wird wieder ne odyssee...
    evtl. hat da ja jmd. einen anhaltspunkt wo man suchen sollte?

    lg lolo



  • 6.2.6.1.6 schrieb:

    When a value is stored in an object of structure or union type, including in a member
    object, the bytes of the object representation that correspond to any padding bytes take
    unspecified values.

    okay ich gebe nach 😉

    lg lolo



  • Falls irgendjemand diesen Post wie ich über google o.Ä. findet. Die richtige Lösung wurde noch nicht gepostet.

    In C++ ist die korrekte Vorgehensweise ein Compare Operator*:
    http://www.learncpp.com/cpp-tutorial/94-overloading-the-comparison-operators/

    * in C++ ist eine Struktur nichts weiter als eine Klasse mit public membern.



  • Das hier ist aber das C Unterforum.



  • Achso...

    ja dann gibt es keine "richtige" lösung.

    Am besten aber so (da am allgemeinsten):
    ***Zensiert durch SeppJ. So nämlich am besten nicht***

    Bei memcmp(a, b, sizeof()) muss man sonst immer achten das die Struktur packed ist.



  • Doch, es gibt die richtige Lösung: Jeder Member wird einzeln verglichen.

    Zu dem LinK: Scheiss Beispiel.
    Postleitzahlen sind keine Ganzzahlen.



  • Wenn du Objekte miteinander vergleichst, musst du erstmal definieren, was Gleichheit bedeutet und wie diese zu ermitteln ist.

    Z.b. zwei Äpfel. Wann sind 2 Äpfel gleich?

    Antwort: kommt auf die Parameter an, die man vergleicht.

    Wann ist ein Apfel und eine Birne gleich?

    Antwort: kommt auf die Parameter an, die man vergleicht. Generell kann man sagen, nein, aber wenn ich als Vergleichsmerkmal nutze, dass zwei Objekt genau dann gleich sein sollen, wenn sie Früchte sind, dann ist Apfel und eine Birne gleich.

    Lange Rede kurzer Sinn: Bei abstrakten Strukturen wie deine, musst DU zunächst definieren, WAS man vergleicht und welche Vergleichsmerkmale jeweils verwendet werden. Deswegen macht es eine bit-für-bit Gleichheit keinen Sinn.



  • supertux schrieb:

    Bei abstrakten Strukturen wie deine, musst DU zunächst definieren, WAS man vergleicht und welche Vergleichsmerkmale jeweils verwendet werden. Deswegen macht es eine bit-für-bit Gleichheit keinen Sinn.

    Cool:
    Erst sagst Du, was Gleichheit ist, bestimmt allein der Autor, und im nächsten Satz bestimmst plötzlich Du, was (keinen) Sinn macht ... 👎



  • In der Tat habe ich mich nicht besonders gut ausgedruckt. Klar ist meine Aussage, der Autor muss definieren, was "gleich" ist und wie man es testet.

    Ich wollte aber sagen, dass (hier im Falle von "wie") bitweises Vergleichen bei Strukturen nicht OK sind, z.B. wegen padding bits wie erwähnt wurde.



  • Konnte man nicht das Padding ausschalten und/oder per Hand erledigen? Automatismen sind ja nicht immer wünschenswert.


  • Mod

    Autowech schrieb:

    Konnte man nicht das Padding ausschalten und/oder per Hand erledigen? Automatismen sind ja nicht immer wünschenswert.

    Könnte man, aber wieso sollte man das wollen? Bloß um beim Vergleich faul sein zu dürfen? Das Padding ist ja nicht bloß da, um den Programmierer zu ärgern.



  • SeppJ schrieb:

    Autowech schrieb:

    Konnte man nicht das Padding ausschalten und/oder per Hand erledigen? Automatismen sind ja nicht immer wünschenswert.

    Könnte man, aber wieso sollte man das wollen? Bloß um beim Vergleich faul sein zu dürfen? Das Padding ist ja nicht bloß da, um den Programmierer zu ärgern.

    Umsonst wird man kaum eine Option in den Compiler eingebaut haben um das Padding zu deaktivieren.


  • Mod

    Autowech schrieb:

    SeppJ schrieb:

    Autowech schrieb:

    Konnte man nicht das Padding ausschalten und/oder per Hand erledigen? Automatismen sind ja nicht immer wünschenswert.

    Könnte man, aber wieso sollte man das wollen? Bloß um beim Vergleich faul sein zu dürfen? Das Padding ist ja nicht bloß da, um den Programmierer zu ärgern.

    Umsonst wird man kaum eine Option in den Compiler eingebaut haben um das Padding zu deaktivieren.

    Aber der Grund ist nicht, Vergleiche einfacher zu machen.



  • SeppJ schrieb:

    Autowech schrieb:

    SeppJ schrieb:

    Autowech schrieb:

    Konnte man nicht das Padding ausschalten und/oder per Hand erledigen? Automatismen sind ja nicht immer wünschenswert.

    Könnte man, aber wieso sollte man das wollen? Bloß um beim Vergleich faul sein zu dürfen? Das Padding ist ja nicht bloß da, um den Programmierer zu ärgern.

    Umsonst wird man kaum eine Option in den Compiler eingebaut haben um das Padding zu deaktivieren.

    Aber der Grund ist nicht, Vergleiche einfacher zu machen.

    Aber würde das fehlende Padding nicht den Vergleich von Strukturen mit memcmp auch schneller machen?



  • Jo, und alles andere, was mit den Strukturen, bzw. Zugriffen auf die Member zu tun hat, langsamer ...


Anmelden zum Antworten