Domanda

Così sono stato incaricato di afferrare un file binario, leggendolo in un array composto da struttura, quindi ordinandolo in base a un array all'interno della struttura.La parte che sono bloccata è l'ordinamento.Non sono sicuro se dovrei ordinarlo come un array (dal momento che il file binario è ora un array) o ordinalo come struct.Ecco parte del mio codice muggito.

typedef struct {
    char FlightNumber[7];
    char OriginCode [5];
    char DestinationCode [5];
    int Date [];
} FLIGHT;

int main(){

FLIGHT FlightData [3000];
/*opens file, freads it into the array then closes*/

/*trying to sort it based on OriginCode*/
int compare (const FLIGHT *a, const FLIGHT *b) {
    FLIGHT *ia = (FLIGHT *)a;
    FLIGHT *ib = (FLIGHT *)b;

    return strcmp(ia->OriginCode, ib->OriginCode);}

qsort( FlightData, 3000, sizeof( FLIGHT ), compare);
/*to see if sorting worked...*/
for (i = 0; i < 100; i++){

    printf ("%i) %s, %s, %s\n", i, FlightData[i].FlightNumber, FlightData[i].OriginCode, FlightData[i].DestinationCode );
}
}
.

Fondamentalmente mi sono perso su come scrivere il confronto.

È stato utile?

Soluzione

Prima di tutto, la funzione di comparatore dovrebbe avere la firma:

int compare(const void *v1, const void *v2);
.

Avanti, converti i puntatori voli nei puntatori della struttura:

    const FLIGHT *ia = (FLIGHT *)v1;
    const FLIGHT *ib = (FLIGHT *)v2;
.

Avanti, è necessario confrontare le cose sistematicamente, elemento per elemento:

    int rc;

    if ((rc = strcmp(ia->OriginCode, ib->OriginCode)) != 0)
        return rc;
    if ((rc = strcmp(ia->DestinationCode, ib->DestinationCode)) != 0)
        return rc;
    …
    return 0;  // Only if the two entries compare as identical
.

Questo tipo di codice aeroporto di origine, codice aeroporto di destinazione, quindi con altri criteri è possibile decidere (numero di volo, data). Noto che non hai specificato come viene memorizzata la data. Dal momento che è un array intero (apparentemente un "membro di array flessibile"), probabilmente hai "anno, mese, giorno 'separatamente in qualche sequenza.

Quando si dispone di un elemento di array flessibile, non è necessario definire una serie della struttura, perché non è possibile memorizzare nulla nel membro dell'array flessibile. Puoi avere una serie di puntatori, ma è necessario assegnare separatamente le strutture. OTOH, non hai davvero bisogno di array di dimensioni variabili per descrivere una data. Dovresti usare un array di dimensioni fisse, o anche un timestamp per dare tempo e data. Il problema residuo è con i voli che partono da un giorno e arrivano su un altro - pernottanti o voli sulla linea internazionale della linea. Probabilmente hai bisogno di un orario di partenza e un orario di arrivo, nella pratica.

Vedi anche (tra molti altri, senza dubbio):

Altri suggerimenti

Nota che Date ha dimensioni zero qui perché non si assegna alcun spazio per questo.Sarebbe un comportamento indefinito per dervarela.

La funzione di confronto QSORT deve avere questo tipo:

int compare(const void *a, const void *b)
.

Il tuo comparatore dovrebbe funzionare fino a quando si modifica la tua firma della funzione per abbinarlo a questo.

Riferisci il link sottostante per comprendere QSort in dettaglio link: http://www.cplusplus.com/reference/cstdlib/qsort/

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top