Error while build C program on Ubuntu

Em moi cai Ubuntu nen ko the type tieng Viet dc, mong moi nguoi thong cam.
Em co’ thu? build 1 chuong trinh C bang terminal thi gap error nhu sau:

/tmp/ccqu41wG.o: In function `CheckPrimeNumber':
helloworld.c:(.text+0x5e): undefined reference to `sqrt'
collect2: error: ld returned 1 exit status

Con day la` source code (em code tren gedit)

#include <stdio.h>
#include <math.h>
#define bool _Bool
#define true 1
#define false 0
bool CheckPrimeNumber(int n)
{
    if (n < 2)
        return false;
    else if (n == 2)
        return true;
    else if (n & 0)
        return false;
    else {
        for (int i = 3; i <= sqrt(n); i += 2) {
            if (n % i == 0)
                return false;
        }
        return true;
    }
}
int main()
{
    int number = 7909;
    if (CheckPrimeNumber(number))
        printf("This is a prime number.\n");
    else
        printf("This is not a prime number.\n");
    return 0;
}

Giup em nhe’, cam on moi nguoi :smiley:

Hi Long Dragon.
Bạn viết hello world trước nhé.

1 Like

Là sao ? Cuốn Head First C có nói cú pháp là: gcc <source file> -o <new file> mà ?
Mình cũng build vài lần thì chạy bình thường, chỉ có trường hợp trên bị lỗi thôi :slight_smile:

Bạn thử link thư viện math xem, biên dịch lại với command

gcc helloworld.c -o helloworld -lm

Hi Long Dragon.
Vậy là do code bạn sai rồi.
Đâu phải do trình biên dịch @_@!

Sao bạn k giúp người ta đi, ngồi đấy cmt kiểu khinh thường người khác vậy?
Ngoài ra code bạn kia chả sai cái quái gì cả

4 Likes

Em build ok roi anh, nhung ket’ qua thi lai … sai :cry:
Ma vi sao phai them -lm the’ a ?

P/S: Cho e hoi? lam` sao de set Sublime lam’ default editor the’ a ? Moi lan’ mo file.c la no hien tren gedit ko a’ :slight_smile:

Vì thư viện math.h chỉ chứa các khai báo thôi, còn các implementation của các hàm trong đấy thì nó nằm ở thư viện libm.so. Để link lại thì đặt thêm flag -lm phía sau. Kết quả thì bạn xem lại thuật toán là được mà.
Set sublime làm default editor bạn có thể tham khảo bài này: http://superuser.com/questions/704046/change-default-text-editor-to-sublime-text-in-linux-mint

Hi OniRanger.
Bạn có thể giúp người khác một lần hai lần đâu thể giúp được cả đời.
Mình cũng không kinh thường ai cả vì không ai có quyền phán xét người khác.

3 Likes

Hi Long Dragon.
Bạn có thể xem log và nhận ra lỗi.

Sau đó chỉ cần copy lỗi đó và tìm trên GG.

Ngay link đầu tiên (Với một số lỗi dị thì có thể tham khảo thêm vài link nữa.)
Sau đó dọc một lúc bạn sẽ thấy có comment
‘‘If you read the man-page for sqrt, you will note that it states to link with -lm’’
Lên GG tìm “sqrt man page”.
VD https://www.mankier.com/3/sqrt.
Khi đó bạn có tài liệu chi tiết của hàm các giá trị trả về mây và mây mây…
Đọc đến cuối trang có danh sách các hàm tương tự.
cbrt(3), exp(3), exp10(3), exp2(3), glutSolidDodecahedron(3), glutWireDodecahedron(3), gmx-editconf(1), hypot(3), log(3), log10(3), log2(3), pow(3).
Khi đó nếu sau này gặp lỗi
undefined reference to `log()’ thì bạn cũng biết cách giải quyết mà không cần lại phải đi hỏi nữa.

1 Like

@Phong_Ky_Vo Uhm, ky nang search cua e van chua tot’ lam’ :frowning:

@freedom vay tai sao cac’ IDE khac’ lai ko bi loi nay a ?
Ma` e ko the set sublime thanh default editor duoc vi file defaults.list chi read-only :frowning:

Nếu bạn code như vậy thì thay bằng i*i <= n luôn đỡ phải dùng hàm sqrt, chứ còn muốn tính căn 2 của n thì nên tính ở ngoài trước vòng lặp thì tốt hơn. Với lại bạn check một số int thì làm i <= n/2 cho đơn giản số int thì giới hạn của nó cũng cỡ 2 tỉ mấy thôi cho unsigned luôn là 4 tỉ hơn.

1 Like

Có thể trình linker của các IDE đó mặc định đã có flag -lm rồi.
defaults.list chỉ read-only với group owner và others thôi, owner có quyền read-write mà. Nên bài viết đó mới mở file defaults.list với sudo. Mình ko cài sublime nên ko kiểm tra được, bạn thử lại theo hướng dẫn đó xem.

1 Like

n/2 thì quá lâu ấy chứ. Còn “đỡ phải dùng”? math.h nó là thư viện chuẩn thì có j mà phải sợ.

1 Like

Khi em sudo ... toi defaults.list thi no bao: bash: cd: defaults.list: Not a directory => Phai fix sao anh ?

cd là change directory, từ thư mục hiện hành tới 1 thư mục nào đó. defaults.list là 1 file, không thể cd tới 1 file được. Bạn làm theo bài hướng dẫn đi, bắt đầu bằng sudo subl /usr/share/applications/defaults.list. Trong đó subl là sublime text, /usr/share/applications/defaults.list là đường dẫn tới file defaults.list. Sau đó bạn thay thế gedit bằng sublime_text rồi save, reboot lại.

1 Like

Hi Long Dragon.
Bạn cứ từ từ dành thời gian tìm hiểu hệ thống linux của mình đã. @_@!
Mình không nhớ rõ thì nautilus cũng có chọn công cụ mở file mặc định thì phải.

1 Like

He he với thời gian search google khắc phục cái lỗi kia thì mình mới làm như vậy. Bạn này gọi hàm sqrt trong mỗi loop thì đổi sang i*i <= n cũng thế. Còn chuyện N/2 lâu là tất nhiên nhưng bù lại thì nó tính đơn giản vì chỉ shift right 1 thôi, mình có nói nó tối ưu đâu.

1 Like

Làm như bạn thì cũng có cách là (s+=i << 1 - 1) < n (hằng đẳng thức) :smiley: nhưng math.h là thư viện chuẩn mà ko cài vô cho biên dịch được thì là cả một vấn đề nhé.

Còn chuyện gọi trước hay sau là chuyện ko nói ra thì ai sửa.

1 Like
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?