返回时更改 double 的 C++ 值

C++ value of double is changed when returned

C++ 新手和学习者。这个程序 return 是正确的输出。我将函数原型更改为 void 以隔离并确保函数提供正确的输出。

#include <iostream>
#include <fstream>

void ArraySortToMedian(int x[], int numElem); 

using namespace std;

int main() 
{
    ifstream infile;
    infile.open("numbers.txt");

    const int SIZE = 6;
    int array[SIZE];
    int i;

    if(!infile)
    {
        cout << "couldn't find 'numbers.txt'";
        return 1;   
    }

    while(i < SIZE && infile >> array[i])
        i++;

    infile.close();

    for(i = 0; i < SIZE; i++)
        cout << array[i] << "\n"; 

    ArraySortToMedian(array, SIZE);

    return 0;
}

void ArraySortToMedian(int x[], int numElem)
{
    bool swap;
    int temp, i;
    double m;

    do
    {
        swap = false;
        for(i = 0;i < (numElem - 1); i++)
        {
            if( x[i] > x[i + 1] )
            {
                temp = x[i];
                x[i] = x[i + 1];
                x[i + 1] = temp;
                swap = true;
            }
        }
    }
    while (swap);
    cout << "\n";
    for(i = 0; i < numElem; i++)
        cout << x[i] << "\n";

    m = (x[numElem/2] + x[numElem/2]-1)/(double)2;
    cout << "\n" << m;
}

输出:

6
5
3
1
2
4

1
2
3
4
5
6

3.5

当我删除 void 并将其替换为 double 到 return 到 main() 这样的中值时。

#include <iostream>
#include <fstream>

double ArraySortToMedian(int x[], int numElem); 

using namespace std;

int main() 
{
    ifstream infile;
    infile.open("numbers.txt");

    const int SIZE = 6;
    int array[SIZE];
    int i;
    double median;

    if(!infile)
    {
        cout << "couldn't find 'numbers.txt'";
        return 1;   
    }

    while(i < SIZE && infile >> array[i])
        i++;

    infile.close();

    for(i = 0; i < SIZE; i++)
        cout << array[i] << "\n"; 

    median=ArraySortToMedian(array, SIZE);

    cout<< "\n" << median << "\n";
    return 0;
}

double ArraySortToMedian(int x[], int numElem)
{
    bool swap;
    int temp, i;
    double m;

    do
    {
        swap = false;
        for(i = 0;i < (numElem - 1); i++)
        {
            if( x[i] > x[i + 1] )
            {
                temp = x[i];
                x[i] = x[i + 1];
                x[i + 1] = temp;
                swap = true;
            }
        }
    }
    while (swap);
    cout << "\n";
    for(i = 0; i < numElem; i++)
        cout << x[i] << "\n";

    m = (x[numElem/2] + x[numElem/2]-1)/(double)2;
    return(m);
}

失真输出:

1
6
5
3
1
2

1
1
2
3
5
6

2.5

当 return 移动在 main() 中生成的数组元素时,之前我只是从 ArraySortToMedian() 输出。我假设它与我引用数组第一个元素的起始地址有关。 可能非常简单,但以我有限的经验,我对这种行为不知所措。任何帮助我了解我做错了什么的帮助将不胜感激。谢谢。

问题是你的输入循环:

int i;
// ... snip ...
while(i < SIZE && infile >> array[i])
    i++;

您永远不会初始化 i,因此这是未定义的行为。也许有效也许无效。


如果您使用 std::vector 而不是数组,这会更容易:

std::vector<int> values;
int next;
while (infile >> next) {
    values.push_back(next);
}

现在您既没有大小限制,也不必担心跟踪索引。