Arrayeinträge sortieren



  • Butterbrot23 schrieb:

    ...cpp(138) : error C2065: 'compare_entry': nichtdeklarierter Bezeichner
    ...cpp(206) : error C2365: "compare_entry": Erneute Definition; vorherige Definition war "Datenvariable".

    Sag einmal... verwendest du einen C++-Compiler? Wenn ja, solltest du eine Etage teifer absteigen. Sind 138 und 206 Zeilennummern?

    Das Beispiel ist gültiges C99, und wenn man die beiden int-Deklarationen aus den for-Schleifen raus nimmt, sollte es auch gültiges C89 sein. GCC und TCC hatten damit keine Probleme.
    🙂

    Nachtrag:
    g++ -pedantic -Wall -Wextra übersetzt das auch problemlos. Hast du sicher nichts an dem Beispiel verändert?



  • Du programmierst in C++?
    Dann nimm doch std::vector<DEINE_STRUKTUR> v und std::sort(v.begin(),v.end(),DeinPrädikat).



  • ja,
    ich benutze C++.
    Ich habe ein Programm gegeben bekommen und mache dort weitere Berechnungen.
    Mir ist hier gesagt worden, dass mein Programm ein C und kein C++ Programm ist.
    Bislang lief es ja auch...
    Najua, wollte eientlich nicht das Programm posten, aber habe ja eigentlich einie Veränderungen gemacht, soass es nicht mehr das Original ist.
    Ich zeige hier meine manin Funktion, desweiteren existieren noch Funktionen für einen Triple Algo, Label Correcting und des ganzen Einlesens, aber daran muss ich ja nicht verändern.
    So sieht mein Kopf mit main Funktion aus.
    habe es auch aus der forSchleife rausgemacht, wie vorgeschlagen.
    Vielleicht seht ihr ja hier etwas...
    Habe es erstmal zielRiRi genannt, um es zu testen, da meine Funktion ziel PiRi etwas anderes berechnet 🙂

    int compare (const void * a, const void * b);
    
    typedef struct 
    { 
      int key,val; 
    } entry;
    
       /* 'array' mit den richtigen Indizes und Werten fuellen */ 
       for (z = 0; z < size; z++) 
       { 
          array[z].key = z; 
          array[z].val = zielRiRi[z]; 
       } 
    
       /* 'array' sortieren */ 
       qsort(array, size, sizeof (entry), compare_entry); 
    
       /* nachsehen, was passiert ist */ 
       for (z = 0; z < size; z++) 
    	   printf("%d war vorher an Platz %d\n", array[z].val, array[z].key);
    
    	return 0;
    
    }
    

    was ich selbst eingefügt habe ist am linken äußersten Rand, und noch die Variablen.
    Würde nur erstmal gern die Ausgabe des Arrays sortiert mit den Positionen von
    int zielRiRi[] = {0,0,0,0,0,32,12,32,14,0,12,40};
    dieses dann auf meine zielPiRi Funktion würde ich selbst versuchen zusammenzubasteln.



  • [quote="Butterbrot23"]ja,
    ich benutze C++.
    Ich habe ein Programm gegeben bekommen und mache dort weitere Berechnungen.
    Mir ist hier gesagt worden, dass mein Programm ein C und kein C++ Programm ist.
    Bislang lief es ja auch...[quote]
    Verstehe. Versuch doch mal, mein letztes Beispiel als eigenes Projekt zu übersetzen, und wirklich nur genau diese 40 Zeilen. Wenn das geht, wissen wir immerhin mehr, und du hast ein halbwegs ordentliches Stückchen Code, das du im Zweifel analysieren kannst.

    Es gibt wenige, aber subtile Unterschiede zwischen C und C++ (z.B. bei den Namen von Strukturen), und ich bin noch dazu in C++ nicht vollständing sattelfest. Es empfiehlt sich jedenfalls, peinlichst genau zwischen den Sprachen zu unterscheiden, und das auch dem Compiler bekannt zu machen (z.B. sollte eine C-Datei auf .c enden).

    Den Code und die Erklärungen hab ich überflogen, sieht ein wenig chaotisch aus, aber so ist das meistens, wenn man viel herumprobiert. Aufgefallen ist mir sonst nichts. Ich warte mal auf die Meldung, ob das Sortieren wenigstens in meinem Beispiel funktioniert.
    🙂



  • ja, dieser Code von dir funktioniert und ist richtig!
    habe ich es an die falsche Stelle gebunden?



  • super!
    danke! es funktioniert! musste aus compare nur compare_entry machen...
    eine Frage, er gibt alles Sortiert mit Position aus.
    Leider, wenn 2 mal die gleiche Zahl kommt mischt er es, ist es möglich, dass die 1. der sleben Zahlen auch weiterhin vor der nächsten mit der selben 'Zahl steht?
    Hier:
    5 war vorher an Platz 3
    5 war vorher an Platz 2

    ist es möglich:
    5 war vorher an Platz 2
    5 war vorher an Platz 3

    zu erhalten?



  • Wieso? Ist bei dir 5 !=5? 😃
    Du must die Fuktion compare_entry anpassen...



  • Ja, ist möglich, dafür musst du aber statt des Quicksorts einen stabilen Sortieralgorithmus wie Bubblesort nehmen.

    Edit: Hier noch ein Beispiel.
    Anmerkung: Der Quicksort ist für große Arrays natürlich wesentlich schneller als die "Krücke" Bubblesort.
    Blödsinn, du brauchst den Algorithmus natürlich nicht verändern, du hast ja die alten Positionen gespeichert, bei Gleichheit der Values vergleichst du diese Positionen.


Anmelden zum Antworten