HOME    FORUMS    MEMBERS    RECENT POSTS    LOG IN  
Баннер 1   Баннер 2

ANTICHAT — форум по информационной безопасности, OSINT и технологиям

ANTICHAT — русскоязычное сообщество по безопасности, OSINT и программированию. Форум ранее работал на доменах antichat.ru, antichat.com и antichat.club, и теперь снова доступен на новом адресе — forum.antichat.xyz.
Форум восстановлен и продолжает развитие: доступны архивные темы, добавляются новые обсуждения и материалы.
⚠️ Старые аккаунты восстановить невозможно — необходимо зарегистрироваться заново.
Вернуться   Форум АНТИЧАТ > ПРОГРАММИРОВАНИЕ > С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby
   
Ответ
 
Опции темы Поиск в этой теме Опции просмотра

  #5371  
Старый 28.05.2010, 06:49
M_script_
Постоянный
Регистрация: 29.10.2008
Сообщений: 306
Провел на форуме:
1819761

Репутация: 180
Отправить сообщение для M_script_ с помощью ICQ
По умолчанию

Цитата:
Сообщение от Gin  
Есть проблема такого характера, хотел бы чтоб с формы можно было задавать кол-во потоков в приложении использую TThread использую такое объявлений
Написано же, используй константу.
Код:
const int nMaxThreads = 1000;
int nThreads = StrToInt(Edit1->Text); 
Thread *thr[nMaxThreads];
for(int i=0;i<nThreads;i++){
thr[i] = new Thread(false);
}
 
Ответить с цитированием

  #5372  
Старый 28.05.2010, 18:52
qwert135
Познающий
Регистрация: 22.11.2009
Сообщений: 53
Провел на форуме:
33126

Репутация: 0
По умолчанию

Всем привет. Проблема в следующем.
Код:
#include <iostream>
#include <cmath>
#include <fstream>
using namespace std;


void Diagonal(double **A, int NumberOfEquation) {
	double *temp_massiv;
	int i, j;
	double max, replace;

	temp_massiv = new double[NumberOfEquation];
	for(i = 0;i < NumberOfEquation;i++){
		max = A[i][0];									
		for(j = 0;j < NumberOfEquation;j++){
			if(A[i][i] != 0) continue;					
			else{
				if(A[i][j] >= max) max = A[i][j];		
				temp_massiv[i] = max;					
			}
		}
	}
	for(i = 0;i < NumberOfEquation;i++){				
		for(j = 0;j < NumberOfEquation;j++){			
			if(A[i][j] == temp_massiv[i]){
				replace = A[i][i];
				A[i][i] = A[i][j];
				A[i][j] = replace;
			}
		}
	}
	delete []temp_massiv;
}


int SimpleIteration(double **A, double *B, int NumberOfEquation, double *solution, double fault_input) {
	int i, j, step = 1;
	double *TempSolution;

	TempSolution = new double[NumberOfEquation];
	double fault = fault_input + 1;
	
	for(i = 0;i < NumberOfEquation;i++) {
		for(j = 0;j < NumberOfEquation;j++) {
			if(i != j) {
				A[i][j] = -A[i][j] / A[i][i];
			}
		}
		B[i] = B[i] / A[i][i];
		A[i][i] = 0;
	}
	
	for(i = 0;i < NumberOfEquation;i++) {
		solution[i] = B[i];
	}
	
	
	while(fault > fault_input && step <= 1000) {
		for(j = 0;j < NumberOfEquation;j++) {
			TempSolution[j] = 0;
		}
		for(i = 0;i < NumberOfEquation;i++) {
			for(j = 0;j < NumberOfEquation;j++) {
				TempSolution[i] = TempSolution[i] + A[i][j]*solution[j];
			}
			TempSolution[i] = TempSolution[i] + B[i];
		}
		fault = 0.0;
		for(j = 0;j < NumberOfEquation;j++) {
			fault = fault + (solution[j] - TempSolution[j])*(solution[j] - TempSolution[j]);
		}
		fault = sqrt(fault);
		for(j = 0;j < NumberOfEquation;j++) {
			solution[j] = TempSolution[j];
		}
		step++;
	}
	delete []TempSolution;
	return step;
}

