Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 03.09.2014, 01:58   #1
Timurkh77
Форумчанин
 
Регистрация: 16.02.2013
Сообщений: 137
По умолчанию Borland C++ 4.5

Написал программу с графикой в Borland C++ 4.5.У меня подозрение , что
выдается ошибка памяти.Это происходит после того ,как программа уже должна запускаться.Выходит табличка с надписью:
Цитата:
General Protection Exception
0x2247:0x2DF3
OWL250(17)0x2247:0x2DF3 Processor
Fault
Для тех кто разбирается в Borland C++ 4.5.Как сделать так , чтобы память не переполнялась?Что сделать , чтобы программа заработала?
Вызываю через таймер постоянно функцию Invalidate() , которая вызывает Paint.В Paint-е вывожу в цикле объекты
Код:
  for(int index=0;index<NUM_STARS;index++)
   {
     dc.SetPixel(stars[index].x,stars[index].y,col);
   }
В Paint передаю контекст устройства
Код:
void TMyWin::Paint(TDC &dc,BOOL,TRect&)
На контексте вывожу пиксели dc.SetPixel().

Последний раз редактировалось Stilet; 03.09.2014 в 08:05.
Timurkh77 вне форума Ответить с цитированием
Старый 03.09.2014, 08:15   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,792
По умолчанию

А почему ты решил что это ошибка связанная с памятью?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 03.09.2014, 19:59   #3
Timurkh77
Форумчанин
 
Регистрация: 16.02.2013
Сообщений: 137
По умолчанию

Я подумал ,что если вначале синтактических ошибок не выдается , то у меня происходит переполнение памяти.Дело в том ,что у меня циклически
вызывается функция Paint.А в Paint в цикле выводятся много пикселей
графически , используя функцию SetPixel на контексте грфического устройства dc.Вот я и думаю , что у меня из-за большого количества
графических объектов происходит переполнение памяти.Больше грешить
не на что.
В программе выдается ошибка Exception-исключение ,не знаю на что и грешить.
Может мне выложить всю программу в ней всего 94 строки.Может вы тогда
сможете обнаружить ошибку.
Timurkh77 вне форума Ответить с цитированием
Старый 03.09.2014, 20:34   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,792
По умолчанию

Ну попробуй. Билдера у меня вроде нет, но может другие форумчане подключатся.
Впрочем если выложишь, я хоть на глаз проанализирую. Може и увижу бячку )
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 03.09.2014, 21:36   #5
Timurkh77
Форумчанин
 
Регистрация: 16.02.2013
Сообщений: 137
По умолчанию

Посылаю программу:
Код:
#include<owl\applicat.h>
#include<owl\framewin.h>
#include<owl\dc.h>


#define NUM_STARS 256

#define NEAR_Z 10
#define FAR_Z 2000

struct STAR3D_TYP
{
 float x,y,z;
} stars[NUM_STARS];

class TMyWin : public TFrameWindow
{
 public:
		TMyWin():TFrameWindow()
		{}
		void Paint(TDC &dc,BOOL erase,TRect &rect);
		void EvTimer(UINT);
		void SetupWindow();
 DECLARE_RESPONSE_TABLE(TMyWin);
};

DEFINE_RESPONSE_TABLE1(TMyWin,TFrameWindow)
EV_WM_TIMER,
END_RESPONSE_TABLE;

void TMyWin::SetupWindow()
{
 TRect rect;
 TFrameWindow::SetupWindow();
 GetClientRect(rect);

 for(int index=0;index<NUM_STARS;index++)
  {
	stars[index].x=-(rect.right-rect.left)/2+rand()%(rect.right-rect.left);
	stars[index].y=-(rect.bottom-rect.top)/2+rand()%(rect.bottom-rect.top);
	stars[index].z=NEAR_Z+rand()%(FAR_Z-NEAR_Z);
  }

 SetTimer(1,1000);
}

void TMyWin::EvTimer(UINT)
{
 for(int index=0;index<NUM_STARS;index++)
  {
	stars[index].z-=4;

	if(stars[index].z<=NEAR_Z)
	 stars[index].z=FAR_Z;
  }
  Invalidate();
}

