array sortieren

bisher steht es genau so da wie oben gepostet

wenn ich es an die Stelle schreibe wo es sortiert werden soll, dann sieht der Code so aus wieder der lange auf der Vorseite gepostete und dann:

Code:
 comp_3(const void *v1, const void *v2);
         qsort(runoff_list,100, sizeof(runoff_list[0]),comp_3);

oder
Code:
 qsort(runoff_list,100, sizeof(runoff_list[0]),comp_3);

beides zieht ne menge fehlermeldungen nach sich...
 
bisher steht es genau so da wie oben gepostet

wenn ich es an die Stelle schreibe wo es sortiert werden soll, dann sieht der Code so aus wieder der lange auf der Vorseite gepostete und dann:
Du hast soviel Code gepostet, das ich nicht weiß wovon du redest und eigentlich hab ich auch keine Lust rumzuraten was du da gemacht haben könntest.
Code:
 qsort(runoff_list,100, sizeof(runoff_list[0]),comp_3);

beides zieht ne menge fehlermeldungen nach sich...
Aha, und die Fehlermeldungen sollen wir auch erraten, oder wie?!

Gruß
 
naja, ich wüsste jetzt nicht wie ich den code noch kürzen soll, dass er logisch erscheint

ich kann's höchstens beschreiben
ich habe eine funktion, in der unter anderem der gepostete ausschnitt passiert und dort erstelle ich ein array wie im ersten post beschrieben. anschließend möchte ich dieses array (runoff_list [100][3]) nach spalte 0 sortieren.

die fehlermeldungen sind ewig viele. bis ich die abgeschrieben hab bin ich schwarz geworden.

naja, ich werd einfach noch etwas googeln und in meinem buch lesen. irgendwie bekomm ich's schon hin.

danke jedenfalls für deine hilfe bis hierhin
 
naja, ich wüsste jetzt nicht wie ich den code noch kürzen soll, dass er logisch erscheint
Mach ein Minimalbeispiel.
ich kann's höchstens beschreiben
Nein, beschreiben ist ganz, ganz falsch. Da kannst du auch gleich die Farbe grün beschreiben.
ich habe eine funktion, in der unter anderem der gepostete ausschnitt passiert und dort erstelle ich ein array wie im ersten post beschrieben. anschließend möchte ich dieses array (runoff_list [100][3]) nach spalte 0 sortieren.
Siehst du. Deine Beschreibung nützt überhaupt nichts. Ohne Glaskugel kann dir doch niemand sagen was du falsch machst?! :confused:
die fehlermeldungen sind ewig viele. bis ich die abgeschrieben hab bin ich schwarz geworden.
Sowas schreibt man auch nicht ab, sondern kopiert es. Für solche stupiden Aufgaben ist der Rechner schließlich da.

Gruß

PS: Bitte achte auf die Netiquette, Punkt 15. Danke!
 
sorry falls das unhöflich rüberkam, war nicht so gemeint.

ich war mir nicht darüber im klaren das copy paste bei den fehlermeldungen funktioniert *schäm*

ok, ich versuch es mit einem ausschnitt:

Code:
void TForm1::calculate_RunonCells()
{
//10x10 Grid durchgehen
for (int i=0; i<10; i++)
          for (int j=0; j<10; j++)
            {
              //Die 8 umgebenden Zellen jeder Zelle durchgehen
              for (int k=max(0,i-1); k<=min(i+1,10-1); k++)
                for (int l=max(0,j-1); l<=min(j+1,10-1); l++)
                {
                  if (((runoffdirection[k][l]-runoffdirection[k][l]%ysize)/ysize == i) && (runoffdirection[k][l]%ysize == j))
                  //wenn die angeschaute der umgebenden Zellen in die angeschaute [i][j] Zelle führt
                  {
                     surroundFlow[i][j]++;
                     //dann wird dieser Wert aufsummiert
                  }

                }

                     helpFlow = surroundFlow[i][j];
                     //Den an Variable übergeben

                     runoff_list [position][0] = helpFlow;
                     //Den Wert in die erste Spalte des Arrays eintragen (0 wenn keine Zelle etwas einträgt)

                     runoff_list [position][1] = i;
                     //i-Position in die zweite Spalte

                     runoff_list [position][2] = j;
                     //j-Position in die dritte Spalte

                     position++;
                     //Position im Array immer eins weiter gehen (von 0 bis 99) -> so viele Reihen wie das Grid Zellen hat
            }

}

