Obliczanie wyznacznika macierzy kwadratowej z wykorzystaniem funkcji

0

Hej,
Próbuję utworzyć funkcję, która po otrzymaniu jako parametru macierzy kwadratowej, czyli tablicy dwuwymiarowej, obliczy jego wyznacznik

double wyznacznik (int **wyznacznik, int size)
{
    if (size == 1) return wyznacznik[0][0];
    else if (size == 2)
        return wyznacznik[0][0] * wyznacznik[1][1] - wyznacznik[0][1] * wyznacznik[1][0];
    return 0;
}
int main()
{
    int size;
    cout << "Wprowadz wielkosc macierzy:\t"; cin >> size;
    int macierz[size][size];
    // wprowadzanie wartosci macierzy
    cout << "wyznacznik dla wprowadzonej macierzy to: "<<wyznacznik(macierz);
}

Kompilator wskazuje na błąd w miejscu wywołania funkcji. Nie wiem, czy to co próbuję zrobić, jest w ogóle możliwe w tym języku.

0

Aha,

Oczywiście zmieniłem prototyp funkcji na:

int wyznacznik (int **wyznacznik, int size)

Bo wyznacznik w wypadku wartości całkowitych, może być tylko całkowity.

Oczywiście, prototyp funkcji to

int wyznacznik (int **macierz, int size)

Nie wiem, dlaczego napisałem, że parametrem jest zmienna wyznacznik -.-
Tak czy siak, błąd, który się pojawia to:

main.cpp|27|error: cannot convert 'int (*)[(((sizetype)(((ssizetype)size) + -1)) + 1)]' to 'int**' for argument '1' to 'int wyznacznik(int**, int)'|

dodanie znacznika <code> dla treści błędu - fp

0

Kompilator to odrzuca bo to są różne wzajemnie niekompatybilne typy.

int** a1 to wskaźnik (lub pierwszy element tablicy wskaźników) na wskaźnik (lub pierwszy element tablicy wskaźników) na int. Adres elementu a1[1][1] nie jest możliwy do statycznego obliczenia i zależy od wartości wskaźnika a1[1].

int a2[x][x] to tablica x tablic x intów. Adres elementu a2[1][1] jest możliwy do statycznego obliczenia (w kontekście adresu a2, w każdym razie), kompilator musi tylko dokonać prostego przesunięcia.

W Twoim przypadku musisz zmienić sygnaturę funkcji:

int wyznacznik (int macierz[5][5], int size)

lub, jeśli chcesz aby kompilator wymuszał poprawny rozmiar tablicy:

int wyznacznik (int (*macierz)[5][5], int size)

wtedy wołasz w ten sposób:

wyznacznik(&macierz);
0

Tu potrzebna jest tablica dynamiczna, gdyż rozmiar tablicy nie jest znany w momencie kompilacji. Ponieważ to C++ można użyć valarray. Jednak to raczej nie dla początkującego. Pozostaje zatem tablica dynamiczna (najprościej) lub wektor wektorów, wktórym jest operator [].

1

Bo za mało zmiennych nazwałeś wyznacznik ot tylko samą funkcję oraz argument dziwię się czemu ci size nie nazywa się również wyznacznik.

A tak na poważnie, może o to ci chodzi:

#include <iostream>
using namespace std;

template<unsigned size> int wyznacznik (int (&macierz)[size][size])
  {
   if(size==1) return macierz[0][0];
   if(size==2) return macierz[0][0]*macierz[1][1]-macierz[0][1]*macierz[1][0];
   return 0;
  }

int main()
  {
   int m1[1][1]={{99}};
   int m2[2][2]={{2,3},{4,5}};
   cout<<"wyznacznik dla wprowadzonej macierzy to: "<<wyznacznik(m1)<<endl;
   cout<<"wyznacznik dla wprowadzonej macierzy to: "<<wyznacznik(m2)<<endl;
   return 0;
  }

http://ideone.com/WrUcp7

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