void TMyWin::Paint(TDC &dc,BOOL /* erase */,TRect & /* rect */)
{
 TRect rect2;
 GetClientRect(rect2);

 TBrush brBlack(TColor::Black);
 dc.SelectObject(brBlack);
 dc.FillRect(rect2,brBlack);

 TColor col(255,255,255);

 for(int index=0;index< NUM_STARS;index++)
  {
	stars[index].x=stars[index].x/stars[index].z;
	stars[index].y=stars[index].y/stars[index].z;
	dc.SetPixel(stars[index].x,stars[index].y,col);
  }

}

class TMyApp : public TApplication
{
 public:
		TMyApp():TApplication(){}
 private:
		void InitMainWindow()
		 {
		  MainWindow=new TMyWin();
		 }
};

int OwlMain(int,char*[])
{
 TMyApp app;
 return app.Run();
}

Последний раз редактировалось Stilet; 03.09.2014 в 22:14.
Timurkh77 вне форума Ответить с цитированием
Старый 03.09.2014, 22:22   #6
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,792
По умолчанию

Так, стопэ! Это же прога для DOS. Да?
Ты ее из-под какой винды запускаешь?
Подозреваю что тебе нужен DosBox для работы в Borland C++ 4.5.
Или как минимум запуск в режиме совместимости.

Или я ошибаюсь?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 03.09.2014, 22:48   #7
challengerr
Участник клуба
 
Аватар для challengerr
 
Регистрация: 30.07.2008
Сообщений: 1,639
По умолчанию

SetPixel принимает 2 аргумента типа int. Может быть, ошибка из-за преобразования типов? Попробуйте явно преобразовывать типы в вызове SetPixel.
"SPACE.THE FINAL FRONTIER.This's a voyage of starship Enterprise. It's 5-year mission to explore strange new worlds,to seek out new life and civilizations,to boldly go where no man has gone before"
challengerr вне форума Ответить с цитированием
Старый 04.09.2014, 00:20   #8
Timurkh77
Форумчанин
 
Регистрация: 16.02.2013
Сообщений: 137
По умолчанию

Программа написана под Windows , а не под DOS.С библиотекой OWL для
Borland C++ 4.5.
Challangger-у я подумал , что дело в преобразовании типов
написал dc.SetPixel((int)stars[index].x,(int)stars[index].y,col);
все равно выдает одну и ту же ошибку.
Timurkh77 вне форума Ответить с цитированием
Старый 04.09.2014, 08:02   #9
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,792
По умолчанию

Знаешь, есть один хороший метод выявления ошибок: Закомментируй код, ну в смысле внутренности методов. Запусти - выдаст ошибку или нет? Если нет - раскомментируй по одной и запускай, пока не получишь ошибку. Будешь знать в каком месте она всплывает.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 04.09.2014, 08:21   #10
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,493
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Знаешь, есть один хороший метод выявления ошибок: Закомментируй код
Еще можно запустить программу под отладчиком.
Когда прога сломается сразу видно из какого вызова.

Edit:
Кстати, при такой реализации будет сильное мигание экрана.
При рисовании лучше каждую точку сначала рисовать черным цветом, потом пересчитывать координаты и рисовать на новом месте.
И еще, все операции со stars[index] можно вынести в парочку методов в структуре STAR3D_TYP. Навскидку, у нас есть init(), draw() и next().

Последний раз редактировалось waleri; 04.09.2014 в 08:34.
waleri вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Borland с++ 3.1 Firhov Общие вопросы C/C++ 7 25.10.2011 19:21
unable to rename 'C:\ProgramFiles\Borland\Delphi7\Bi n\Delphi32.$$$' to 'C:\Program Files\Borland\Delphi7\ KazBoy Помощь студентам 1 12.04.2011 18:07
Borland C++ ~eXe~ Помощь студентам 1 16.06.2010 00:04
Borland C J-lo Помощь студентам 1 15.04.2010 23:20
не могу запустить ехешник ,Borland 5 и Borland 6 error_13 Общие вопросы C/C++ 0 31.01.2010 14:04