【问题标题】:Function setting number to zero by itself?功能将数字自行设置为零?
【发布时间】:2012-03-29 18:59:12
【问题描述】:

我的函数以某种方式更改了我将其传递为零的数字,即使我为变量设置了任意数字,该函数也会将其更改为零?
到底是怎么回事?这怎么可能?

这里定义了变量

int count,i,binnumber,*histo,tempmax,tempmin;

float *data,y,temp,binwidth;

tempmin = floor(temp);
binnumber = ceil(sqrt((count-1)));          
//out_stream << binnumber << endl;          
binwidth = abs(tempmax-tempmin);
binwidth = binwidth/binnumber;  

for (int i=0; i<count; i++)
{
    data[i] = data[i] - tempmin; 
    out_stream2 << data[i] << "\n";
}
func.histogram(data ,histo, binwidth, binnumber);       //create array for histogram use
int holder = 0; 

这将传递给这里的函数,该函数始终将其更改为零

void DSP1D::histogram(float *data,int *histo, float _binwidth, int _binnumber)
{

    binwidth = _binwidth;
    cout << "binwidth is: " << binwidth <<  endl;
    binnumber = _binnumber;
    for( int i = 0; i < count; i++ )
    {
        binnumber = data[i]/binwidth;

        binnumber = binnumber / binwidth ;
        //binnumber = floor(binnumber);
        //cout << binnumber << "bin one\n" ;
        histo[binnumber] = histo[binnumber] + 1 ; //possibly import sorted numberlist and place sorted numbers in appropriate bins
    }
} 

binwidth 是变为零的值,我们使用

cout &lt;&lt; "binwidth is: " &lt;&lt; binwidth &lt;&lt; endl;

检查值, 请帮忙?

【问题讨论】:

  • 什么数字变为零了? binwidth 在哪里定义?是全球性的吗?它是什么类型的?
  • 你如何确定它是否变为零?如果启用优化,调试器监视可能会报告误导值。
  • 对不起,binwidth 变为零,我们使用cout &lt;&lt; "binwidth is: " &lt;&lt; binwidth &lt;&lt; endl; 来检查值
  • _binwidth 的值是多少?我询问了上面的类型,因为如果它不是浮点数或双精度数,那么类型转换可能会导致舍入并在您不期望时将其设为 0。我询问了它的范围(全局或本地),因为您使用的变量可能与您想象的不同。另外,您是否尝试过进入调试器并检查值?打印格式可能会导致它显示为四舍五入,即使它有另一个值。
  • binwidth 和所有其他相关类成员的定义是什么?我猜 binwidth 为零只是因为传递给方法的_binwidth 为零。

标签: c++ histogram


【解决方案1】:

据我所知,您的代码存在许多问题:

int count,i,binnumber,*histo,tempmax,tempmin;

float *data,y,temp,binwidth;

tempmin = floor(temp);
binnumber = ceil(sqrt((count-1)));          
//out_stream << binnumber << endl;          
binwidth = abs(tempmax-tempmin);
binwidth = binwidth/binnumber;

1) 您正在使用 temp、tempmax、count all 而没有先分配它们。这意味着它们将有一些随机值(无论哪个值已经在内存中放置每个变量的位置)。它们应该是什么,您是否在两者之间遗漏了代码?如果 count 小于 1,您还必须在程序中使用某种虚数,因为 sqrt((count - 1)),并且 binnumber 也是随机的(如果程序没有停止运行,因为这个基本的 cmath sqrt 函数不处理虚数)

2) tempmin 被设置为 temp 的下限,即使 temp 没有设置为任何值,所以 tempmin 也将是随机的。

3) binwidth 被设置为 tempmax - tempmin 的绝对值,两者都有随机值,所以 binwidth 也会有一些随机值。

4) 如果您到达 binwidth = binwidth / binnumber 的行,请意识到因为您使用的是所有整数,对于除法,您将返回一个整数(基本上余数将被丢弃),所以您需要像这样投射一侧:

binwidth = (float)binwidth / binnumber,或 binwidth = bindwidth / (float)binnumber,或 binwidth = (double)b​​inwidth / binnumber,或 bindwidth = binwidth / (double)b​​innumber。

另外——当然,如果 binnumber 为 0(它可能在这里,因为它是随机的,你可能会崩溃),你可能想做这样的事情:

如果 (binnumber) binwidth = (double)b​​inwidth / binnumber; - 或某种解决方案

if (binnumber) 与 if (binnumber != 0) 相同,在 C 和 C++ 中,所有非 0 值都为真,0 为假。

所以是的,基本上你的代码存在很多问题,我建议确保你不要在没有事先分配变量的情况下在表达式或公式中使用变量,并尝试在不同的地方打印出 binnumber 的值代码前的地方。

等一下,你连*data都没有分配,你对data做的事情是可以的,你的电脑经常会允许到一个点,只要长度不大,有没有大的您的代码中缺少一块?你的变量在哪里被初始化?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-19
    • 1970-01-01
    • 2021-05-27
    • 2021-08-27
    • 1970-01-01
    相关资源
    最近更新 更多