Reklama
Pokazuje wyniki od 1 do 9 z 9

Temat: [C] Problem z tablicą dwuwymiarową

  1. #1
    Avatar Ligar
    Data rejestracji
    2006
    Położenie
    wielkość fizyczna określająca umiejscowienie danego ciała w przestrzeni.
    Wiek
    29
    Posty
    666
    Siła reputacji
    18

    Domyślny [C] Problem z tablicą dwuwymiarową

    Piszę program obliczający wyznacznik macierzy pobranej z pliku.
    Jednak nie wiem czemu nie mogę "ręcznie" odnieść się do poszczególnych elementów tablicy.

    Problem znajduje się w funkcji det.
    Nie ma żadnego problemu jeśli za pomocą dwóch forów wyświetlam tablicę, ale już kiedy chcę wyświetlić poszczególne elementy to zaczyna się sypać.

    Kod:
    #include <stdio.h>
    #include <stdlib.h>
    
    
    double det(int n, double matrix[n][n]);
    
    
    int main()
    {
        int n, i=0, j=0;
        double test;
        FILE *fp;
        //Open file
        fp=fopen("omatrix.txt", "r");
        if(!fp){printf("Nie udalo sie wczytac pliku\n"); exit(404);}
        //Check matrix size
        fscanf(fp, "%d", &n);
        printf("%d\n", n);
        //Prepare 2d array and pointer
        double mat[n][n];
        double (*fmat)[n];
        fmat=&mat;
        //Fill 2d array
        for (i; i<n; i++){
            for (j; j<n; j++){
                fscanf(fp, "%d", &mat[i][j]);
            }
            j=0;
        }
        i=j=0;
        //Calculate matrix determinant
        test=det(n, fmat);
        printf("%f", test);
        //Zamkniecie pliku
        fclose(fp);
        return 0;
    }
    
    double det(int n, double matrix[n][n])
    {
        double sum=0.0;
        int i=0, j=0;
        for (i; i<n; i++){
            for (j; j<n; j++){
                printf("%d,%d=", i, j);
                printf("%d ", matrix[i][j]);
            }
            printf("\n");
            j=0;
        }
        if(n==2){
            printf("m[0][0]=%d m[0][1]=%d m[1][0]=%d m[1][1]=%d\n", matrix[0][0], matrix[0][1], matrix[1][0], matrix[1][1]);
            sum = matrix[0][0]*matrix[1][1]-matrix[0][1]*matrix[1][0];
            return sum;
        }
    };
    Wynik tego kodu prezentuje się mniej więcej tak:
    Kod:
    2 //liczba kolumn/wierszy
    0,0=1 0,1=2
    1,0=3 1,1=4
    m[0][0]=1 m[0][1]=1998121361 m[1][0]=2 m[1][1]=1998163157
    0.000000
    Napisałem też na szybko prosty program, żeby sprawdzić czy może tak się w ogóle nie da i źle myślę:

    Kod:
    #include <stdio.h>
    #include <stdlib.h>
    
    
    fun(int y[2][2]);
    
    
    int main()
    {
        int x[2][2];
        int (*xp)[2];
        xp=&x;
        x[0][0]=1;
        x[0][1]=2;
        x[1][0]=3;
        x[1][1]=4;
        printf("%d %d %d %d\n", x[0][0], x[0][1], x[1][0], x[1][1]);
        printf("%d %d %d %d\n", xp[0][0], xp[0][1], xp[1][0], xp[1][1]);
        fun(xp);
        return 0;
    }
    
    
    fun(int y[2][2]){
        printf("%d %d %d %d\n", y[0][0], y[0][1], y[1][0], y[1][1]);
    }
    Ale zwraca on poprawnie:
    1 2 3 4
    1 2 3 4
    1 2 3 4

    //Edit przed napisaniem posta
    Jeszcze zanim skończyłem pisać posta zauważyłem, że jeżeli rozbiję linijkę:
    Kod:
    printf("m[0][0]=%d m[0][1]=%d m[1][0]=%d m[1][1]=%d\n", matrix[0][0], matrix[0][1], matrix[1][0], matrix[1][1]);
    Na:
    Kod:
            printf("m[0][0]=%d\n", matrix[0][0]);
            printf("m[0][1]=%d\n", matrix[0][1]);
            printf("m[1][0]=%d\n", matrix[1][0]);
            printf("m[1][1]=%d\n", matrix[1][1]);
    To wyświetli mi poprawnie elementy tablicy.

    Ale nadal mam problem z obliczeniem wyznacznika.
    Zamieniłem początek na:
    Kod:
            sum = matrix[0][0];
            printf("1sum = %d\n", sum);
            printf("matrix[1][1] = %d\n", matrix[1][1]);
            sum *= matrix[1][1];
            printf("2sum = %d\n", sum);
    I o ile pierwsza suma poprawnie wynosi 1 i samo zczytanie z tablicy poprawnie daje 4, to już druga suma wynosi -1025847289

    Po tym co zaobserwowałem zastanawiam się czy to może problem środowiska skoro długie linijki mu przeszkadzają.
    Z samym wyświetleniem czterech elementów w jednym printf'ie nie było problemu gdy nazwa tablicy była po prostu "y", dopiero gdy nazwa była dłuższa (matrix), to zaczęło się sypać.
    No ale i tak muszę jakoś to naprawić, o ile nie sprawdzałem jeszcze co by było gdybym zamienił nazwę tablicy z "matrix" na np. "m", to pytanie co jeśli taka nazwa i tak by z jakiegoś powodu była za długa (bo na przykład musiałbym jakiejś funkcji użyć z dłuższą nazwą).
    Jak coś to używam Code::Blocks na 64-bitowym Windows 7

    Przepraszam, jeśli błąd jest oczywisty, choroba przeszkadza mi myśleć.
    Ostatnio zmieniony przez Ligar : 12-10-2017, 21:14
    "Mari..., oh my god, Marius Tzekausky"

  2. #2
    Avatar Taidio
    Data rejestracji
    2009
    Położenie
    Sayonara
    Wiek
    29
    Posty
    20,856
    Siła reputacji
    28

    Domyślny

    wrzuć ten plik z macierzą @Ligar ;

  3. Reklama
  4. #3
    Avatar Ligar
    Data rejestracji
    2006
    Położenie
    wielkość fizyczna określająca umiejscowienie danego ciała w przestrzeni.
    Wiek
    29
    Posty
    666
    Siła reputacji
    18

    Domyślny

    W pliku jest tylko to:
    2
    1 2
    3 4
    Macierz jest tylko do testów ogólnie program ma przyjmować plik z dowolną macierzą w postaci
    N
    a11 a12 .. a1n
    a21 a22 .. a2n
    ....................
    an1 an2 .. ann

    Ale póki co robię samą część gdzie macierz jest 2x2, dla większych mam teoretycznie gotową funkcję.

    Właśnie problemem jest tylko fakt, że raz poprawnie wczytuje wartość z tablicy, a innym razem nie i na moje oko, to tylko zależy od długości linijki kodu.
    "Mari..., oh my god, Marius Tzekausky"

  5. #4
    Avatar Tibiarz
    Data rejestracji
    2008
    Położenie
    Tibiantis
    Wiek
    3
    Posty
    15,865
    Siła reputacji
    27

    Domyślny

    Kod:
    double mat[n][n];
    double (*fmat)[n];
    fmat=&mat;
    a komu to potrzebne? a dlaczego?
    poza tym, nie rozumiem, po co robisz tablicę double, jak potem i tak czytasz i wypisujesz int
    rób odstępy pustymi liniami, bo kod się zlewa

  6. #5

    Notoryczny Miotacz Postów ochmar jest teraz offline
    Avatar ochmar
    Data rejestracji
    2017
    Posty
    1,281
    Siła reputacji
    7

    Domyślny

    Weź w tym princie:
    printf("m[0][0]=%d m[0][1]=%d m[1][0]=%d m[1][1]=%d\n", matrix[0][0], matrix[0][1], matrix[1][0], matrix[1][1]);

    %d zamień na %f (albo %lf)(wszędzie)
    Ostatnio zmieniony przez ochmar : 13-10-2017, 08:48

  7. #6

    Data rejestracji
    2011
    Posty
    159
    Siła reputacji
    13

    Domyślny

    Funkcja det nie zwraca wartości, returna masz tylko w if(n==2).
    Ostatnio zmieniony przez Lucie Fearsome : 07-12-2017, 19:54

  8. #7
    Avatar Kusterek
    Data rejestracji
    2013
    Położenie
    Warszawa
    Wiek
    31
    Posty
    1,710
    Siła reputacji
    13

    Domyślny

    Cytuj ochmar napisał Pokaż post
    Cytat został ukryty, ponieważ ignorujesz tego użytkownika. Pokaż cytat.
    Weź w tym princie:
    printf("m[0][0]=%d m[0][1]=%d m[1][0]=%d m[1][1]=%d\n", matrix[0][0], matrix[0][1], matrix[1][0], matrix[1][1]);

    %d zamień na %f (albo %lf)(wszędzie)
    @ochmar ;

    a powiesz nam wszystkim po co miałby zamieniać %d na coś co reprezentuje liczby rzeczywiste, których i tak nigdzie nie używa?

    irc: freenode.net in #torgdevs

  9. #8

    Notoryczny Miotacz Postów ochmar jest teraz offline
    Avatar ochmar
    Data rejestracji
    2017
    Posty
    1,281
    Siła reputacji
    7

    Domyślny

    Cytuj Kusterek napisał Pokaż post
    Cytat został ukryty, ponieważ ignorujesz tego użytkownika. Pokaż cytat.
    [a powiesz nam wszystkim po co miałby zamieniać %d na coś co reprezentuje liczby rzeczywiste, których i tak nigdzie nie używa?
    Cytuj Ligar napisał Pokaż post
    Cytat został ukryty, ponieważ ignorujesz tego użytkownika. Pokaż cytat.
    W pliku jest tylko to:
    2
    1 2
    3 4
    Wyglądają bardzo rzeczywiście jak dla mnie.

  10. #9
    Avatar Kusterek
    Data rejestracji
    2013
    Położenie
    Warszawa
    Wiek
    31
    Posty
    1,710
    Siła reputacji
    13

    Domyślny

    Może źle się wyjaśniłem, zdecydowanie powinno być "nie wykorzystuje (w pełni)".
    W każdym razie, sprowadzenie tego wszystkiego do typu int byłoby zdecydowanie lepszym rozwiązaniem.

    irc: freenode.net in #torgdevs

Reklama

Informacje o temacie

Użytkownicy przeglądający temat

Aktualnie 1 użytkowników przegląda ten temat. (0 użytkowników i 1 gości)

Podobne tematy

  1. Sprzedam Obręcz do kosza, tablica do minikosza, sennheiser hd202
    Przez Towdi w dziale Giełda
    Odpowiedzi: 0
    Ostatni post: 25-04-2015, 23:41
  2. [JAVA] Tablica obiektow
    Przez hefalump w dziale Programowanie
    Odpowiedzi: 1
    Ostatni post: 31-10-2014, 23:24
  3. [C] Tablica - dziwne zachowanie
    Przez Kusterek w dziale Programowanie
    Odpowiedzi: 4
    Ostatni post: 10-02-2014, 12:48
  4. C-tablica dynamiczna
    Przez Puchałke w dziale Programowanie
    Odpowiedzi: 8
    Ostatni post: 29-09-2013, 23:31
  5. Dynamiczna tablica w C (NIE C++)
    Przez zakius w dziale Sprzęt i oprogramowanie
    Odpowiedzi: 2
    Ostatni post: 19-04-2012, 07:49

Zakładki

Zakładki

Zasady postowania

  • Nie możesz pisać nowych tematów
  • Nie możesz pisać postów
  • Nie możesz używać załączników
  • Nie możesz edytować swoich postów
  •