-1

この関数が呼び出しから戻ると、何も出力できないようです。関数内から印刷しようとすると、正しく機能しますが、呼び出し後に印刷されません。何をすべきかわからない。

    int *sched;
    getSchedFile(schFile, sched);
    printf("%d\n",sched[1]);

void getSchedFile (FILE *file, int *schd){
    /* Get the number of bytes */
    fseek(file, 0L, SEEK_END);
    int bytes = ftell(file);
    fseek(file, 0L, SEEK_SET);
    schd = malloc(bytes * sizeof(int));
    int pos = 0, curDigit;
    while((fscanf(file, "%d", &curDigit)) != EOF){
        schd[pos]=curDigit;
        ++pos;
    } 
}
4

1 に答える 1

1

次のように変更して、ポインターにポインターを渡す必要があります。

getSchedFile(schFile, sched);

に:

getSchedFile(schFile, &sched);

と:

void getSchedFile (FILE *file, int *schd) {

に:

void getSchedFile (FILE *file, int ** schd) {

それ以外の場合は、元のポインターではなく、関数内のポインターのローカル バージョンのみを変更します。過度の間接化を避けるために、関数を次のように変更できます。

void getSchedFile (FILE *file, int ** schd) {

    /* Get the number of bytes */

    fseek(file, 0L, SEEK_END);
    int bytes = ftell(file);
    fseek(file, 0L, SEEK_SET);

    int * pschd = malloc(bytes * sizeof(int));
    if ( pschd == NULL ) {
        fprintf(stderr, "Couldn't allocate memory.\n");
        exit(EXIT_FAILURE);
    }

    int pos = 0, curDigit;
    while((fscanf(file, "%d", &curDigit)) != EOF){
        pschd[pos]=curDigit;
        ++pos;
    } 

    *schd = pschd;  /*  Update original pointer  */
}

チャーリーが言及しているように、 で読んでいる場合%d、ファイル内のバイト数は、そこから読み取った s の数と同じにはintなりませんが、少なくともメモリの割り当てが少なすぎることはありません。

編集:関数に戻り値の型intと returnpos - 1を指定して、呼び出し元が新しい配列に含まれる要素の数 (または最後の要素のインデックスpos、実際の要素数を返すだけ) を認識できるようにすることもできます。

于 2013-10-13T04:33:47.473 に答える