我的功能有问题。当我使用函数来操作数组,并打印它并继续下一个操作函数时,它使用先前操作的数组而不是原始数组。例如,当我的函数将每个负数转换为正数时,我调用下一个将所有偶数数字都清零的函数,并且我的数组打印出所有零,而不是使用原始数组。
#include <iostream>
#include <fstream>
#include <cstdlib>
using namespace std;
#define NUMS_PER_LINE 10 // maximum numbers to be printed on each line.
int numbers[100]; // array to hold upto 100 integer numbers.
int numcnt; // actual count (<=100) of numbers in above array.
// reads file content into array
void read_array_from_file (const char filename[])
{
ifstream inpfile(filename);
if (!inpfile.is_open())
{
cout << "Can't open file : " << filename << endl;
exit(1);
}
numcnt=0; // Initialise count of read numbers
// Read numbers from the file into array.
inpfile >> numbers[numcnt];
while (!inpfile.eof()) // Read until EOF is reached.
{
numcnt++; // Got one more number from input file.
inpfile >> numbers[numcnt];
}
inpfile.close();
return;
}
// Print out all the values in the array
void print_array_content (int numsinaline)
{
int i;
for (i=0; i<numcnt+1; i++)
{
if ((i % numsinaline) == 0)
cout << endl;
cout << numbers[i] << " ";
}
cout << endl << endl;
return;
}
// calculate average
double calculate_average ()
{
int i;
float sum=0;
for (i=0; i<(numcnt-1); i++)
{
sum += numbers[i];
}
return (sum/(numcnt-1));
}
// Find numbers larger and smaller than the average.
void find_numbers_smaller_and_larger_than_average (int &larger, int &smaller, int average)
{
int i;
for (i=0; i<(numcnt-1); i++)
{
if (numbers[i] < average)
smaller++;
else if (numbers[i] > average)
larger++;
}
return;
}
// Convert negative numbers to positive in the array 'numbers'.
void convert_negative_to_positive ()
{
int i;
for (i=0; i<(numcnt-1); i++)
{
if (numbers[i] < 0)
numbers[i] *= -1;
}
return;
}
// Convert all even numbers into zero.
void zero ()
{
int i;
for (i=0; i<numcnt; i++)
{
if (numbers[i] > 0)
numbers[i] *= 0;
}
return;
}
答案 0 :(得分:1)
首先,您正在为数组使用全局变量,因此您永远不会将其传递给您的函数。在函数中更改全局变量时,它会更改数组中的数据。您应该将该数据传递给函数而不使用全局变量。
其次,while(!inpFile.eof())
错误!不要这样做。
对于文件流:
std::vector<int> numbers;
std::ifstream fin("myfile");
std::copy(std::istream_iterator<int>(fin), std::istream_iterator(), std::back_inserter<vector<int> >(numbers));
这3行将整个文件读入矢量“数字”。
第三,在声明你的函数时,传递数组:
void myFunction(const std::vector<int>& vec); // if you aren't going to change the vector
或 void myFunction(std :: vector&amp; vec); //如果你要改变它
你可以简单地称之为:
myFunction(numbers);
答案 1 :(得分:0)
“它使用先前操作的数组而不是原始数组。”
显然是因为你的数组是全局声明的
int numbers[100];
在所有功能之外。
当您对此数组执行一个操作时,元素将被修改,新值将用于下一个函数。
而不是这样,保存原始数组的副本,然后在希望处理原始数组时使用此副本
答案 2 :(得分:0)
您的所有操作都对单个全局变量numbers
起作用。如果您在任何函数中修改它,其值也会在每次出现时更改。
相反,提供一种方法来告诉您的函数您要使用哪个数组,它包含多少元素并使用多个数组。这也使您可以摆脱全局变量。
#include <iostream>
using namespace std;
typedef unsigned int array_size_t;
void print_array(int array[], array_size_t size){
for(array_size_t i = 0; i < size; ++i){
cout << array[i] << endl;
}
}
int main(){
int a1[] = {1,2,3,4};
int a2[] = {1,3,3,7,0,0,0,0};
print_array(a1,4);
print_array(a2,8);
}
如果允许您使用标准容器,例如std::vector
。上面的解决方案比C ++更像C。
答案 3 :(得分:0)
您正在函数内部直接操作数组,因为它是全局定义的,而不是将副本作为参数传递。
void modify(int[] array) {
//Modify copied array here
}
int main() {
int numbers[100];
int copyNumbers[100];
//Copy numbers
memcpy(copyNumbers, numbers, sizeof(numbers));
modify(copyNumbers);
//Use modified array
memcpy(copyNumbers, numbers, sizeof(numbers)); //Set back to original
modify(copyNumbers); //Modify copy again as original
}
答案 4 :(得分:0)
您正在使用全局变量。无论索引如何,您对数字的所有操作都将改变您的特定位置的值。
另一个潜在的风险是,如果您的输入文件包含超过100个整数,您将执行
inpfile >> numbers[100];
或某个大于100的索引号。 这将导致分段错误。
使用全局变量时应该非常小心