2016-02-17 5 views
-1

Код, приведенный ниже, является моим исходным кодом, который был частью лабораторного теста, который я недавно принял. Меня подсчитали очки, потому что программа не отображала линию правильно и не окрашивала ее так, как предполагалось. Я нашел это невероятным, так как я тестировал его на 3 очка (чтобы нарисовать две линии), чтобы сэкономить время на испытании с течением времени, и он отлично работает. Пример ввода для теста состоял из 5 пунктов (четыре строки). Когда я загрузил свой код и протестировал его с 5 очками, графический дисплей действительно сходит с ума, рисуя, казалось бы, случайные строки. Я отлаживал его и после третьей итерации (четвертый раз через цикл) первого цикла, где программа собирает координаты 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

Почему вы используете 'NULL' для 0 ионов всю вашу инициализацию? Это просто неправильно. – Donnie

+0

x и y - это ints, а не массивы. Из-за вашего кода вы теряете какую-то случайную память. Вам повезло, что он работает 4 раза подряд. (Это также относится к no_points, но так как вы никогда не проходите мимо [0], вам повезло) – Donnie

+0

«Я уже прошел тест и получил оценку» - провалился? –

ответ

1

координаты х значение, как представляется, перезапись управляющей переменной цикла «no_points [0]», без видимых причин.

Ну, без всяких причин, что очевидно для вы в любом случае.

В вашей основной программе вы объявляете все свои переменные no_points, x, y и т. Д. Как скаляры, а не массивы. То есть каждая переменная вмещает одинint. Ваши другие функции обрабатывают указатели на те переменные (которые вы указываете как аргументы), как если бы они указывали на массивы не менее no_points элементов в длину. Доступ к элементам, находящимся за первым (по индексу 0), вызывает неопределенное поведение.

Хотя невозможно предсказать результат неопределенного поведения из кода и стандарта, повреждение памяти является общим результатом такого неправильного кода, который вы представляете.

+0

Ничего себе. Спасибо. Это то, что происходит, когда я спешу. Явно забыл создавать массивы x и y, а вместо этого использовал их как одиночные целые числа. – joker113

Смежные вопросы