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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 07.04.2010, 21:05   #1
tratat
 
Регистрация: 06.05.2009
Сообщений: 4
По умолчанию перестала работать прога

microsoft VS 2008 консоль
прога работала нормально, вроде почистил только комменты.
выдает следующ.ошибки
First-chance exception at 0x6ab1fd85 (msvcr90d.dll) in proect3.exe: 0xC0000005: Access violation writing location 0x00000000.
First-chance exception at 0x771b3913 in proect3.exe: 0xC0000005: Access violation reading location 0xdddddddd.
First-chance exception at 0x771d8a4e in proect3.exe: 0xC0000005: Access violation writing location 0x00060ed8.
Unhandled exception at 0x771d8a4e in proect3.exe: 0xC0000005: Access violation writing location 0x00060ed8.
The program '[744] proect3.exe: Managed' has exited with code 259 (0x103).
The program '[744] proect3.exe: Native' has exited with code 0 (0x0).


вот сама прога:

Код:
#include "stdafx.h"
#include <stdio.h>
#include <ctype.h>
#include <iostream>
#include <time.h>
#include <math.h>

using namespace System;
using namespace std;

double radius;
double* arrOfRad=new double[];
int h=0;
//Сортировка массива по возрастанию алгоритмом Флойда
void sortArray(double* a, int n){
	int i,j,k;
	a--;
	double x;
	//Превращение массива в пирамиду
	for (i=n/2; i>0; i--){
		j=i;
		while (j<=(n/2)){
			k=2*j;
			if(((k+1)<=n)&&(a[k]<a[k+1])){
				k=k+1;
			}
			if(a[k]>a[j]){
					x=a[j];
					a[j]=a[k];
					a[k]=x;
					j=k;
			}else{break;}
		}
	}
	//Дальнейшее просеивание пирамиды
	for(i=n; i>1; i--){
		x=a[1];
		a[1]=a[i];
		a[i]=x;
		j=1;
		while(j<=((i-1)/2)){
			k=2*j;
			if(((k+1)<=(i-1))&&(a[k]<a[k+1])){
				k=k+1;
			}
			if(a[k]>a[j]){ 
				x=a[j];
				a[j]=a[k];
				a[k]=x;
				j=k;
			}else{break;}
		}
	}

}
//Округление числа до сотых
double floorNumber(double x){
	x=floor(x*100+0.5)/100;
	return(x);
}
//Проверка на равенство кол-ва вхождений эл-ов 1го и 2го мн-в в окр.
void checkCircle(double*a, int n1, double *b, int n2){
	int m1=0, m2=0;
	for(int i=0; i<n1; i++){
		if(radius>a[i]){
			m1=m1+1;
		}
	}
	for(int i=0; i<n2; i++){
		if(radius>b[i]){
			m2=m2+1;
		}
	}
	if(m1==m2){
		arrOfRad[h]=radius;
		h=h+1;
	}
}
//Поиск окр. на которой лежат n точек 1го мн-ва
void searchCircle(double* a, int n1, double *b, int n2 ,int n){
	int w=1;
	for(int i=0; i<(n1-1); i++){
		if((a[i]==a[i+1])&&(i<(n1-2))){
			w=w+1;
		}else{
			if(a[i]==a[i+1]){//для проверки последних эл-ов на равенство
				w=w+1;
			}
			if(w==n){
				radius=a[i];
				checkCircle(a, n1, b, n2);
				w=1;
			}else{
				w=1;
			}
		}
	}
}
//main-функция
void main()
{
	//Структура опр-щая точку на пл-ти
     struct Point
     {
         double x;
         double y;
     };
	//Структура опр-щая окр.
	 struct Circle
     {
         double x;
         double y;
		 double r;
     };
	
	srand((unsigned)time(NULL));
	setlocale(LC_ALL, "russian_russia");
	


	char aa[15];
	char bb[15]="y";
	char cc[15]="n";
	int ii, jj, n, n1, n2;
	do{
		cout << "Задать множества точек вручную? (y/n)  :";
		cin >> aa;
		ii=strcmp(aa,bb);
		jj=strcmp(aa,cc);
	}while(!(ii==0||jj==0));
	cout << "Введите кол-во точек 1го мн-ва:  ";
	cin >> n1;
	cout << "Введите кол-во точек 2го мн-ва:  ";
	cin >> n2;
	do{
		cout << "Введите кол-во точек(>=3) 1го мн-ва, через кот. проходит окр.: ";
		cin >> n;
	}while(n<3);
	double* d=new double[n1];
	double* g=new double[n2];
	Point* Arr1 = new Point[n1];
	Point* Arr2 = new Point[n2];
	Circle* ito = new Circle[int(n1/3)];
	int s=0;
	if(ii==0){
		//Задание точек вручную
		//Задание точек генератор псевдослучайных чисел
		cout << "Точки 1го мн-ва:\n";
		cout << "Введите координаты точки через пробел";
		
		for(int i=0; i<n1; i++){
			cin >> (Arr1+i)->x >> (Arr1+i)->y;
			(Arr1+i)->x=floorNumber((Arr1+i)->x);
			printf("(%6.6g;", (Arr1+i)->x);
			(Arr1+i)->y=floorNumber((Arr1+i)->y);
			printf("%7.7g)\n", (Arr1+i)->y);
		}
		cout << "Точки 2го мн-ва:\n";
		for(int i=0; i<n2; i++){
			cin >> (Arr2+i)->x >> (Arr2+i)->y;
			(Arr2+i)->x=floorNumber((Arr2+i)->x);
			printf("(%6.6g;", (Arr2+i)->x);
			(Arr2+i)->y=floorNumber((Arr2+i)->y);
			printf("%7.7g)\n", (Arr2+i)->y);
		}
	
	}
tratat вне форума Ответить с цитированием
Старый 07.04.2010, 21:05   #2
tratat
 
Регистрация: 06.05.2009
Сообщений: 4
По умолчанию

Код:
else{
		//Задание точек генератор псевдослучайных чисел
		cout << "Точки 1го мн-ва:\n";
		for(int i=0; i<n1; i++){
			(Arr1+i)->x=(((double)rand())/((double)RAND_MAX))*100-50;
			(Arr1+i)->x=floorNumber((Arr1+i)->x);
			printf("(%6.6g;", (Arr1+i)->x);
			(Arr1+i)->y=(((double)rand())/((double)RAND_MAX))*100-50;
			(Arr1+i)->y=floorNumber((Arr1+i)->y);
			printf("%7.7g)\n", (Arr1+i)->y);
		}
		cout << "Точки 2го мн-ва:\n";
		for(int i=0; i<n2; i++){
			(Arr2+i)->x=(((double)rand())/((double)RAND_MAX))*100-50;
			(Arr2+i)->x=floorNumber((Arr2+i)->x);
			printf("(%6.6g;", (Arr2+i)->x);
			(Arr2+i)->y=(((double)rand())/((double)RAND_MAX))*100-50;
			(Arr2+i)->y=floorNumber((Arr2+i)->y);
			printf("%7.7g)\n", (Arr2+i)->y);
		}		
	}
	//Проверка каждой точки пл-ти на удовлетворение поставленным условиям
	for(double i=-5; i<5; i+=1){//регулируем точность изменяя диапазон и шаг...
		for(double j=-5; j<5; j+=1){
			for(int e=0; e<n1; e++){
				d[e]=floorNumber(sqrt(pow(((Arr1+e)->x)-i, 2)+pow(((Arr1+e)->y)-j, 2)));
			}
			for(int e=0; e<n2; e++){
				g[e]=floorNumber(sqrt(pow(((Arr2+e)->x)-i, 2)+pow(((Arr2+e)->y)-j, 2)));
			}
			sortArray(d, n1);
			sortArray(g, n2);
			searchCircle(d, n1, g, n2 , n);
			for(int t=0; t<h; t++){
				(ito+s)->x=i;
				(ito+s)->y=j;
				(ito+s)->r=arrOfRad[t];
				s=s+1;
			}
			h=0;
		}
	}
	for(int j=0; j<s; j++){
		cout << "Найдены следующие окружности:\n";
		cout << "\t" << "Окружность " << (j+1) << "\n";
		cout<<"\t"<<"Центр: ("<<(ito+j)->x<<"; "<<(ito+j)->y<<")\n";
		cout<<"\t"<<"Радиус: "<<(ito+j)->r<<"\n";
	}
доходит до последнего цикла и виснет после вывода строчки "Найдены следующие окружности"

в чем косяк понять не могу, работала же...
tratat вне форума Ответить с цитированием
Старый 08.04.2010, 08:01   #3
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,706
По умолчанию

Эти ошибки свидетельствуют о ошибках работы с указателями (собственно ошибочны указатели, уход за границу массивов, неинициализированные указатели...).

Код:
double* arrOfRad=new double[];
А теперь вопрос: какого размера будет массив?
p51x вне форума Ответить с цитированием
Старый 08.04.2010, 09:56   #4
tratat
 
Регистрация: 06.05.2009
Сообщений: 4
По умолчанию

Цитата:
Сообщение от p51x Посмотреть сообщение
Эти ошибки свидетельствуют о ошибках работы с указателями (собственно ошибочны указатели, уход за границу массивов, неинициализированные указатели...).

Код:
double* arrOfRad=new double[];
А теперь вопрос: какого размера будет массив?
Массив динамический, заранее неизвестно сколько будет элементов.
Их может быть очень много т.к. через 3 точки не лежащие на одной прямой проходит окружность.
Обязательно нужно задавать размерность, нет способа создать динамический??

понятно, что не показатель, но почему до этого все норм. работало!?
tratat вне форума Ответить с цитированием
Старый 08.04.2010, 12:55   #5
Amadeo
Новичок
Джуниор
 
Регистрация: 08.04.2010
Сообщений: 6
По умолчанию

Используй тип vector.

Пример:
Код:
struct Entry
{
 string name;
 int number;
};
Entry phone_book[1000];
vector<Entry>phone_book;
vector выделяет память только тогда, когда она требуется. Но циферку ты написать обязан. Правда возникает проблема с проверкой на переполнение, она как-то тоже решается, не помню точно, так что на эту тему погугли.

Последний раз редактировалось Stilet; 08.04.2010 в 13:17.
Amadeo вне форума Ответить с цитированием
Старый 11.04.2010, 09:50   #6
tratat
 
Регистрация: 06.05.2009
Сообщений: 4
По умолчанию

Цитата:
Сообщение от Amadeo Посмотреть сообщение
Используй тип vector.

Пример:
Код:
struct Entry
{
 string name;
 int number;
};
Entry phone_book[1000];
vector<Entry>phone_book;
vector выделяет память только тогда, когда она требуется. Но циферку ты написать обязан. Правда возникает проблема с проверкой на переполнение, она как-то тоже решается, не помню точно, так что на эту тему погугли.
Решил не заморачиваться с vector, тупо написал double* arrOfRad=new double[50];
с теми данными которые ввожу этого точно хватает.
еще немного здесь увеличил(до этого было n1/3) Circle* ito = new Circle[int(n1/2)];

запускаю в режиме без дебагинга, окружности находит как надо, но:

Последний раз редактировалось tratat; 11.04.2010 в 09:52.
tratat вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
флешка перестала работать Dizel883 Компьютерное железо 23 21.02.2010 18:18
Перестала работаь функция f1xed Помощь студентам 7 08.02.2010 17:19
Странный глюк программы - перестала работать Dimarik Софт 5 25.11.2009 09:33
Перестала появляться форма madmech Общие вопросы Delphi 6 22.10.2009 11:00
ShellExecute перестала открывать ссылки Armorer Win Api 7 24.05.2009 18:35