类函数更改类cpp中的其他数据

时间:2014-05-12 14:23:07

标签: c++ function class variables

解决了!我发现了我的错误...我最后发布了我的解决方案。抱歉浪费时间。

我玩过c ++已经有一段时间了。它从来都不是我的主要语言,所以我不熟悉更精细的细节。我弹出一个奇怪的错误。当我调用factorize()时,它正在重置数字的符号。尽管标志永远不会被触及,但这是事实。

我找到了一个解决方法。在我的工作代码中,我添加了一个整数来保存和重置值,但我认为我不应该这样做。我从下面的代码示例中删除了这两行。

我重置标志的地方: sign由此类的构造函数设置为0。它可以在*和* =运算符中设置为0(如果它们各自具有相同的符号)。仅当为对象分配(无符号long long)值时,它才被=运算符设置为零(如果将符号设置为等于另一个FactorNumber,则保留符号)。

就是这样。这些是我设置为零的唯一地方。我不明白为什么这个功能会调用其中任何一个。但是,我并没有真正适应c ++在处理类时如何处理事情的细节。我不明白为什么签名会一直重置为0,但也许我做错了什么。有谁知道为什么会这样?

class FactorNumber {
    private:
        unsigned long long number;
        unsigned long long factor_list[63];     // this is the max possible amount
        int number_of_factors;
        int sign;                               // 0=positive 1=negative
        void factorize();
[snipped irrelevant public function calls]
};    

void FactorNumber::factorize() {
    int x=0;
    for(x=0;x<64;x++) {
        factor_list[x]=0;
    }
    number_of_factors=0;
    unsigned long long current_factor=2;    // 64 bits in c++
    unsigned long long current_number=number;
    unsigned long max_factor=0;  // can never be more than 32 bits
    if (number>3) {
        max_factor=sqrt(current_number);
        while (current_factor<=max_factor) {
            if(current_number%current_factor) {
                if(current_factor>2) {
                    current_factor+=2;
                } else {
                    current_factor=3;   
                }
            } else {
                factor_list[number_of_factors++]=current_factor;
                current_number=current_number/current_factor;
                if(current_number%current_factor) {
                    max_factor=sqrt(current_number);
                }
            }
        }

        // If there is a number larger than one, add it to the array.
        if(current_number>1) {
            factor_list[number_of_factors]=current_number;
        } else {
            number_of_factors--;        // If not, we ignore this last number
        }
    } else {
        number_of_factors=0;
        factor_list[0]=number;
    }
}

我的错误是一个obiwan错误。我正在编写我的数组的末尾(factor_list [63]实际上并不存在),这是在覆盖我的数据。巧合的是,这个重置标志并没有搞砸其他东西(或许它确实如此,但我还没有抓住它)。这就是我问这个问题的原因。我无法解决这个问题,我知道我的代码中有一个错误。

将for循环条件更改为x <63可清除错误。

3 个答案:

答案 0 :(得分:2)

你在for的第一个factorize()中溢出,因为你要到索引63,而最大索引(在类中声明为62(大小63))。实际上,每当你打电话给factor_list[X]=Y时,你都有机会溢出课堂上的下一个成员。您总是需要验证数组索引!

unsigned long long factor_list[63]; // <----- indexes from 0 to 62 // <code omitted> factor_list[666] = 0; // <----- Oops! Overflowing (but it's still valid code)

另外,为什么在C ++中使用C风格的数组而不是C ++风格的数组呢? std::array是一种更好的方法。

答案 1 :(得分:1)

factor_list中有63个项目。

此循环

for(x=0;x<64;x++) {
     factor_list[x]=0;
}

写入64 long longs

最后一个赋值factor_list[63]会覆盖存储在数组后面的变量,将sign设置为0。

更改循环索引。

您可能还想添加一些不会增加number_of_factors的检查。

答案 2 :(得分:0)

正如已经指出的那样,我正在编写我的数组的末尾。