0

以下は私のコードです:

qsortを効果的に使用できないようです...名前と開始時刻が入力された後、配列が0に変わります... qsort呼び出しに問題がありますか?またはqsort自体。

構造体のヘッダーは次のとおりです。

 /**
 * Simulation of a process scheduler
*/

//#ifndef SCHEDULER_H_
#define SCHEDULER_H_

#include <stddef.h>
#include <errno.h>
#include <limits.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <ctype.h>


/* types */
/** units of time */
typedef long time;
/** process identifier */
typedef int pid;

/** Information about a job of interest to the task scheduler */
struct job_data {

/* pid of this process */
    pid pid;
    /* time process starts */
    time start;
    /* time needed to finish */
    time finish;
    /* time spent processing so far */
    time scheduled;
    /* Number of lines */
    int lines;

};

struct job {

    /* Various parameters used by the scheduler */
    char job_id[20];
    struct job_data parameters;
    char *lines[20];


};  




      /* I/O Files */
        //static char *inputFile;
        char * in;
        static FILE *input;
        static FILE *cur;
        /*Scheduled jobs indexed by PID*/
        struct job list[20];

        /* the next job to schedule */
        //static struct job *job_next = NULL;

        /* Time */
        time clock;

        /*Comparison for qsort*/
        int compare_start(const void *x, const void *y)
        {
            const struct job *a = x;
            const struct job *b = y;

                printf("%ld, %ld\n", a->parameters.start, b->parameters.start);

             if (a->parameters.start < b->parameters.start) 
            {
                        return -1;
             }
             if (a->parameters.start > b->parameters.start) 
            {
                    return 1;
             }

            return 0;

        }

        /*Order Jobs*/
        static void order_jobs(void)
        {

            qsort(list, (sizeof list) / (sizeof list[0]), sizeof list[0], compare_start);   

        }


        /** Read and parse input from input file */
        static void parse_input(void) 
        {
            char    buffer[BUFSIZ];
            char    lines[BUFSIZ];
            int jobs = 0;
            struct  job *current;





            while( fgets(buffer, sizeof(buffer), input) )   
            {


                time start;
                char buf[BUFSIZ];
                sscanf(buffer,"./%s/", buf);
                cur = fopen(buf, "r" );

                int n_lines = 0;


                while( fgets(lines, sizeof(lines), cur) )
                {


                    if( n_lines == 0 )
                    {
                        current = &list[jobs];
                        strcpy(current->job_id, buf);
                        sscanf(lines,"%ld", &start);
                        current->parameters.start = start;              
                    }       

                    n_lines++;
                } 
                current->parameters.lines = n_lines;

                jobs++;

                fclose(cur);

            } 
            order_jobs();
            for (int i = 0; i < jobs; i++)
            {
                printf("%s %ld  %d\n", list[i].job_id, list[i].parameters.start, list[i].parameters.lines);
            }   

        }

int main(int argc, char **argv) 
{
    in = argv[1];
    if ( (input = fopen(in, "r")) == NULL ) {
        fprintf(stderr, "cannot open %s\n", argv[1]);
    }

    parse_input();

    fclose(input);

    return EXIT_SUCCESS;
}
4

1 に答える 1

5

jobsエントリを配列にロードするだけですが、配列qsort()全体(20要素)を並べ替えるように指示します。これにより、初期化されていない要素が前面に配置され、印刷されます。

于 2012-10-09T12:58:49.503 に答える