虽然循环不能正常工作

时间:2012-11-03 10:56:15

标签: loops while-loop

在下面的程序中,当程序进入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;
}

1 个答案:

答案 0 :(得分:2)

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;
}

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

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