doublench21
@doublench21

Изменяются данные в массиве без ведома?

В массиве tmp, начиная с позиции n*n+n+i, где i=0..n происходят чудеса. Верные результаты там лишь через раз и то при стоящей точки останова перед выходом из функции. Без точки останова результат неверен всегда. В чём может быть дело ?

При обычном запуске ответ всегда таков:
0IcZ4sZ.png

C точкой останова бывает ошибается также:
xC6WtW2.png

А бывает с точкой останова и верный результат: (чаще чем неверный)
26TEAI7.png
#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;
}
  • Вопрос задан
  • 211 просмотров
Пригласить эксперта
Ответы на вопрос 2
@abcd0x00
В чём может быть дело ?

Неясен источник возникновения A и B. Такие симптомы говорят о мусоре в начальных данных.
Ответ написан
Комментировать
Adamos
@Adamos
Если у вас меняются те данные, которые вы не предполагали менять - очевидно, где-нибудь какое-нибудь tmp[n * n + n + i] указывает не на элемент этого массива, а за его пределы (индекс получается больше размера массива).
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы