Khi để code định nghĩa hàm trong file header thì chạy binh thường nhưng khi tách file định nghĩa hàm ra khỏi header thì lỗi?

vấn đề 1
khi e để code định nghĩa hàm trong file header thì chạy binh thường
nhưng khi tách file định nghĩa hàm ra khỏi header thì lỗi

e có 1 file header , 1 file code của 1 hàm con, 1 file main như sau
3 file này đã để chung 1 thư mục

file main.c

 #include <stdio.h>
    #include <conio.h>
    #include "mylibrary.h"
    main ()
    {
        int n;
        do
        {
            printf ("Nhap vao 1 so nguyen duong de kiem tra so nguyen to\n");
            scanf ("%d",&n);
        }
        while (n <=0);
        printf("Cac so nguyen to < %d la\n", n);
        vListNT (n);
        getch();
        return 0;
    }

file header mylibrary.h

int iCheckNT (int n);
void vListNT (int n);

file code hàm

#include "mylibrary.h"
#include <math.h> 
int iCheckNT (int n) 
{
    int i;
    if ( n <2) return 0;
	for (i = 2; i <=sqrt(n); i++) 
    if ( n % i ==0) 	return 0;
    return 1;
}
void vListNT (int n) 
{
    int i;
    if (n == 2 || n==1 ) printf (" Khong co so nguyen to nao < %d", n);
    else       for (i = 2; i < n; i++)    if ( iCheckNT (i) == 1)     printf ("%d \t",i);

}

biến dịch trên dev c++ thì gặp lỗi (.text+0x52): undefined reference to `vListNT’

vấn đề 2: tương tự lần này e dùng include guard để tránh thư viện được biên địch 2 lần
e cũng có 3 file
file hàm main.c như ở vấn đề 1

file header mylibrary.h

#ifndef HEADER_FILE
#define HEADER_FILE
#include <math.h> 
int iCheckNT (int );
void vListNT (int );
#endif

file code hàm

#include "mylibrary.h"
int iCheckNT (int n) 
{
    int i;
    if ( n <2) return 0;
	for (i = 2; i <=sqrt(n); i++) 
    if ( n % i ==0) 	return 0;
    return 1;
}
void vListNT (int n) 
{
    int i;
    if (n == 2 || n==1 ) printf (" Khong co so nguyen to nao < %d", n);
    else       for (i = 2; i < n; i++)    if ( iCheckNT (i) == 1)     printf ("%d \t",i);

}

thì cũng k chạy được lỗi như ở vấn đề 1
nếu e bỏ định nghĩa hàm vào file header luôn thì chả sao, nhưng e muốn tách ra 1 file .c riêng thì lại lỗi? lỗi ở đâu ạ, tại sao hàm vListNT bị báo là k xác định

Theo kinh nghiệm:
Bởi vì compiler ko có link các file lại.
Bạn code trên 1 file riêng lẻ và ko tạo project?
Như khi compile 1 file riêng lẻ, compiler thực hiện lệnh sau:

gcc source.c -o program

Nếu như vậy thì chỉ cần tạo 1 project, add file header và source vào. Sau đó là vô tư include.
Thì IDE sẽ lôi sạch cái file nào dính liếu vô và compile theo lệnh

gcc source.c mylib.c -o programe

Đọc cuốn head first C có nói về vấn đề này :smiley:

3 Likes

xincamon, đúng là chưa tạo project :slight_smile: :blush:
head first c, tiếng anh nên đọc rất mất thời gian, mình hơi kém tiếng anh, mình chưa kịp đọc hết thì phải học môn khác ,nên đang dừng quyển đó lại, mình chưa đọc thấy phần đó :smiley:

1 Like

như vậy sẽ chạy được :smile: thửu xem nhé :smile:


mylibrary::iCheckNT (int n) 
{
    int i;
    if ( n <2) return 0;
	for (i = 2; i <=sqrt(n); i++) 
    if ( n % i ==0) 	return 0;
    return 1;
}


1 Like

thế nếu trong file đó có nhiều hàm thì mỗi hàm đều phải thêm mylibrary:: phía trước hả bạn?

1 Like

không chạy được bạn à?

khi bạn tạo 1 class bạn viết như sau trong file .h đúng không :smile:

class MyClass{
    private:
              int x;
              float a;
public:
          int Myfunc();
MyClass(void); // phương thức khởi tạo mặc định
~MyClass(void);// phương thức phá hủy
};

trong file .cpp có tên cùng với file .h bạn sẽ khai báo như sau:

include "*tên file*.h"
MyClass::Myfunc(){
    // định nghĩa hàm ở đây.
}

như vậy nó sẽ chạy, còn ở trên mình tưởng bạn đặt tên class trừng tên file .h nên mình mới viết vậy thôi :smile:
.
bạn có thể gu gồ video hướng dẫn giải bài tập hướng đối tượng của anh việt nam sơn nguyễn để biết thêm nhiều thứ nữa :smile: chúc bạn học giỏi :smile:

1 Like

cho e hỏi cái đoạn này của bác có ý đồ gì thế?

kiểm tra số nguyên tố bạn à

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