Macierz schodkowa - tworzenie według algorytmu

Odpowiedz Nowy wątek
2011-12-11 17:02
kubusqqq
0

Witam. Piszę program obliczający macierz schodkową. Podczas kompilacji nie wyrzuca żadnych błędów, zaś podczas uruchamiania wyskakuje błąd "Naruszenie ochrony pamięci". Prawdopodobnie oznacza to, że gdzieś odwołuje się do pamięci, która nie istnieje. Męczę się nad tym już kupę czasu i nie mogę tego ogarnąć. Tutaj jest cały algorytm:
http://edu.i-lo.tarnow.pl/inf/alg/005_root/0006.php - to jest pierwszy schemat blokowy.

Dostaję adres do struktury ab, a w niej mam dobule ** v;
n - ilość równań
Odjąłem od ilości równań 1, żeby mi się zgadzały współrzędne i, j do v[][]. Z tegi samego powodu na początku dałem i = 0.
Początkujący programista prosi bardzo serdecznie o pomoc.
Mój kod to:

 void gauss(struct macierz * ab)
{
        int n; //liczba układów równań <=> liczba niewiadomych
        n = ab->r - 1 ;
        int i = 0; // takie nasze r
        int j = 0;      //takie nasze c
        double m = 0;  //zmienna pomocnicza
        int k = 0;     //kolejna zmienna pomocnicza
        for(i = 0; i < n; ++i)  
        {
                for(j = i + 1; j <= n; ++j);  
                {
                        m = -(ab->v[j][i])/(ab->v[i][i]);
                        for(k = i + 1; k <= (n+1); ++k)             
                        {
                              ab->v[j][k] = ab->v[j][k] + m * ab->v[i][k];
                        }
                }
        }
}

Pozostało 580 znaków

2011-12-11 17:21
0

Nie zagłębiałem się dokładnie, ale patrząc na tamtą stronę widzę, że zamieniłeś liczniki pętli, może to przez to.


Co kurła debuguj ten kod i streszczaj się klientowi chce się fixa, a jak nie kurła to odpale visuala i ci pomoge a tego byś nie chciał

Pozostało 580 znaków

2011-12-11 17:23
kubusqq
0

A dokładniej który licznik gdzie powinien być? Według mnie jest dobrze, ale prawdopodobnie się mylę.

Pozostało 580 znaków

2011-12-11 17:27
0

To chyba ta funkcja?

bool EliminujX(int n, double AB[][MAXEQ+1])
{
  int    i,j,k;
  double m;

  for(i = 0; i < n - 1; i++)
  {
    if(fabs(AB[i][i]) < EPS) return false;
    for(j = i + 1; j < n; j++)
    {
      m = -AB[j][i] / AB[i][i];
      for(k = i + 1; k <= n; k++) AB[j][k] += m * AB[i][k];
    }
  }
  return true;
}

Ty masz zamienione iz j jeszcze kilka rzeczy inaczej robisz, np. inkrementujesz liczniki prefiksowo, tu jest post. Nie wiem czy o to chodzi.


Co kurła debuguj ten kod i streszczaj się klientowi chce się fixa, a jak nie kurła to odpale visuala i ci pomoge a tego byś nie chciał

Pozostało 580 znaków

2011-12-11 20:32
kubusqq
0

Wstawiłem tam układ równań, elegancko mi się rozwiązał, ale nie wyszła mi macierz schodkowa! Wyszło mi coś dziwnego, co nie przypomina macierzy schodkowej. Ktoś by mógł mi napisać, czemu tak się dzieje? W załączniku jest screen. Te dwie macierze na gorze to są macierze z danymi, potem jest wypisana macierz schodkowa a na samym końcu są niewiadome.

Pozostało 580 znaków

2011-12-11 20:49
kubusqq
0

Przepraszam, wstawiłem niepełny obrazek. Przedostatnia macierz to AB, a ostatnia to macierz schodkowa, która w sumie nie wygląda na schodkową.

Pozostało 580 znaków

2011-12-12 17:15
0

Czy na pewno jesteś pewien, że dobrze napisałeś funkcję?


Co kurła debuguj ten kod i streszczaj się klientowi chce się fixa, a jak nie kurła to odpale visuala i ci pomoge a tego byś nie chciał

Pozostało 580 znaków

2011-12-12 18:52
kubusqq
0

Tak. Właściwie to ją żywcem skopiowałem z tamtej strony.

Pozostało 580 znaków

2011-12-12 19:00
0

Chodzi o tą EliminujX? Bo ja widzę, że się różnią.


Co kurła debuguj ten kod i streszczaj się klientowi chce się fixa, a jak nie kurła to odpale visuala i ci pomoge a tego byś nie chciał

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0