Программа работает только с символами {} в файле .h - PullRequest
0 голосов
/ 10 апреля 2020

У меня есть три файла. Почему программа работает только с символами {} в файле .h?

szereg. c:

    #include "szereg.h"

double szereg(double x, double eps, int *sw, int *M, int *stop){ 

    double s, w;
    int i = 2;
        s=x;
        w=x;
    do{ 
        if(*sw==*M){
            if(fabs(w)<=eps && *sw==*M)
                *stop =3;
            else
                *stop = 1;
            return s;
        }
        w=((-w*x)/i)*(i-1);
        s=s+w;
        *sw+=1;
        i++;
    } 
    while (fabs(w) >= eps); 

    *stop = 2;

    return s; 
}

szereg.h:

    double szereg(){};

main. c:

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

        FILE *fw; 
        extern double szereg(); 

        int main(){ 

            int lp, sw=1, M, stop = 0;
            double a, b, dx, x, y, eps, z; 
            char *stopwar = "";



            if((scanf("%lf %lf %d %lf %d", &a, &b, &lp, &eps, &M) != 5) || a<=-1 || b>1 || eps<0.0 || lp<1){ 
                printf("Blad danych\n"); 
                system("pause"); 
            exit(1); 
        } 

        if(!(fw = fopen("wyniki.txt", "w"))){ 
            printf("Blad otwarcia zbioru\n"); 
            exit(2); 
        } 

        dx=(b-a)/lp;

        for(x = a; x <= b + 0.5*dx; x += dx){ 
            y = szereg(x, eps, &sw, &M, &stop); 
            z = log(x+1); 

            sw=1;
        } 

        fclose(fw); 
        exit(0); 
        system("pause"); 
    } 

1 Ответ

5 голосов
/ 10 апреля 2020

Позвольте мне угадать: без фигурных скобок вы получаете ошибку компоновщика вдоль линий неразрешенного символа.

Вот в чем дело, эти два утверждения точно одинаковы для компилятор:

extern double szereg();
double szereg(); // without {} is exactly the same as with extern

Компилятору сообщается, что существует символ szereg, который принадлежит функции, которая возвращает значение типа double и принимает неопределенное количество аргументов. Однако он не «склеивает» различные блоки компиляции.

Вам необходимо скомпилировать каждый файл .c отдельно в объектный файл, а затем связать все объектные файлы вместе на последнем этапе компоновки. Пока вы, вероятно, связываете только основной объектный файл и ничего больше.

...