Strukturen Vergleichen

Schnelle objektorientierte, kompilierende Programmiersprache.
Benutzeravatar
cloidnerux
Moderator
Beiträge: 3125
Registriert: Fr Sep 26, 2008 4:37 pm
Wohnort: Ram (Gibts wirklich)

Strukturen Vergleichen

Beitrag von cloidnerux » Mi Jan 21, 2009 7:20 pm

Ich habe folgendes Problem:
Ich muss in einer Struktur folgender Form:

Code: Alles auswählen

struct mystruct {
char a[3];
char b[3];
char c[3];
}
Jezt muss ich dort überprüfen ob auf Feld a[1] und a[0] und weiteren gleichzeitig bestimmte Zeichen gesetz sind.
Da mir das zu umständlich ist, habe ich folgendes vor:
Ich speicher in einem Anderen struct selben typs die entsprechnden Zeichen an entsprechender Position und vergleiche dann beide structs.
Also meine Frage: Ist das möglich? und ist es überhaupt sinnvoll? wenn nihct, was ist besser?
THX im vorraus.
Redundanz macht wiederholen unnötig.
quod erat expectandum

Benutzeravatar
Dirty Oerti
Beiträge: 2229
Registriert: Di Jul 08, 2008 5:05 pm
Wohnort: Thurndorf / Würzburg

Re: Strukturen Vergleichen

Beitrag von Dirty Oerti » Mi Jan 21, 2009 7:42 pm

Hm, da gibt es viele Wege zum Ziel.
Im Endeffekt musst du aber den Inhalt vom Struct und damit von allen Arrays etc dadrinnen miteinander vergleichen.

Das kannst du z.B. mit einer Funktion machen.
Ein Beispiel dazu findest du hier:
http://www.hs-augsburg.de/~sandman/c_vo ... 17_004.htm

Du kannst natürlich auch das struct...auf andere Weise vergleichen (auch in einer Funktion):

Code: Alles auswählen

typedef struct _something { ... }Str;
Str eins;
eins->wert=5;
Str zwei;
zwei->wert=5;

char compare (Str* eins, Str* zwei) {
  int size = sizeof(Str);
  char *point1 = (char*) eins;
  char *point2 = (char*) zwei;
  while (size > 0) {
    if ( (*point1) == (*point2) ) {
      return 1;
    }
    size--;
    point1++;
    point2++;
  }
  return 0;
}
So dürfte es eigntl auch gehen.
Du vergleichst praktisch die Speicherplätze, in denen die structs liegen.
Das kommt zwar gleich mit einem Vergleich der einzelnen Variablen im Struct, ist aber leichter/schneller auf andere structs anzupassen.
Garantieren, dass das funktioniert (so wie's oben steht) kann ich dir aber nicht^^
Bei Fragen einfach an daniel[ät]proggen[Punkt]org
Ich helfe gerne! :)
----------
Wenn du ein Licht am Ende des Tunnels siehst, freu dich nicht zu früh! Es könnte ein Zug sein, der auf dich zukommt!
----
It said: "Install Win95 or better ..." So I installed Linux.

Benutzeravatar
cloidnerux
Moderator
Beiträge: 3125
Registriert: Fr Sep 26, 2008 4:37 pm
Wohnort: Ram (Gibts wirklich)

Re: Strukturen Vergleichen

Beitrag von cloidnerux » Mi Jan 21, 2009 7:47 pm

OK, aber ein Direkter Vergleich durch "==" geht nicht?

Oder ich packs in eine klasse und überlade den Operator "==".
Redundanz macht wiederholen unnötig.
quod erat expectandum

Benutzeravatar
Dirty Oerti
Beiträge: 2229
Registriert: Di Jul 08, 2008 5:05 pm
Wohnort: Thurndorf / Würzburg

Re: Strukturen Vergleichen

Beitrag von Dirty Oerti » Mi Jan 21, 2009 7:54 pm

cloidnerux hat geschrieben:OK, aber ein Direkter Vergleich durch "==" geht nicht?

Oder ich packs in eine klasse und überlade den Operator "==".
Ein direkter Vergleich geht glaube ich nicht.
In eine Klasse packen und den Operator überladen kannst du natürlich auch.
Wobei es aufs gleiche rauskommt wie eine Funktion zu schreiben :)
Bei Fragen einfach an daniel[ät]proggen[Punkt]org
Ich helfe gerne! :)
----------
Wenn du ein Licht am Ende des Tunnels siehst, freu dich nicht zu früh! Es könnte ein Zug sein, der auf dich zukommt!
----
It said: "Install Win95 or better ..." So I installed Linux.

Benutzeravatar
cloidnerux
Moderator
Beiträge: 3125
Registriert: Fr Sep 26, 2008 4:37 pm
Wohnort: Ram (Gibts wirklich)

Re: Strukturen Vergleichen

Beitrag von cloidnerux » Mi Jan 21, 2009 8:07 pm

