未定义的函数引用 - 学习C

neb*_*ffa 1 c

我正在通过将我在Python中完成的一些事情转换为C来学习C.我在来到这里之前尽可能地尝试在线查看,但似乎很难找到我正在寻找的答案.

接下来是米勒 - 拉宾测试的我(迄今为止)对一个数字的素数的翻译.

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

_Bool prime(long long n);

int main() {
    int i = 6;
    for (i; i < 9; i++) {
        if (prime(i)) {
            printf("%i\n", prime(i));
        }
    }
}

_Bool prime(long long n) {
    int s = 0;
    int r = 0;
    int a_index = 0;
    // printf("the value of a_index when initialised is: %d\n", a_index);
    // printf("the value of s when initialised is: %d\n", s);
    int *a_list;
    _Bool is_prime = 1;
    _Bool composite_part_a = 1;
    _Bool composite_part_b = 1;
    long long d = n - 1;
    while (d % 2 == 0) {
        s++;
        d = d / 2;
    }

    if (4759123141 <= n && n < 2152302898747) {
        // malloc
        a_list[0] = 2;
        a_list[1] = 3;
        a_list[2] = 5;
        a_list[3] = 7;
        a_list[4] = 11;
    }
    else if (9080191 <= n && n < 4759123141) {
        // malloc
        a_list[0] = 2;
        a_list[1] = 7;
        a_list[2] = 61;
    }
    else if (1373653 <= n && n < 9080191) {
        // malloc
        a_list[0] = 31;
        a_list[1] = 73;
    }           
    else if (4 <= n && n < 1373653) {
        a_list = (int *) malloc(sizeof(int) * 2);
        a_list[0] = 2;
        a_list[1] = 3;
        printf("the value of a_list[0] upon its first assignment is: %d\n", a_list[0]);
        // printf("the first element of a_list is: %d\n", a_list[0]);
        // printf("the second element of a_list is: %d\n", a_list[1]);
    }
    else if (n == 3 | n == 2) {
        return 1;
    }
    else if (n % 2 == 0 | n == 1) {
        return 0;
    }

    printf("the value of a_list[0] over here is: %d\n", a_list[0]);
    // printf("%d\n", a_list[1]);  
    for (a_index; a_index < sizeof(a_list) / sizeof(int); a_index++) {
        printf("test");
        if ((long long)pow(a_index[a_list], d) % n != 1) {
            composite_part_a = 1;
        }
        else {
            composite_part_a = 0;
        }


        // printf("the value of r is: %d\n", r);
        // printf("the value of s is: %d\n", s);
        for (r; r < s; r++) {
            printf("%lld\n", (int)pow(a_list[a_index], exp2(r) * d) % n);
            if ((long long)pow(a_index[a_list], exp2(r) * d) % n != -1) {
                composite_part_b = 1;
            }
            else {
                composite_part_b = 0;
                break;
            }
            }

        if (composite_part_a && composite_part_b) {
            return 0;
        }
        }

    return is_prime;
    }
Run Code Online (Sandbox Code Playgroud)

学习C的麻烦在于,对于纯粹的初学者来说,没有太多好的文献,除了我听到的关于K&R的内容,但是在邮件中,我现在无法掌握它.该程序返回以下错误:

3.c: In function ‘prime’:
3.c:52:26: warning: incompatible implicit declaration of built-in function ‘malloc’ [enabled by default]
/tmp/ccGQnk9T.o: In function `prime':
3.c:(.text+0x272): undefined reference to `pow'
3.c:(.text+0x2b9): undefined reference to `exp2'
3.c:(.text+0x2db): undefined reference to `pow'
3.c:(.text+0x30b): undefined reference to `exp2'
3.c:(.text+0x32d): undefined reference to `pow'
collect2: ld returned 1 exit status
Run Code Online (Sandbox Code Playgroud)

首先,我没有包括介绍战俘和其他?我知道提出两个问题是不恰当的,我的主要问题是关于pow和exp2,但是如果你对malloc有建议,可以随意加入.

Som*_*ude 5

您还需要链接数学库,默认情况下不包含它.

类似于以下命令:

$ gcc 3.c -lm
Run Code Online (Sandbox Code Playgroud)

注意-lm参数...它告诉链接器添加库(-l部件)和库的名称(m部件).