Domanda

Sto cercando di ordinare una serie di strutture da ciascun membro della struttura; cioè, voglio stampare 1 elenco ordinato per ciascun membro della struttura. Quando i membri della struttura sono numeri interi, nessun problema. Ma uno dei membri è un'altra serie di strutture e voglio anche ordinare l'intero casino da ciascun membro di quella struttura. Ecco il codice:

 #define PROPHET_COUNT 9000
 #define MAX_FAITH_COUNT 600

typedef struct s_ProphetStat {  
    int     precursorScore;
    int     cassandraScore;
    int     prophetId;} prophetStat;

typedef struct s_FaithStat{
    int     precursorScore;
    int     cassandraScore;
    int     faithId;
    prophetStat ProphetStat[PROPHET_COUNT];  } faithStat; 

void fauxScoringFunction(faithStat *FaithStat)
{
    for (int faithIndex = 0; faithIndex < MAX_FAITH_COUNT; ++faithIndex){
        for (int prophetIndex = 0; prophetIndex < PROPHET_COUNT; ++prophetIndex){
            int randomNumber = rand();
            FaithStat[faithIndex].ProphetStat[prophetIndex].precursorScore +=   randomNumber;
            FaithStat[faithIndex].ProphetStat[prophetIndex].cassandraScore +=   randomNumber;
            FaithStat[faithIndex].precursorScore += randomNumber;
            FaithStat[faithIndex].cassandraScore += randomNumber; }}
}

typedef int (*compfn)(const void*, const void*);`enter code here`

   int compareFaithPrecursorScores(faithStat *faithA, faithStat *faithB){
 if (faithA->precursorScore > faithB->precursorScore) return 1; if (faithA->precursorScore < faithB->precursorScore) return -1; return 0; }
    int compareFaithCassandraScores(faithStat *faithA, faithStat *faithB) {
  if (faithA->cassandraScore > faithB->cassandraScore) return 1; if (faithA->cassandraScore < faithB->cassandraScore) return -1; return 0; }
    int cannotFigureOut(...) { return 0; }

void fakemain(void)
{
    faithStat   *FaithStat =  (faithStat *)   calloc(MAX_FAITH_COUNT,   sizeof(faithStat) );
    fauxScoringFunction(FaithStat);
    // sort by cumulative precursorScore for each faith 
    qsort(FaithStat, MAX_FAITH_COUNT, sizeof(faithStat *), (compfn) compareFaithPrecursorScores);
    // print results();
    // sort by cumulative precursorScore for each faith
    qsort(FaithStat, MAX_FAITH_COUNT, sizeof(faithStat *), (compfn) compareFaithCassandraScores);
    // print results()
    // sort by prophet precursor score
    qsort(FaithStat, MAX_FAITH_COUNT * PROPHET_COUNT, sizeof(faithStat *), (compfn) cannotFigureOut);
}

È la funzione di confronto "Cantfigureout ()" che sto cercando di scrivere. (Sto compilando il codice C usando VS2010 C ++ (non la mia decisione), quindi il brutto cast di Calloc. Tutta la bruttezza è mia.)

Modifiche: nel tentativo di semplificare, ha fallito le funzioni di confronto. Risolto quello. Inoltre, modifica: ho omesso un'informazione importante: l'insieme di profeti è lo stesso per ogni fede. Quindi quello che voglio fare è ordinare dal cumulativo Punteggi precursori (e poi, separatamente, dal punteggio cumulativo Cassandra) di ciascun profeta. Cioè: Profeta [0] cumulativeScore = (Faith [0] .Profet [0] .PrecursorsCore + (Faith [1] .Profet [0] .PrecursorsCore ... Faith [max_Faith_Count - 1] .PROPHET [0] .PrecursorsCoreCore );

È stato utile?

Soluzione

Primo, return (a,b); restituisce solo b; in entrambi i tuoi compareFaithPrecursorScores e compareFaithCassandraScores Probabilmente vuoi sostituire , insieme a -. Ora hai solo fedi allocato nel tuo principale, quindi nell'ultimo dovresti ordinare lo stesso FaithStat della stessa lunghezza di prima: MAX_FAITH_COUNT, non MAX_FAITH_COUNT * PROPHET_COUNT.

Ora nel tuo cannotFigureOut, si confronta solo due Faithstats, come prima, quindi la firma è sempre la stessa:

int cannotFigureOut(faithStat *faithA, faithStat *faithB){
 .... } 

(Modifica :) OK, quindi (dopo i tuoi chiarimenti) che non è chiamato cumulativo Per niente, è fuorviante. Intendevi totale punto. Quello che la tua ultima aggiunta sembra dire è che vuoi ordinare Un altro array Complessivamente, questo tempo di 9000 profeti (e non di 600 fedi). Il punteggio di ogni profeta sarà la somma dei suoi punteggi in tutte le fedi; Basta fare una funzione per riempire l'array profeti dopo che è stato creato, quindi ordina come al solito.

Puoi usare lo stesso prophetStat struttura per tenere i punteggi totali questa volta, e non i valori per fede, in modo che la firma sia

int cannotFigureOut(prophetStat *prophetA, prophetStat *prophetB){
 .... } 
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top