Я пытаюсь понять, почему мне не хватает первой строки 2D-массива, содержащегося в моей структуре. Я напечатал первое значение первой строки перед тем, как покинуть предыдущую функцию, которая присваивает значения 2D-массиву. В следующей вызываемой функции, которая будет действовать на основе значений в массиве, я снова распечатал значение, чтобы увидеть, совпадают ли они, но это не так. Печатаемое значение является первым значением второй строки. Печать остальной части 2D-массива показывает, что мне не хватает всей первой строки, хотя последний оператор печати перед выполнением этой функции показал, что первая строка есть. Между последним оператором печати и этим оператором печати нет других операторов, кроме вызова функции.

filename.csv
ProcessID,AT,BT,Priority
2,0,5,4
3,0,3,2 
1,9,8,1
4,4,6,3
...

typedef struct _Scheduler {
    int processes[10][4];
    ...
} Scheduler;

void readfile(char *file) {
    Scheduler data;
    FILE *fp = fopen(filename, "r");
    // ignore first line
    // add integers to 2D array
    ....
    ....
    fclose(fp);
    for(int i = 0; i < 10; i++) {
        for(int j = 0; j < 4; j++) {
             printf("%d,", data.processes[i][j]);
        }
        ...
        printf("\n");
    } 
    // prints 
    // 2,0,5,4
    // 3,0,3,2
    // 1,9,8,1
    // 4,4,6,3
}

void FCFS() {
    Scheduler data;
    for(int i = 0; i < 10; i++) {
        for(int j = 0; j < 4; j++) {
             printf("%d,", data.processes[i][j]);
        }
        printf("\n");
    } 
    // prints 
    // 3,0,3,2 
    // 1,9,8,1
    // 4,4,6,3
}

int main(int argc, char **argv) {
    readfile(argv[1]);
    FCFS();
    ...
}

Я ожидаю, что data.processes [0] [0] в FCFS () напечатает 2, но он печатает 3. Печать остальных значений показывает, что отсутствует первая строка, хотя в конце последней функции он печатает все 4 ряда.

0
N. Colostate 23 Окт 2019 в 03:52

1 ответ

Лучший ответ
void FCFS() {
    Scheduler data;
    printf("Retrieved value: %d\n", data.processes[0][0]); 
    // prints 3
    ...
}

Это создает локальную копию структуры, которая не будет иметь никакого отношения к тому, что было прочитано readfile() в его локальную копию. Скорее всего, он будет содержать произвольные данные.

Я подозреваю, что единственная причина, по которой у него были фактические данные (смещение на одну строку), заключается в том, что readfile() имел другие локальные переменные, которые помещали его переменную Scheduler по другому адресу в стеке.

Затем при вызове FCFS() произвольные данные, которые он использует, - это данные, оставленные там в области стачка на readfile() (с небольшим смещением, как упоминалось ранее).

Вы можете проверить это, распечатав &data в обеих этих функциях, чтобы увидеть, не смещены ли они немного.

Чтобы исправить это, вам нужно создать единственную data переменную, которая каким-то образом совместно используется двумя функциями. Самый простой способ - сделать глобальный уровень файла, создав его экземпляр вне таких функций, как:

static Scheduler data;

void readfile(char *file) {
    ....
    ....
    fclose(fp);
    printf("Value assigned: %d\n", data.processes[0][0]); 
    // prints 2
}

void FCFS() {
    printf("Retrieved value: %d\n", data.processes[0][0]); 
    // prints 3
    ...
}

Есть другие параметры (которые были бы лучше, чем глобальные параметры в нетривиальной программе), но вы, вероятно, пока можете обойтись глобальным.

1
paxdiablo 23 Окт 2019 в 02:01