Die Ausgabe ist mein Array runoff_list[100][3]
mit den Werten {helpFlow i j}
und das soll nach helpFlow sortiert werden

Sortieren möchte ich sofort nachdem ich das Array erstellt habe, die Formel füge ich also vor der letzten geschweiften Klammer am Ende der Funktion ein


Die Fehlermeldungen sind
[C++ Fehler] LargeScale_Unit.cpp(157): E2188 Ausdruckssyntax
[C++ Fehler] LargeScale_Unit.cpp(158): E2034 Konvertierung von 'int (* (_closure )(const void *,const void *))(const void *,const void *)' nach 'int (*)(const void *,const void *)' nicht möglich
[C++ Fehler] LargeScale_Unit.cpp(158): E2342 Keine Übereinstimmung des Typs beim Parameter '__fcmp' ('int (*)(const void *,const void *)' erwartet, 'void' erhalten)

wenn ich es so schreibe:
Code:
         comp_3(const void *v1, const void *v2);
         qsort(runoff_list,100, sizeof(runoff_list[0]),comp_3);


und
[C++ Fehler] LargeScale_Unit.cpp(158): E2034 Konvertierung von 'int (* (_closure )(const void *,const void *))(const void *,const void *)' nach 'int (*)(const void *,const void *)' nicht möglich
[C++ Fehler] LargeScale_Unit.cpp(158): E2342 Keine Übereinstimmung des Typs beim Parameter '__fcmp' ('int (*)(const void *,const void *)' erwartet, 'void' erhalten)

bei
Code:
qsort(runoff_list,100, sizeof(runoff_list[0]),comp_3);


und
[C++ Fehler] LargeScale_Unit.cpp(228): E2188 Ausdruckssyntax

bei
Code:
qsort(runoff_list,100, sizeof(runoff_list[0]),comp_3(const void *v1, const void *v2));


Und wenn du keinen Bock hast das alles zu lesen kann ich das absolut verstehen....
 
sorry falls das unhöflich rüberkam, war nicht so gemeint.

ich war mir nicht darüber im klaren das copy paste bei den fehlermeldungen funktioniert *schäm*
Bitte achte mal wieder auf die Groß-/Kleinschreibung. Siehe Netiquette Punkt 15.
Die Ausgabe ist mein Array runoff_list[100][3]
mit den Werten {helpFlow i j}
und das soll nach helpFlow sortiert werden

Sortieren möchte ich sofort nachdem ich das Array erstellt habe, die Formel füge ich also vor der letzten geschweiften Klammer am Ende der Funktion ein
Und da beschreibst du schon wieder was du machst. Ich kann mir zwar einigermaßen etwas drunter vorstellen, aber ich weiß ja auch wie es aussehen müßte. Jetzt weiß ich wieder nicht was du konkret gemacht hast... Das kann doch nicht so schwierig sein, oder doch?

Warum machst du nicht einfach ein Minimalbeispiel (-programm)? Dabei merkst du entweder selbst warum es nicht funktioniert oder jemand kann es dir mit einem Blick sagen.
Die Fehlermeldungen sind
[C++ Fehler] LargeScale_Unit.cpp(157): E2188 Ausdruckssyntax
[C++ Fehler] LargeScale_Unit.cpp(158): E2034 Konvertierung von 'int (* (_closure )(const void *,const void *))(const void *,const void *)' nach 'int (*)(const void *,const void *)' nicht möglich
[C++ Fehler] LargeScale_Unit.cpp(158): E2342 Keine Übereinstimmung des Typs beim Parameter '__fcmp' ('int (*)(const void *,const void *)' erwartet, 'void' erhalten)
Du hast wohl vergessen zu erwähnen das du C++ verwendest. Erstens werden C-Standard Headerdateien ohne Endung und mit dem Präfix "c" eingebunden (also statt <stdlib.h> muss es <cstdlib> lauten usw.).

