Trojkat Pascala – odszukanie błędów w kodzie

0

Cześć, mógłby ktoś zobaczyć gdzie mam błędy w kodzie? Program ma wyświelić podany wiersz z trójkąta. W DevCpp i QtCreator po kompilacji mam nieprawidłowe wyniki, ale jeden kompilator online - https://www.onlinegdb.com/online_c_compiler dał prawidłowy wynik dla tego samego kodu.

#include <stdio.h>
#include <stdlib.h>
 
int * trojkatPascala(int n) {
    int tab[n+1];
    tab[0] = 1;
    tab[n] = 1;
    int i;
    
    for (i = 1; i < n; i++) {
        tab[i] = * (trojkatPascala(n-1)+i-1) + * (trojkatPascala(n-1)+i);
    }
    int * wsk = tab;
    return wsk;
}
 
 
int main()
{
    int n;
    printf("Podaj n\n");
    scanf("%d", &n);
    int * wsk = trojkatPascala(n);
 	int i;
 
    for (i = 0; i < n+1; i++) {
        printf("%d ", *(wsk++));
    }
 
    return 0;
}
6

Popularny błąd w C. Masz jakiś bufor typu "auto" czyli na stosie, bierzesz od niego wskaźnik i wskaźnik zwracasz. Wskaźnik jest, tyle że wskazywanego obszaru chwilę później NIE MA. W "moich czasach" mówiło się syndrom Misia Yogi, co będąc nad przepaścią to zauważa "Oo, going down" i spada.

Jest to mówiąc po ludzku błąd, w formalny sposób mówi się "undefined behaviour"

int * trojkatPascala(int n) {
    int tab[n+1];
  ......  
    int * wsk = tab;
    return wsk;
}
 
0

Rozwiązaniem Twojego problemu jest stworzenie tablicy w funkcji main i przekazanie jej wskaźnika:

int tab[n + 1];
trojkatPascala(tab, n);

Tablicę można też stworzyć przydzielając pamięć dynamicznie:

int* tab = malloc((n + 1) * sizeof(int));
trojkatPascala(tab, n);
// ...
free(tab);

Zmień nagłówek funkcji:

void trojkatPascala(int* tab, int n)
0

Swoją drogą, nie ma potrzeby liczyć tego rekurencyjnie. Zakładając numerację od 0, można to zrobić iteracyjnie w taki sposób:

vector<int> pascalTraingleRow(int row) {
    vector<int> res;
    long long val = 1;
    for (long long i = 0; i <= row; i++) {
        res.push_back(val);
        val *= (row - i);
        val /= (i + 1);
    }
    return res;
}
0

No dobra, bo ktoś się oburzył, że nie ten język i może op sobie nie poradzi z konwersją:

struct int_vec {
    int *data;
    int size;  
};

struct int_vec create_int_vec(int size) {
    struct int_vec res;
    res.data = malloc(size * sizeof(int));
    res.size = res.data ? size : 0;
    return res;
}

struct int_vec pascal_traingle_row(int row) {
    struct int_vec res = create_int_vec(row + 1);    
    long long val = 1;
    for (int i = 0; i < res.size; i++) {
        res.data[i] = val;
        val *= (row - i);
        val /= (i + 1);
    }
    return res;
}

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