Я пытаюсь понять, почему мне не хватает первой строки 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 ряда.
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
...
}
Есть другие параметры (которые были бы лучше, чем глобальные параметры в нетривиальной программе), но вы, вероятно, пока можете обойтись глобальным.
Похожие вопросы
Новые вопросы
c
C - это язык программирования общего назначения, используемый для системного программирования (ОС и встраиваемых), библиотек, игр и кроссплатформенности. Этот тег следует использовать с общими вопросами, касающимися языка C, как это определено в стандарте ISO 9899 (последняя версия 9899: 2018, если не указано иное, а также для запросов, специфичных для версии, с c89, c99, c11 и т. Д.). C отличается от C ++ и не должен сочетаться с тэгом C ++ без разумной причины.