2011-06-04 69 views
0

由於某種原因,它曾經工作。但現在我得到一個SIGFPE .....有什麼不對?爲什麼會有SIGFPE?

#include "usefunc.h" 

long factorial(long num) { 
    if (num > 1) { 
     long counter; 
     long fact = 1; 
     for (counter = num; counter > 0; counter--) fact *= counter; 
     return fact; 
    } 
    else return 0; 
} 

long combinations(long n, long k) { 
    return (factorial(n))/(factorial(k)*factorial(n-k)); 
} 

int main() 
{ 
    printf("How many rows of Pascal\'s triangle should I print?\t"); 
    int rows = GetInteger(); 
    long pArray[rows][rows]; 
    int counter; 
    int counter2; 
    for (counter = 1; counter <= rows; counter++) 
    { 
     int y = rows-counter; 
     for (; y > 0; y--) printf(" "); 
     for (counter2 = 0; counter2 <= counter; counter2++) 
     { 
      /* 

        THIS IS AN OUTPUT 

      */ 
      printf("%9.0lu", (long) combinations(counter, counter2)); 
      pArray[counter][counter2] = (long) combinations(counter, counter2); 
     } 
     /* 

        THIS IS AN OUTPUT 

     */ 
     printf("\n"); 
    } 
    return 0; 
} 

回答

6

您的因子返回0,然後可能會導致除以0的錯誤。它不應該返回1嗎?


[email protected]:/tmp$ cat test.c; make test;./test 
#include <stdio.h> 
int main() { 
return printf("%f\n", 1L/0); 
} 
cc  test.c -o test 
test.c: In function ‘main’: 
test.c:3: warning: division by zero 
Floating point exception 
+0

長分長不是浮點異常。而更好的解決辦法可能是在'k' = 0 && k <= n'的組合中添加一個檢查。 – 2011-06-04 04:39:53

+0

謝謝。已解決:) – tekknolagi 2011-06-04 04:39:54

+1

這是正確的 - 將一個整數除零將導致一個'SIGFPE'。有趣的是,將浮點數除以零不會導致'SIGFPE'。 – 2011-06-04 04:41:34

2

我認爲這是你的combinations功能,你還沒有告訴我們,因爲沒有你給的代碼使用任何浮點任何責任。


SIGFPE does not mean floating-point exception,即使這是名稱的來源。 @jcomeau已正確識別出您獲得SIGFPE的原因。

+0

哎呦,將增加這些... – tekknolagi 2011-06-04 04:33:58

+0

@tekknolagi:好吧,我沒有看到任何浮點任何地方。但是你有一堆無用的演員。另外你的「組合」功能是天真地執行的,它的內部變量會在結果發生之前溢出很長時間。 – 2011-06-04 04:38:34