2013-07-04 21 views
6

Istnieją dwa pytania dotyczące kodu pisał poniżej:

        1), gdy ten kod na CodeBlocks kod czasami z powodzeniem działa (powrót 0), ale zazwyczaj skutkuje błąd po tym, jak pokazuje wszystkie wyniki (zwracając -1073741819). Dlaczego tak jest?

        2) Wszystkie wartości są prawidłowe, z wyjątkiem ostatniego elementu tablicy, w którym wartość powinna wynosić 1 (pTriangle [20] = 1). Jednak na końcu otrzymuję numer śmieci, co robię źle?

Zdałem sobie sprawę, że mogę osiągnąć ten sam wynik ze współczynnikami dwumianowymi, ale wciąż nie mam pojęcia, dlaczego otrzymuję błąd i byłoby najlepiej, gdyby mój błąd mógł zostać znaleziony.
Aktualizacja1:
pTriangle[i] = temp[i % 2 ? 0 : 1] + pTriangle[i]; wydaje się być problemem. Kiedy skomentowałem ten kod, program się nie zawiesił. Próbuję dowiedzieć się, dlaczego ulega awarii i próbuje znaleźć rozwiązanie wokół niego :)Tworzenie Pascala Trójkąt (niestabilny kod)

#include <stdio.h> 
#include <stdlib.h> 

#define LEVEL 20 

int main() 
{ 
    int *pTriangle = (int*)malloc(sizeof(int)*(LEVEL+1)); 
    int i; 

    for (i = 0; i < LEVEL; i++) 
     pTriangle[i] = 0; 

    createPascalTriangle(pTriangle, LEVEL); 

    for(i = 0; i < LEVEL+1; i++) 
     printf("pTriangle[%d]: %d\n", i, pTriangle[i]); 

    free(pTriangle); 

    return 0; 
} 

int createPascalTriangle(int *pTriangle, int level){ 
    if (level <= 0) 
     return 0; 
    pTriangle[0] = 1; 
    pTriangle[1] = 1; 
    int i; 
    for (i = 2; i <= level; i++) 
     increasePascalTriangleOneLevel(pTriangle); 

    return 1; 
} 

int increasePascalTriangleOneLevel(int *pTriangle){ 
    int i = 1; 
    int temp[2] = {0}; 

    temp[0] = pTriangle[0]; 
    while (pTriangle[i] != 0){ 
     temp[i % 2] = pTriangle[i]; 
     pTriangle[i] = temp[i % 2 ? 0 : 1] + pTriangle[i]; 
     i++; 
    } 
    pTriangle[i] = 1; 

    return 1; 
} 
+0

Wow. Jest wcięty! –

+0

Aha. Dziękuję :) – kpark

Odpowiedz

1

Ostatni element tablicy nie został zainicjowany.

Zapis:

for (i = 0; i < LEVEL + 1; i++) 
    pTriangle[i] = 0; 

zamiast:

for (i = 0; i < LEVEL; i++) 
     pTriangle[i] = 0; 
+0

Przy okazji ten kod nie pasuje do standardu. (np. Visual Studio nie kompiluje go.) Zadeklaruj swoją funkcję, zanim z niej skorzystasz. – szedjani

+1

Myślę, że to dokładnie to. Udało mi się to dobrze, ale valgrind ostrzegł o dostępie do niezainicjowanej pamięci o 'while (pTriangle [i]! = 0)' (Index 20). – Macattack

+0

W wielu przypadkach jest to 0 bez inicjalizacji, ale nie możesz być tego pewien. – szedjani

Powiązane problemy