void file_input_output(){
	int i, j, row = 0, column = 0;
	double **A, *B, *solution, **temp_matrix, fault_input;
	char k[128];
	//вычисляем размерность введенной расширенной матрицы системы
	ifstream in("input_data.txt");
	while(true) {
		in.read(k, 1);
		if(k[0] == ' ') column++;
		if(k[0] == '\n'){
			row++;
			column++;
		}
		if(in.eof()){
			row++;
			column++;
			break;
		}
	}
	column = column/row;
	in.close();
	//выделяем память под матрицу коэффициентов при неизвестных
	A = new double*[row];
	for(i = 0;i < row;i++){
		A[i] = new double[row];
	}
	//выделяем память под вектор свободных членов
	B = new double[row];
	//выделяем память под вспомогательную матрицу
	temp_matrix = new double*[row];
	for(i = 0;i < column;i++){
		temp_matrix[i] = new double[row];
	}
	//выделяем память под вектор неизвестных
	solution = new double[row];
	//считываем матрицу во временный массив
	ifstream fin("input_data.txt");
	for(i = 0;i < row;i++){
		for(j = 0;j < column;j++){
			fin >> temp_matrix[i][j];
		}
	}
	fin.close();
	//из временного массива выбираем нужные элементы

	//для матрицы коэффициентов при неизвестных
	for(i = 0;i < row;i++){
		for(j = 0;j < column - 1;j++){
			A[i][j] = temp_matrix[i][j];
		}
	}
	//для вектора свободных членов
	for(i = 0;i < row;i++){
		for(j = column - 1;j > column - 2;j--){
			B[i] = temp_matrix[i][j];
		}
	}
	Diagonal(A, row);
	cout << "Введите точность вычислений: ";							
		cin >> fault_input;
	int steps = SimpleIteration(A, B, row, solution, fault_input);
	if(steps > 1000) {
		cout << "Ошибка!!! Возможные причины:\n";
		cout << "1)Слишком большое количество итераций.\n";
		cout << "2)Какие-либо строки(столбцы) линейно зависимы.\n";
	}
	else {
		ofstream out("solution.txt");									
		out << "Решение СЛАУ:\n";
		for(j = 0;j < row;j++) {
			out << solution[j] << "\n";
		}
		out << "Количество итераций: " << steps;
		cout << "Результат вычислений записан в файл 'solution.txt'.\n";
		out.close();
		system("solution.txt");
	}
	//очищаем выделенную память, здесь все нормально
	for(i = 0;i < row;i++) {
	    delete []A[i];
	}
	delete []A;
	delete []B;
	delete []solution;
	//а вот на этом месте,при очистки памяти выделенной под временный
	//массив, прога при работе выдает ошибку(компилится все норм)
	for(i = 0;i < column;i++){
		delete []temp_matrix[i];
	}
	delete []temp_matrix;
}

int main() {
	cout << "Данная программа предназначена для решения СЛАУ методом простых итераций.\n";
    file_input_output();
	system("pause");
	return 0;
}
Вот сама ошибка, среда VS2010.
Код:
Debug Assertion Failed!
...
Expression:_CrtIsValidHeapPointer(pUserData)
...
Плиз, помогите разобраться что не так, просто раньше норм все работало, а щас че т не хочет.
 
Ответить с цитированием

  #5373  
Старый 28.05.2010, 19:20
Linkus
Участник форума
Регистрация: 20.12.2008
Сообщений: 130
Провел на форуме:
436500

Репутация: 11
По умолчанию

Цитата:
Сообщение от qwert135  
Плиз, помогите разобраться что не так, просто раньше норм все работало, а щас че т не хочет.
приведи пример входного файла
 
Ответить с цитированием

  #5374  
Старый 28.05.2010, 19:45
qwert135
Познающий
Регистрация: 22.11.2009
Сообщений: 53
Провел на форуме:
33126

Репутация: 0
По умолчанию

Код:
10 1 1 12
2 10 1 13
2 2 10 14
Все элементы записаны через пробел, лишних нет(пробелов).Количество сторок и столбцов в функции file_input_output() вычисляется верно, проверял.И, кстати, когда открывается файл "solution.txt" решение в нем верное записано.
P.S. какими функциями можно проверить состояние памяти, как например MemAvail и MaxAvail в паскале?

