2014-12-11 183 views
-2

所以,我有这个功能,我写了一个月前,并忘记完全它是如何工作的。为什么此函数返回的结果比返回的结果要多?

int readFile(int racerId_func[30], double raceData_func[30][8]) { 
    string fileLoc; 
    ifstream inFile; 
    int racersNum_func; 
    cout << "Enter an input filepath: "; // Type in the filepath 
    getline(cin, fileLoc); 
    inFile.open(fileLoc); 

    if (inFile.fail()) { 
     cout << "Error: Could not open file." << endl; 
     exit(1); 
    } 

    inFile >> racersNum_func; // Gets the number of racers 

    for (int i=0; i < racersNum_func; i++) { 
     inFile >> racerId_func[i]; // Assigns each racer's ID number 
     for (int j=0; j < 8; j++) { 
      inFile >> raceData_func[i][j]; 
     } 
    } 
    return racersNum_func; 
} 

这是应该从文件中读取参赛者的数量,然后每个赛车手的ID和圈数。注意它只返回racersNum。现在,我呼吁这个功能,我的主要功能如下所示:

int racersNum, racersQual; // vars included for reference 
int racersDis = 0; 
int racerId[30]; 
double raceData[30][8]; 
double average[30]; 

racersNum = readFile(racerId, raceData); // I call it right here 

不知何故,racerId和raceData也被传从功能回来,即使我只有回到racersNum。为什么是这样?我对回报如何工作有一个基本的误解?你需要看看我的整个计划吗?

+1

你把它作为指针,所以该功能可以(做)修改它们 – sp2danny 2014-12-11 01:30:51

+3

这有什么做'return',它与参数传递做。当你使用一个数组作为参数时,它不传递数组的副本,它将数组转换为一个指针并传递它。所以你的函数正在修改阵列。 – Barmar 2014-12-11 01:31:15

+3

我希望你已经吸取了教训:_write documentation_。 – 2014-12-11 01:38:40

回答

1

如果声明与C数组类型的函数参数,然后实际的功能必须用一个指针类型的数组的第一个元素调用。 Link to rationale

所以实际上,C风格的数组通过引用传递,而非数组通过值传递。这就是为什么对main中显示的函数中数组的更改。

如果你想真正按值传递一个数组,你将不得不把它包在一个struct。标准库有这样一个包装,它被称为std::array

+0

所以,如果我想要这个效果,我可与其他类型的数据的函数中修改它,我会通过它像“MYFUNC(INT * FOO)”? – 2014-12-11 02:49:22

+1

如果你想传递一个'int',然后是 – 2014-12-11 02:50:08

+0

我就不会去在主函数中做任何事情都可以做到这一点? – 2014-12-11 03:00:13

1

这是因为racerId_funcraceData_func充当指针的实际数据。 并在函数内部修改该数据。

如果修改指针指向的数据,那么功能外,您将看到修改的数据。

这是您可以使一个函数“返回”多个值的方法之一。但请注意,通过参数返回数据和修改数据是两回事。

1

当你提到racerID和raceData返回你可能意味着该内容在ReadFile函数修改,你不指望它。

基本上这是在C/C++数组是指针的结果。所以当你将数组传递给函数时,它们就是指针,在你退出函数之后,你在readFile函数中做出的任何改变也会在数组中持久化。

1

你正在传递一个指针int racerId_func[30]作为参数有效int* racerId_func指针是可变的。如果您要将这些参数更改为const int racerId_func[30],并说“我不希望这些内容被修改”,那么您将无法编译,因为代码inFile >> racerId_func[i]正在写入它们。