【问题标题】:While loop not working properly虽然循环无法正常工作
【发布时间】:2012-11-03 10:56:14
【问题描述】:

在下面的程序中,当程序进入while循环时,它停止工作。当我尝试在没有循环的情况下分配值时,它醒了。 谁能告诉我问题是什么? 我正在使用 Visual Studio 2010。

#include <stdio.h>
#include<iostream.h>
#include <conio.h>

using namespace std;
int random(int min,int max);

struct pts
{
    int x;
    int y;
};

int main()
{
    struct pts *p;
    int w = 600,h=400;
    int nmax,kmax,k=0,n=0;

    while(k<5)
    { 
        p[0].x = random(0,h-1);
        p[1].y = random(0,w-1);
        cout << p[0].x << "   " << p[1].y << "\n";
        k++;
     }
     getch();
     return 0;
}

int random(int min,int max)
{
    int n=0;
    n=(rand()%(max-min+1))+min;
    return n;
}

【问题讨论】:

    标签: loops while-loop


    【解决方案1】:

    while 循环本身工作正常。只是你在破坏记忆。您的问题在于:

    struct pts *p;
    p[0].x = whatever;
    

    没有将p 设置为有效内存块。换句话说,您使用的是未初始化的指针,因此行为未定义,因此所有赌注都已关闭。

    由于您(目前)似乎只使用p[0]p[1],您可能可以更改:

    struct pts *p;
    

    到:

    struct pts p[2];
    

    当然,如果你想要一个变量结构,你可以使用:

    struct pts *p = new pts[500];
    

    当然,用你想要的任何大小替换 500。


    您可能还想考虑升级到更新的编译器,iostream.hconio.h 是不合时宜的。

    这是一个完整的程序,它展示了如何做到这一点,至少在你决定在循环中更“理智”地存储一些东西之前:

    #include <iostream>
    #include <stdlib.h>
    
    struct pts
    {
        int x;
        int y;
    };
    
    int random(int min,int max)
    {
        int n=0;
        n=(rand()%(max-min+1))+min;
        return n;
    }
    
    int main()
    {
        struct pts p[2];
        int w = 600,h=400;
        int k=0;
    
        while(k<5)
        {
            p[0].x = random(0,h-1);
            p[1].y = random(0,w-1);
            std::cout << p[0].x << "   " << p[1].y << "\n";
            k++;
         }
         return 0;
    }
    

    一个示例运行给出:

    183   286
    377   115
    193   535
    186   492
    249   421
    

    (事实上,可能会总是给出该序列,因为您没有调用 srand 来设置种子 - 您的数字可能与我的不同,但它们会给您每次都相同的顺序)。


    如果您想要一个更好的基线,请参阅:

    #include <iostream>
    #include <stdlib.h>
    #include <time.h>
    
    struct pts { int x; int y; };
    
    int random (int min, int max) {
        return (rand() % (max - min + 1)) + min;
    }
    
    int main (void) {
        pts *p = new pts[5];
        int w = 600, h = 400;
        int k = 0;
    
        srand (time (0));
        while (k < 5) {
            p[k].x = random (0, h - 1);
            p[k].y = random (0, w - 1);
            std::cout << p[k].x << "   " << p[k].y << "\n";
            k++;
        }
        delete[] p;
        return 0;
    }
    

    这通过删除不必要的东西来稍微缩短代码,并摆脱你的未定义行为问题。

    它还初始化随机数生成器并正确填充数组。

    【讨论】:

    • 如果我想在 p 中有一些 'k' 值怎么办。我应该全部初始化吗?
    • 我只是照你说的做了。它给出了第一个值,但没有给出其余的 4(循环 5)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-05-12
    • 1970-01-01
    • 2015-08-21
    • 2012-11-27
    • 2012-08-12
    • 2019-01-01
    相关资源
    最近更新 更多