【问题标题】:Trouble with horizontal frequency histogram水平频率直方图的问题
【发布时间】:2017-03-10 11:14:03
【问题描述】:

我在编写 C 代码时遇到了很多问题。对于任何严重错误,我们深表歉意。我试图为数组中整数的频率做简单的水平直方图。不管它打印出什么错误并导致无限循环。我相信问题出在 printHistogram 函数上。有什么建议吗?

代码如下:

#include <stdio.h>

//Prints histogram to screen using horizontal bar chart
void printHistogram ( int *hist, int n );

int main ( void )
{
    int i, n;

    printf ("How many values for array? ");
    scanf ("%d", &n);

    int list[n];
    for (i=0; i < n; i++) {
        printf ("Enter value: ");
        scanf ("%d", &list[i]);
    }

    // Process data to compute histogram
    int hist[10];    


    // Print histogram
    printHistogram ( hist, 10);

    return 0;
}

void printHistogram ( int *list, int n )
{
    int i, j;

    for (i=0; i < n; i++) {
        printf ("[%d] ", i);
        for (j = 0; j < list[i]; j++)
            printf ("*");
        printf ("\n");
    }
}

【问题讨论】:

    标签: c arrays for-loop histogram


    【解决方案1】:

    问题出在

     for (j = 0; j < list[i]; j++)
    

    当您尝试使用list[i],但根据传递的参数,该值是不确定的。因此,在这种情况下,这会调用 undefined behavior 并且循环会变得混乱。

    详细说明,您已将int hist[10]; 定义为局部变量并没有对其进行初始化,因此所有成员都包含不确定值。然后,继续将数组传递给printHistogram(),在其中,您通过list 接收它,然后取消引用它并期望神奇地获得一些有效值,这是不可能的。

    OTOH,您正在扫描 list 中的值 main() 而不使用它。您需要进行一些更正,以便稍后使用扫描的值,这似乎是实际目标。

    【讨论】:

    • 那么,我该如何初始化 hist 数组呢?这是用户输入,所以我看不到该怎么做?
    • @BoloShmolo 自己传递listn 有什么问题?
    • 我想确保直方图只达到 10,所以我制作了 hist 数组。你说的可能吗?
    • @BoloShmolo OK 那么,扫描n 后,继续检查。否则,您可以使用一定范围的分辨率,但这取决于。
    • 按if语句检查?
    猜你喜欢
    • 2016-05-06
    • 1970-01-01
    • 1970-01-01
    • 2015-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-09
    • 1970-01-01
    相关资源
    最近更新 更多