В массиве tmp, начиная с позиции n*n+n+i, где i=0..n происходят чудеса. Верные результаты там лишь через раз и то при стоящей точки останова перед выходом из функции. Без точки останова результат неверен всегда. В чём может быть дело ?
При обычном запуске ответ всегда таков:
C точкой останова бывает ошибается также:
А бывает с точкой останова и верный результат: (чаще чем неверный)
#include <stdio.h>
#include <time.h>
#include "lss_15_06.h"
extern int d, e;
double fabs(double x) {
if (x < 0)
return -x;
return x;
}
void find_max(int n, double *A, double *B, double *tmp, int k) {
int i, j, x, y;
x = y = 0;
double _tmp = A[k * n + k];
for (i = k; i < n; i++)
for (j = k; j < n; j++)
if (fabs(A[i * n + j]) > fabs(_tmp)) {
_tmp = A[i * n + j];
x = i;
y = j;
}
if (x == 0 && y == 0)
return;
double aij;
for (j = 0; j < n; j++) {
aij = A[k * n + j];
A[k * n + j] = A[x * n + j];
A[x * n + j] = aij;
}
aij = B[k];
B[k] = B[x];
B[x] = aij;
int val = (int) tmp[n * n + n + k];
tmp[n * n + n + k] = x;
tmp[n * n + n + x] = val;
for (i = 0; i < n; i++) {
aij = A[i * n + k];
A[i * n + k] = A[i * n + y];
A[i * n + y] = aij;
}
}
int lss_19_07(int n, double *A, double *B, double *X, double *tmp) {
int i, j, k;
clock_t time;
if ((time = clock()) == -1) {
if (e == 1)
perror("Время недоступно на данной платформе");
return 9;
}
if (d == 1)
printf("Начинаем приводить матрицу к единичной\n");
for (i = 0; i < n; i++)
tmp[n * n + n + i] = i;
for (k = 0; k < n; k++) {
if (d == 1)
printf("Номер шага: %d\n", k + 1);
if (d == 1)
printf("Ищем максимальный в подматрице элемент и делаем его разрешающим\n");
find_max(n, A, B, tmp, k);
if (d == 1) {
clock_t time2 = clock() - time;
printf("Нашли\n");
printf("Текущее время: %f\n\n", (double) time2);
}
for (j = k; j < n; j++)
tmp[k * n + j] = A[k * n + j] / A[k * n + k];
tmp[n * n + k] = B[k] / A[k * n + k];
if (d == 1) {
clock_t time2 = clock() - time;
printf("Делим на разрешающий элемент строку матрицы\n");
printf("Текущее время: %f\n\n", (double) time2);
}
for (i = 0; i < n; i++) {
for (j = k; j < n; j++)
if (i != k)
tmp[i * n + j] = A[i * n + j] - A[i * n + k] * tmp[k * n + j];
if (i != k)
tmp[n * n + i] = B[i] - A[i * n + k] * tmp[n * n + k];
}
if (d == 1) {
clock_t time2 = clock() - time;
printf("Зануляем элементы матрицы на текущем шаге\n");
printf("Текущее время: %f\n\n", (double) time2);
}
for (i = 0; i < n * n; i++)
A[i] = tmp[i];
for (i = 0; i < n; i++)
B[i] = tmp[n * n + i];
if (d == 1) {
clock_t time2 = clock() - time;
printf("Завершили %d шаг\n", k + 1);
printf("Текущее время: %f\n\n", (double) time2);
}
}
int ind = 0;
for (i = 0; i < n; i++) {
ind = (int) tmp[n * n + n + i];
//printf("%d ", ind);
X[ind] = B[ind];
}
return 0;
}