Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » 2dim. Array sortieren

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
27.11.2007, 19:03 Uhr
~gast
Gast


Hallo Leute..ich versuche vergebens ein 2dim. Array zu sortieren.

Also ich habe einen datentyp der folgendermaßen aufgebaut ist:

C++:
struct bildpunkttyp
{
       int r,g,b;
       unsigned long int i,position;
};
struct bildpunkttyp bildpunkt[501][501];



Es handelt sich um jeweils einen Pixel, der dann auch genau identifiziert werden kann und jeweils eine Farbinformation enthält(rgb).
Diese Punkte will ich nach i sortieren(das sind zahlen von 1-endlich), die reihenfolge der punkte soll dann irgendwie in der position gespeichert werden.

Also wenn beispielsweise der obere linke punkt ([0][0]) den kleinsten i wert von allen hat, sollte er die position 1 haben. also bildpunkt[0][0].position = 1.

Meine bisherigen versuche mit quicksort oder ganz einfach alle vergleichen bringen mich nicht weiter. Kann mir jemand einen guten Ansatz sagen?
Danke euch im Vorraus.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
27.11.2007, 19:32 Uhr
0xdeadbeef
Gott
(Operator)


Sortier ein Zeigerarray, das wär meine erste Idee. Also

C++:
#include <stdlib.h>

int compare_bildpunkttyp(void *p, void *q) {
  struct bildpunkttyp **pkt1 = p, **pkt2 = q;

  return (*pkt1)->i - (*pkt2)->i;
}

struct bildpunkttyp bildpunkt[501][501];
struct bildpunkttyp *bp_sort[501 * 501];

for(int i = 0; i < 501; ++i) {
  for(int j = 0; j < 501; ++j) {
    bp_sort[i * 501 + j] = &bildpunkt[i][j];
  }
}

qsort(bp_sort, 501 * 501, sizeof(struct bildpunkttyp), compare_bildpunkttyp);

for(int i = 0; i < 501 * 501; ++i) {
  bp_sort[i]->position = i + 1;
}


--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra

Dieser Post wurde am 27.11.2007 um 19:33 Uhr von 0xdeadbeef editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
27.11.2007, 19:59 Uhr
~gast
Gast


Ist ja unglaublich was dir gleich einfällt. Ich werde mich erstmal damit^^ beschäftigen müssen, aber ich denke das schaffe ich. Wenn ich noch fragen hab, meld ich mich.
Danke!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
28.11.2007, 14:17 Uhr
~gast
Gast


Hi beefy..
Also ich möchte kurz ein paar Fragen stellen:

1.Nur im sicher zu gehen wie der Grundgedanke lautet:
Ich erstelle mir ein Zeigerarray. Die Zeiger des Arrays zeigen auf meine zusortierenden daten(in meinem fall i).
Das Zeigerarray lasse ich nun sortieren, also je nach inhalt der Variablen, auf die die Zeiger zeigen.

2. Was ist das: -> für ein Operator?

3. Wozu brauche ich zeigerzeiger?
Danke, ich denke aber die grundidee hab ich langsam verstanden..denn mit zeigern hatte ich noch nicht soviel am hut.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
28.11.2007, 15:13 Uhr
Guybrush Threepwood
Gefürchteter Pirat
(Operator)


Willst du überhaupt dein Array sortieren?
Für mich hört sich das eher so an als willst du nur das position Element entsprechend durchnumerieren...
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
28.11.2007, 15:27 Uhr
~gast
Gast


Also ich möchte, dass am ende jeder bildpunkt[][] eine "position" oder nummer hat, je nach größe von bildpunkt[][].i .
Ich denke, dass der oben genannte Ansatz echt clever ist, aber im Moment kommt bei mir immer ein Fehler beim Ausführen des Programms, "written konnnte nicht...".
Es liegt anscheinend an der vergleichsfunktion...hm ma schaun ob ich den fehler finde.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
28.11.2007, 15:47 Uhr
0xdeadbeef
Gott
(Operator)


1. Richtig

2. x->y ist das selbe wie (*x).y, nur siehts schöner aus.

3. Die qsort-Funktion übergibt der Vergleichsfunktion Zeiger auf die zu vergleichenden Elemente - in diesem Fall sind das Zeiger auf struct bildpunkttyp - also kriegt die Funktion Zeiger auf Zeiger, und muss die dementsprechend behandeln.

Ceterum censeo bin ich der Ansicht, dass dieser Thread eigentlich ins ANSI-Forum gehört.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra

Dieser Post wurde am 28.11.2007 um 15:49 Uhr von 0xdeadbeef editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
28.11.2007, 17:06 Uhr
~gast
Gast


Also ich hab es jettz zum laufen gebraucht. der Fehler ware folgender: es muss bei der Größe anstatt sizeof(struct bildpunkttyp) sizeof(unsigned long int), das ist der datentyp von i, stehen.
Jedenfalls geht es anders nicht bei mir.
danke für die geniale idee, da wär ich nie drauf gekommen.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
28.11.2007, 17:53 Uhr
0xdeadbeef
Gott
(Operator)


Ach ja, ich Horst, sind ja jetzt Zeiger. Benutz da aber nicht sizeof(unsigned long), sondern

C++:
qsort(bp_sort, 501 * 501, sizeof(struct bildpunkttyp *), compare_bildpunkttyp);


es ist nicht garantiert, dass unsigned long so lang ist wie ein Zeiger; das kann dir also sonst prinzipiell um die Ohren fliegen.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: