我正在从文件中读取一些彼此嵌套的数据(如文件树),以将其放入数组中。
阅读完成得很好,但我无法将数组放回main()。 AnzGrid的结果为0,因此for循环不会启动。
有没有人暗示我该怎么做?
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void read_include(int,int*,char*);
void read_include(int AnzGrid,int* GridIDs,char* Input){
char Line[81];
char* Token;
FILE * File;
FILE * File1;
File = fopen(Input,"r");
printf("opening %s\n",Input);
if (!File){
printf("%s not found here\n",Input);
return;
}
if (File){
while (fgets(Line,80,File)){
printf("%s",Line);
if (strncmp(Line,"GRID ",8) == 0){
Token=strtok(Line," ");
Token=strtok(NULL," ");
GridIDs[AnzGrid] =atoi(Token);
AnzGrid++;
}
if (strncmp(Line,"INCLUDE ",8) == 0){
Token=strtok(Line,"'");
Token=strtok(NULL,"'");
read_include(AnzGrid,GridIDs,Token);
}
}
fclose(File);
}
printf ("%i\n",AnzGrid);
return;
}
int main( int argc, char* argv[] ) {
char Input[81];
int i;
int AnzGrid;
int GridIDs[100];
strcpy(Input,argv[1]);
read_include(AnzGrid,GridIDs,Input);
printf ("=>%i\n",AnzGrid);
for (i=0;i<AnzGrid;i++){
printf ("GridID: %i\n",GridIDs[i]);
}
答案 0 :(得分:2)
这是因为当您将参数传递给函数时,它们会按值传递 ,换句话说,您传递的参数的值是复制在函数中。这也意味着您对函数内的参数所做的任何更改都是在副本上进行的,一旦函数返回,这些更改将会丢失。
在C语言中基本上有两种解决方法:
使用return
通过传递指向数据的指针并使用函数内的解除引用运算符来模拟pass by reference。
第二种选择可能需要一些示例代码:
/* Passing `AnzGrid` as a pointer */
void read_include(int *AnzGrid,int* GridIDs,char* Input){
...
(*AnzGrid)++; /* Using the dereference operator */
...
}
通过将AnzGrid
声明为指针,但通过使用address-of运算符来调用函数 not :
int main(...) {
int AnzGrid = 0; /* Initialize */
...
read_include(&AnzGrid,GridIDs,Input); /* Note use of address-of operator `&` */
...
}
注意: 在main
函数的代码段中,我还修复了另一个错误,一个导致undefined behavior:您没有初始化AnzGrid
变量。局部变量不会自动初始化,而是它们的值 indeterminate (并且看似随机)。使用未初始化的局部变量而不初始化它会导致提到的未定义行为。例如,如果AnzGrid
具有不确定的值,AnzGrid++
会做什么以及结果会是什么?
答案 1 :(得分:0)
您的read_include
函数应该返回一个malloc
指向包含读取数据的struct
的指针。
当然,您应该采用read_include
返回堆分配指针的约定,以及free
以后 。
gcc -Wall -g
)并且您应该学习如何使用调试器(例如gdb
)