Последний раз редактировалось qwert135; 28.05.2010 в 19:54..
 
Ответить с цитированием

  #5375  
Старый 28.05.2010, 20:11
Linkus
Участник форума
Регистрация: 20.12.2008
Сообщений: 130
Провел на форуме:
436500

Репутация: 11
По умолчанию

а какую точность вводить? вроде считает, результаты выводит, но по закрытию пишет что куча повреждена)) у меня VS 2008 TS
 
Ответить с цитированием

  #5376  
Старый 28.05.2010, 20:19
qwert135
Познающий
Регистрация: 22.11.2009
Сообщений: 53
Провел на форуме:
33126

Репутация: 0
По умолчанию

Цитата:
Сообщение от Linkus  
а какую точность вводить? вроде считает, результаты выводит, но по закрытию пишет что куча повреждена)) у меня VS 2008 TS
Вот таже хрень, точность можно любую, к тому примеру, который я написал, достаточно 0.0001 , и прога выдаст точное решение (1 1 1).Можно конечно убрать
Код:
for(i = 0;i < column;i++){
		delete []temp_matrix[i];
	}
	delete []temp_matrix;
и все будет норм работать, но хотелось разобраться, да и память замусоривать нехорошо))
Вот блин, ща попробовал в CodeBlocks скомпилить и запустить, и о чудо, там все норм.

Последний раз редактировалось qwert135; 28.05.2010 в 20:26..
 
Ответить с цитированием

  #5377  
Старый 28.05.2010, 20:25
Irdis
Участник форума
Регистрация: 06.02.2006
Сообщений: 177
Провел на форуме:
1576821

Репутация: 88
Отправить сообщение для Irdis с помощью ICQ
По умолчанию

Цитата:
temp_matrix = new double*[row];
for(i = 0;i < column;i++){
temp_matrix[i] = new double[row];
}
это бред если column!=row

Последний раз редактировалось Irdis; 28.05.2010 в 20:27..
 
Ответить с цитированием

  #5378  
Старый 28.05.2010, 20:30
qwert135
Познающий
Регистрация: 22.11.2009
Сообщений: 53
Провел на форуме:
33126

Репутация: 0
По умолчанию

Цитата:
Сообщение от Irdis  
это бред если column!=row
Пробовал, тоже самое.Кстати,еще вот это сообщение VS выводит
Код:
Windows has triggered a breakpoint in SLAU.exe.

This may be due to a corruption of the heap, which indicates a bug in SLAU.exe or any of the DLLs it has loaded.

This may also be due to the user pressing F12 while SLAU.exe has focus.

The output window may have more diagnostic information.
 
Ответить с цитированием

  #5379  
Старый 28.05.2010, 20:32
qwert135
Познающий
Регистрация: 22.11.2009
Сообщений: 53
Провел на форуме:
33126

Репутация: 0
По умолчанию

Цитата:
Сообщение от Irdis  
это бред если column!=row
Сори, не туда посмотрел, ту ты прав. Все равно таж ошибка.

Последний раз редактировалось qwert135; 28.05.2010 в 20:35..
 
Ответить с цитированием

  #5380  
Старый 28.05.2010, 20:39
Irdis
Участник форума
Регистрация: 06.02.2006
Сообщений: 177
Провел на форуме:
1576821

Репутация: 88
Отправить сообщение для Irdis с помощью ICQ
По умолчанию

разберитесь где у вас column а где row...
я пытался понять, но сложилось такое впечатление, что они перепутаны в каждой второй строке.
вот кстати как делаются матрицы:
Цитата:
temp_matrix = new double*[row];
for(i = 0;i < row;i++){
temp_matrix[i] = new double[column];
}

for(i = 0;i < row;i++){
delete [] temp_matrix[i];
}
delete [] temp_matrix;
 
Ответить с цитированием
Ответ



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Часто задаваемые вопросы по MySQL Серый PHP 5 28.12.2006 18:26
Интернетчики задали российскому президенту очень странные вопросы podkashey Мировые новости. Обсуждения. 4 07.07.2006 16:53
Вопросы по Ipb 2.0 Voodoo_People Уязвимости CMS / форумов 26 15.02.2005 22:57



Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 


Быстрый переход




ANTICHAT.XYZ