Dziwny błąd w programie.

0

Witam! Napisałem program w C, który oblicza liczbę pi ze wzory rekurencyjnego, oto on:

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

float pi(float x, int k, int counter);

int main(void)
{
    float x;
    int k;

    int result =  scanf("%f %d", &x, &k);

    if (result != 2 || !(x>0) || !(k>1)) exit(0);

    printf("\nPierwiastek kwadratowy z x to: %.12f\n",sqrt(x));

    for (int counter=1; counter<k; counter++) printf("\n%.12f\t\t%.12f",pi(x,k,counter),pi(x,k,counter)-sqrt(x));

    return 0;
}

float pi(float x, int k, int counter)
{
    float *p[k], *pointer;

    pointer = p[0];
    *pointer = 1;

    *(pointer+counter) = ((x/(*(pointer+counter-1)))+(*(pointer+counter-1)))/2;

    return *(pointer+counter);

}

Sprawa wygląda tak, że bez problemu się kompiluje, nie ma żadnych błędów ani ostrzeżeń, ale gdy podam x równy 4 i k równe 9 to wyskakuje błąd że program przestał działać, a np. dla danych x równe 2 i k równe 4 program działa. Proszę. pomóżcie znaleźć błąd.

0

Próbowałeś debugować?

0

A co tu debugować, zwykły segfault.

float p[k], *pointer;

bo chcesz tam mieć tablicę floatów przecież, sądząc po tym co potem robisz.

0

D:\ANSI C\pi4.c||In function 'pi':|
D:\ANSI C\pi4.c|27|error: incompatible types when assigning to type 'float *' from type 'float'|
||=== Build finished: 1 errors, 0 warnings ===|

Po Twojej sugestii wywala błąd.

0

Teraz działa OK, tzn wypisuje dane, ale takie jakby wskaźnik wychodzi poza zakres tablicy tzn. wypisuje coś typu "inf", "-inf" i inne dziwne rzeczy. Dzieje się tak dla danych np x=5 k=20.

0

Niestety debugger nic się nie odzywa, macie jakieś pomysły?

0

Dopiero teraz popatrzyłem na to co ten kod rzekomo robi. Czy ty jesteś normalny? Przecież ta funkcja pi() jest bez sensu! Ona nie ma prawa działać. Zdajesz sobie sprawę z tego ze tablica tworzona lokalnie wewnarz funkcji zostanie ZNISZCZONA po wyjściu z niej? I w nowym wywołaniu funkcji to już NIE JEST TA SAMA tablica? Rozumiem ze w zamyśle chciałeś napisać coś takiego:

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

float pi(float x, int k, float* p, int counter);

int main(void) {
    float x;
    int k;

    int result = scanf("%f %d", &x, &k);

    if (result != 2 || !(x > 0) || !(k > 1))
        exit(0);

    printf("\nPierwiastek kwadratowy z x to: %.12f\n", sqrt(x));

    float* previousValues = (float*) malloc(sizeof(float) * k);
    previousValues[0] = 1.0;
    for (int counter = 1; counter < k; counter++) {
        float calculatedPi = pi(x, k, previousValues, counter);
        printf("\n%.20f\t\t%.20f", calculatedPi, calculatedPi - sqrt(x));
    }
    return 0;
}

float pi(float x, int k, float* p, int counter) {
    p[counter] = ((x / (p[counter - 1])) + (p[counter - 1])) / 2.0;
    return p[counter];
}

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