2013-07-04 8 views
6

Ci sono due domande riguardanti il ​​codice pubblicato di seguito:

        1) Quando ho eseguito questo codice sul CodeBlocks, il codice viene eseguito a volte con successo (ritorno 0), ma di solito si traduce in un errore dopo che mostra tutti i risultati (restituendo -1073741819). Perché è così?

        2) I valori sono tutti corretti tranne l'ultimo elemento dell'array in cui il valore deve essere 1 (pTriangle [20] = 1). Tuttavia, alla fine ottengo del numero di rifiuti, cosa sto sbagliando?

Ho capito che potrei arrivare allo stesso risultato con coefficienti binomiali ma non ho ancora idea del motivo per cui sto ricevendo l'errore e sarebbe meglio se il mio errore fosse trovato.

Update1:
pTriangle[i] = temp[i % 2 ? 0 : 1] + pTriangle[i]; sembra essere il problema. Quando ho commentato questo codice, il programma non si è bloccato. Sto cercando di scoprire il motivo per cui si blocca e cercando di trovare una soluzione intorno ad esso :)Creazione Triangolo di Pascal (codice instabile)

#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. È rientrato! –

+0

Aha. Grazie :) – kpark

risposta

1

L'ultimo elemento della matrice non è stato inizializzato.

scrittura:

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

invece di:

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

Tra l'altro questo codice non corrisponde allo standard. (ad esempio Visual Studio non lo compila). Dichiara la tua funzione, prima di usarla. – szedjani

+1

Penso che sia esattamente così. Ha funzionato bene per me, ma valgrind ha dato un avvertimento per accedere alla memoria non inizializzata a 'while (pTriangle [i]! = 0)' (Index 20). – Macattack

+0

In molti casi è 0 senza alcuna inizializzazione, ma non puoi esserne certo. – szedjani