For循环是否覆盖循环计数器?

时间:2016-02-17 17:31:36

标签: c++

下面的代码是我的源代码,它是我最近参加的实验室测试的一部分。我被计算掉了点,因为程序没有正确地显示线条并按照预期的颜色进行着色。我发现这令人难以置信,因为我测试了3分(绘制两条线),以便在定时测试中节省时间,并且它完美地工作。测试的示例输入是5分(四行)。当我下载我的代码并用5分进行测试时,图形显示确实变得混乱,绘制看似随机的线条。我调试了它,并且在第一个for循环的第三次迭代(第四次循环)之后,程序正在从用户收集x和y坐标,为x坐标值输入的任何内容似乎都会覆盖循环控制变量no_points[0],没有明显的原因。我的想法是循环控制变量和第四个x坐标值以某种方式共享一个地址。正如我所说,我已经参加了考试并获得了成绩,所以我不是在寻找任何可以作弊的讲义。我根本无法理解为什么会这样。任何帮助,将不胜感激。

#include <iostream>
#include "graph1.h"
#include <cstdlib>

using namespace std;

// declaring prototypes
void getData(int* no_points, int* x, int* y, int* r, int* g, int* b);
void drawPolyLine(int* objects, int*x, int* y, int* no_points);
void colorPolyLine(int* objects, int* no_points, int r, int g, int b);

// declaring main
int main()
{
    int no_points = NULL;
    int x = NULL;
    int y = NULL;
    int r = NULL;
    int g = NULL;
    int b = NULL;
    int objects[50] = {};


    int again = 1;
    do
    {
        displayGraphics();
        clearGraphics();
        getData(&no_points, &x, &y, &r, &g, &b);
        drawPolyLine(objects, &x, &y, &no_points);
        colorPolyLine(objects, &no_points, r, g, b);
        cout << "Please enter a 0 to exit the program..." << endl;
        cin >> again;
    } while (again == 1);

    return 0;
}

// declaring functions
void getData(int* no_points, int* x, int* y, int* r, int* g, int* b)
{

    cout << "Enter # of points: " << endl;
    cin >> *no_points;

    cout << "Number of points entered is " << *no_points << endl;
    cout << "Enter r/g/b colors..." << endl;
    do
    {
        cout << "Enter a red value between 0 and 255 " << endl;
        cin >> *r;
    } while (*r < 0 || *r > 255);
    do
    {
        cout << "Enter a green value between 0 and 255 " << endl;
        cin >> *g;
    } while (*g < 0 || *g > 255);
    do
    {
        cout << "Enter a blue value between 0 and 255 " << endl;
        cin >> *b;
    } while (*b < 0 || *b > 255);

    for (int i = 0; i < no_points[0]; i++)
    {
        cout << "Enter the x/y coord for Point #" << i + 1 << endl;
        cin >> x[i]; cin >> y[i];

    } 
}
void drawPolyLine(int* objects, int* x, int* y, int* no_points)
{

    for (int i = 0; i < no_points[0] -1; i++)
    objects[i] = drawLine((x[i]), (y[i]), (x[i + 1]), (y[i + 1]), 3);
}
void colorPolyLine(int* objects, int* no_points, int r, int g, int b)
{

    for (int i = 0; i < no_points[0] - 1; i++)
    {
        setColor(objects[i], r, g, b);
    }
}

1 个答案:

答案 0 :(得分:1)

  

x坐标值似乎是覆盖了循环控制变量&#34; no_points [0]&#34;,没有明显的原因。

嗯,无论如何,无论如何是显而易见的。

在您的主程序中,您将所有变量no_pointsxy等声明为标量,而不是数组。也就是说,每个变量都包含一个 int。您的其他函数会将指向这些变量的指针(您提供的参数作为参数)视为指向数组至少no_points个元素的长度。访问第一个元素(在索引0处)会产生未定义的行为。

虽然实际上无法从代码和标准中预测未定义行为的结果,但内存损坏是您提供的错误代码的常见结果。