структура не возвращает первый ряд - PullRequest
0 голосов
/ 23 октября 2019

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

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 строки.

1 Ответ

1 голос
/ 23 октября 2019
void FCFS() {
    Scheduler data;
    printf("Retrieved value: %d\n", data.processes[0][0]); 
    // prints 3
    ...
}

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

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

Затем при вызове FCFS() произвольные данные, которые он использует, - это данные, оставленные там в области stachk, на 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
    ...
}

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...