Zweitens würde man in C++ eher den std::sort Algorithmus verwenden als qsort. Aber qsort geht natürlich ebenfalls.
Code:
qsort(runoff_list,100, sizeof(runoff_list[0]),comp_3);
Dieser Code sollte funktionieren. Die anderen sind falsch.


Du hast die Funktion aber bereits deklariert bevor du sie aufrufst? Und du hast doch wohl die Funktion nicht als nicht-statische Methode deiner Klasse definiert?

Wieder Fragen die eigentlich ein kurzer Blick in den Code beantworten würde. Aber diese relevanten Codestellen hast du irgendwie vergessen.
Und wenn du keinen Bock hast das alles zu lesen kann ich das absolut verstehen....
Um das Lesen geht es nicht. Das kann ich schon recht schnell überblicken... es ist nur das Fehlende, was du wieder nicht geschrieben hast. Da habe ich bald keine Lust mehr zu raten was du da gemacht haben könntest.

Gruß

\edit: So wie es aussieht hast du tatsächlich die Funktion als Methode deiner Klasse definiert. Dann mußt du die Funktion als static deklarieren. Dann sollte es gehen. Und nächstes Mal bitte gleich drüberschreiben, das es sich um C++ handelt! Danke.
 
Zuletzt bearbeitet:
Ich könnt dich knutschen
Danke

Tut mir wirklich leid, dass ich dir so viel Mühe gemacht habe.
Ich hatte übersehen, dass es hier auch im C geht.

Der ganze Weg um an meine benötigen Zahlen zu kommen ist si kompliziert, da wüsst ich gar nicht, wie ich da was einfaches schreiben könnte, das trotzdem in etwa ausgibt was ich meine.

Aber jetzt passt es ja.

Tausend Dank, wirklich!!


Edit: Ein Frage hab ich noch, aber du brauchst sie nur beantworten, wenn du den Nerv dazu hast ;)

Was genau tut diese Funktion? Woher weiß sie in welcher Reihenfolge sie welche Spalte sortieren soll?
Du siehst, ich hab es mehr mit Beschreibungen :)
 
Zuletzt bearbeitet:
Einen wunderschönen guten Morgen,

die Funktion qsort () sortiert Daten nach aufsteigender Reinfolge. Dabei kann die Funktion unterschiedliche "Größe" der Daten anhand der von dir selbst definierten und als Funktionszeiger übermittelten Vergleichsfunktion (bei dir comp_3) erkennen. Es werden deine gesamten Daten durchgegangen und jeweils für ein Paar durch Aufruf deiner Funktion comp_3 entschieden, welches Datum kleiner (größer) ist.

Wie die Funktion intern genau funktioniert, sollte in in einem guten Grundlagenbuch für (Achtung!) C erklärt sein.

Gruss
Mizi
 
Zuletzt bearbeitet:
Dankeschön!

Darf ich noch was fragen? Ich komm mir vor wie der größte DAU, aber ich bin wirklich blutiger Programmieranfänger:

Ich verstehe nicht ganz wie comp3 funktioniert, weil ich die Sternchen noch nicht kenne

Code:
int comp_3(const void *v1, const void *v2) {
  int* a = (int*)v1;
  int* b = (int*)v2;
 
  if (a[0] != b[0]) return a[0] - b[0];
  else return a[1] - b[1];
}

Was ich verstehe ist, dass er erst nach Spalte 0 und danach nach Spalte 1 sortiert, woher er weiß was a und b sind bekomm ich aber nicht raus. Und wie mittels "a[0] - b[0]" sortiert wird auch nicht. Der Debugger ist mir da leider auch keine große Hilfe. Was natürlich auch wieder an mir liegen kann...
 

Neue Beiträge

Zurück