Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C++ Builder > Программа работает, но не совсем


Автор: Гость_Константин 31.10.2005, 21:48
Доброго времен суток!
На данном этапе развития программки она должна рисовать правельный n-угольник.
Она его успешно рисует, но после нажатия кнопки выход появляется вот такая ошибка:

Project Project1.exe raised exception class EAccessViolation
with message'Access violation at address 32609C45. Write of address
FFFFFFA4' Process stopped. Use Step or Run to continue.

Либо я с указателями что-то путаю, либо где-то у меня жуткая ошибка, о которой я даже и не догадываюсь. smile

Так что если кто поможет буду очень благодарен.

Вот её код:


//---------------------------------------------------------------------------
#include <math.h>
#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
int round(double x)
{
if ((ceil(x)-x)<0.5)
return ceil(x);
else
return floor(x);
}


int get_y (int n, int r,double phi)
{return 100-round(r*sin(M_PI/2+phi));
}

int get_x (int n, int r, double phi)
{ return 100+round(r*cos(M_PI/2+phi)) ;
}

TPoint* getpoints(int n, int r)
{
double phi = 0;
TPoint *array = new TPoint[n];
for(int i = 0; i < n+1; i++)
{
array[i] = Point(get_x(n, r, phi),get_y(n,r, phi));
phi+=2*M_PI/n;
}
return array;

}


void __fastcall TForm1::FormActivate(TObject *Sender)
{
Image1->Canvas;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
if ((Edit1->Text!="")&&(Edit2->Text!=""))
{int n=StrToInt(Edit1->Text);
int r=StrToInt(Edit2->Text);
if ((n>2)&&(r>20))
Image1->Canvas->Polygon(getpoints(n,r),n);
else ShowMessage("Не верно указанно или количество граней, или длина, или одно из полей пустое");
}

else ShowMessage("Не верно указанно или количество граней, или длина, или одно из полей пустое");
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button5Click(TObject *Sender)
{
Close();
}
//---------------------------------------------------------------------------

void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
{ Action=caFree;

}
//---------------------------------------------------------------------------




Автор: Константин (автор вопроса) 31.10.2005, 22:35
Step over заканчивается на
__fastcall AnsiString(): Data(0) {}
Что это и откуда я понятия не имею
Может стоит Editы обнулить, других строк у меня впринципе нет?

Автор: S.A.P. 31.10.2005, 22:52
Цитата

TPoint *array = new TPoint[n];
for(int i = 0; i < n+1; i++)

попробуй убрать +1. Тут по идее у тебя идет выход за пределы массива.

Автор: Константин(всё тот же) 31.10.2005, 23:37
Спасибо! Ошибка была там, но и не только.
Я в методе Polygon написал "n", а не "n-1"-там нумерация с нуля, как и в масивах.
Потом не понимая в чём дело, я искал ошибку в другом месте, потом сейчас не понмню даже почему и зачем поставил n+1 в том цикле. Обрадовавшись, что всё рисует там ошибку даже и не ожидал увидеть. Ещё раз Спасибо!

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)