gpt4 book ai didi

c - 结构不返回第一行

转载 作者:行者123 更新时间:2023-11-30 14:35:29 25 4
gpt4 key购买 nike

我试图找出为什么我缺少结构中包含的二维数组的第一行。在离开上一个函数之前,我打印了第一行的第一个值,该函数将值分配给二维数组。在调用的下一个函数中,该函数将根据数组中的值进行操作,我再次打印该值以查看它们是否匹配,但它们不匹配。打印的值是第二行的第一个值。打印二维数组的其余部分表明我丢失了整个第一行,即使执行此函数之前的最后一个打印语句显示第一行在那里。最后一个打印语句和本次打印语句之间除了调用函数之外没有其他语句。

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();
...
}

我期望 FCFS() 中的 data.processes[0][0] 打印 2,但它打印 3。打印其余值表明它缺少第一行,即使在最后一个函数的末尾,它打印所有 4 行。

最佳答案

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

这会创建该结构的本地副本,该副本与readfile()读入本地副本的内容没有任何关系。它很可能包含任意数据。

我怀疑它拥有实际数据(偏移一行)的唯一原因是 readfile() 中有其他局部变量,这些变量将其 >调度程序变量位于堆栈上的不同地址。

然后,当调用FCFS()时,它使用的任意数据是readfile()留在stachk区域的数据(如前所述略有偏移) )。

您可以通过在这两个函数中打印出 &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 - 结构不返回第一行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58514031/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com