ANTICHAT — форум по информационной безопасности, OSINT и технологиям
ANTICHAT — русскоязычное сообщество по безопасности, OSINT и программированию.
Форум ранее работал на доменах antichat.ru, antichat.com и antichat.club,
и теперь снова доступен на новом адресе —
forum.antichat.xyz.
Форум восстановлен и продолжает развитие: доступны архивные темы, добавляются новые обсуждения и материалы.
⚠️ Старые аккаунты восстановить невозможно — необходимо зарегистрироваться заново.
 |
|

28.05.2010, 06:49
|
|
Постоянный
Регистрация: 29.10.2008
Сообщений: 306
Провел на форуме: 1819761
Репутация:
180
|
|
Сообщение от 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);
}
|
|
|

28.05.2010, 18:52
|
|
Познающий
Регистрация: 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)
...
Плиз, помогите разобраться что не так, просто раньше норм все работало, а щас че т не хочет.
|
|
|

28.05.2010, 19:20
|
|
Участник форума
Регистрация: 20.12.2008
Сообщений: 130
Провел на форуме: 436500
Репутация:
11
|
|
Сообщение от qwert135
Плиз, помогите разобраться что не так, просто раньше норм все работало, а щас че т не хочет.
приведи пример входного файла
|
|
|

28.05.2010, 19:45
|
|
Познающий
Регистрация: 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..
|
|
|

28.05.2010, 20:11
|
|
Участник форума
Регистрация: 20.12.2008
Сообщений: 130
Провел на форуме: 436500
Репутация:
11
|
|
а какую точность вводить? вроде считает, результаты выводит, но по закрытию пишет что куча повреждена)) у меня VS 2008 TS
|
|
|

28.05.2010, 20:19
|
|
Познающий
Регистрация: 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..
|
|
|

28.05.2010, 20:25
|
|
Участник форума
Регистрация: 06.02.2006
Сообщений: 177
Провел на форуме: 1576821
Репутация:
88
|
|
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..
|
|
|

28.05.2010, 20:30
|
|
Познающий
Регистрация: 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.
|
|
|

28.05.2010, 20:32
|
|
Познающий
Регистрация: 22.11.2009
Сообщений: 53
Провел на форуме: 33126
Репутация:
0
|
|
Сообщение от Irdis
это бред если column!=row
Сори, не туда посмотрел, ту ты прав. Все равно таж ошибка.
Последний раз редактировалось qwert135; 28.05.2010 в 20:35..
|
|
|

28.05.2010, 20:39
|
|
Участник форума
Регистрация: 06.02.2006
Сообщений: 177
Провел на форуме: 1576821
Репутация:
88
|
|
разберитесь где у вас 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;
|
|
|
|
 |
|
|
Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
|
|
|
|