Code: Alles auswählen

 while (size > 0) {
    if ( (*point1) == (*point2) ) {
      return 1;
    }
Würde das return 1 nicht sofort die Schleife killen und somit was verfälschen, denn wenn das erste Element übereinstimmt, aber der Rest nicht, würden sich doch BUG einschleichen?
Redundanz macht wiederholen unnötig.
quod erat expectandum

Benutzeravatar
cloidnerux
Moderator
Beiträge: 3125
Registriert: Fr Sep 26, 2008 4:37 pm
Wohnort: Ram (Gibts wirklich)

Re: Strukturen Vergleichen

Beitrag von cloidnerux » Mi Jan 21, 2009 8:44 pm

Hab jezt in einem Buch was gefunden:
Byteweiser vergleich ist faktisch unmöglich:
Beim erstellen eines Strukts werden alle Elemente nicht zwangsläufig hintereinander gesperichert, sondern es werden Lücken eingebaut.
Wenn man jezt Byteweise vergleich durchführt, kommt das Problem, das man diese Lücken Einließt und die sihc Unterschiedn können => BUG.
Also muss man alle Elemente einzel Überprüfen *g* :x :x :x :x :x :x :x :x
Naja, werd wohl nihct drumrum kommen.
Danke für Hilfe.
Redundanz macht wiederholen unnötig.
quod erat expectandum

Benutzeravatar
Dirty Oerti
Beiträge: 2229
Registriert: Di Jul 08, 2008 5:05 pm
Wohnort: Thurndorf / Würzburg

Re: Strukturen Vergleichen

Beitrag von Dirty Oerti » Mi Jan 21, 2009 8:46 pm

hupps, da lief was falsch :)
Aber die Idee hast du, denke ich.

Code: Alles auswählen

char compare (Str* eins, Str* zwei) {
  int size = sizeof(Str);
  char *point1 = (char*) eins;
  char *point2 = (char*) zwei;
  while (size > 0) {
    if ( (*point1) != (*point2) ) {
      return 0;
    }
    size--;
    point1++;
    point2++;
  }
  return 1;
}
Jetzt aber^^
Bei Fragen einfach an daniel[ät]proggen[Punkt]org
Ich helfe gerne! :)
----------
Wenn du ein Licht am Ende des Tunnels siehst, freu dich nicht zu früh! Es könnte ein Zug sein, der auf dich zukommt!
----
It said: "Install Win95 or better ..." So I installed Linux.

Benutzeravatar
Dirty Oerti
Beiträge: 2229
Registriert: Di Jul 08, 2008 5:05 pm
Wohnort: Thurndorf / Würzburg

Re: Strukturen Vergleichen

Beitrag von Dirty Oerti » Mi Jan 21, 2009 8:48 pm

cloidnerux hat geschrieben:Hab jezt in einem Buch was gefunden:
Byteweiser vergleich ist faktisch unmöglich:
Beim erstellen eines Strukts werden alle Elemente nicht zwangsläufig hintereinander gesperichert, sondern es werden Lücken eingebaut.
Wenn man jezt Byteweise vergleich durchführt, kommt das Problem, das man diese Lücken Einließt und die sihc Unterschiedn können => BUG.
Also muss man alle Elemente einzel Überprüfen *g* :x :x :x :x :x :x :x :x
Naja, werd wohl nihct drumrum kommen.
Danke für Hilfe.
Nicht unbedingt:

Code: Alles auswählen

struct dings {
    unsigned int blub;
    unsigned int katatatat;
    unsigned int prarama;
} __attribute__((packed));
Und schon kannst du es Byteweise vergleichen, solange du darin nicht mit weiteren Pointern/Strukturen arbeitest.
Bei Fragen einfach an daniel[ät]proggen[Punkt]org
Ich helfe gerne! :)
----------
Wenn du ein Licht am Ende des Tunnels siehst, freu dich nicht zu früh! Es könnte ein Zug sein, der auf dich zukommt!
----
It said: "Install Win95 or better ..." So I installed Linux.

Benutzeravatar
cloidnerux
Moderator
Beiträge: 3125
Registriert: Fr Sep 26, 2008 4:37 pm
Wohnort: Ram (Gibts wirklich)

Re: Strukturen Vergleichen

Beitrag von cloidnerux » Mi Jan 21, 2009 9:09 pm

Ja, aber jeder Compiler ahndahbt alles anderst.
Auch wenn du das Attribute sezt, ist keien AGrantie gegeben.
Und PLatformunabhänigkeit ist auhc nihct so ganz gewärleistet.
Naja, hab ne Lösung.
Redundanz macht wiederholen unnötig.
quod erat expectandum

Benutzeravatar
Dirty Oerti
Beiträge: 2229
Registriert: Di Jul 08, 2008 5:05 pm
Wohnort: Thurndorf / Würzburg

Re: Strukturen Vergleichen

Beitrag von Dirty Oerti » Mi Jan 21, 2009 9:19 pm

cloidnerux hat geschrieben:Und PLatformunabhänigkeit ist auhc nihct so ganz gewärleistet.
Wenn du den Code mit dem gleichen Compiler für unterschiedliche Plattformen kompilierst schon :)
Bei Fragen einfach an daniel[ät]proggen[Punkt]org
Ich helfe gerne! :)
----------
Wenn du ein Licht am Ende des Tunnels siehst, freu dich nicht zu früh! Es könnte ein Zug sein, der auf dich zukommt!
----
It said: "Install Win95 or better ..." So I installed Linux.

Antworten