30/09/2018, 17:42

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
");
            scanf ("%d",&n);
        }
        while (n <=0);
        printf("Cac so nguyen to < %d la
", 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 	",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 	",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

*grab popcorn* viết 19:48 ngày 30/09/2018

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

abcxyz viết 19:43 ngày 30/09/2018

xincamon, đúng là chưa tạo project
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 đó

BX136 viết 19:54 ngày 30/09/2018

file code hàm

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


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;
}


abcxyz viết 19:45 ngày 30/09/2018

mylibrary::iCheckNT (int n)

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?

abcxyz viết 19:54 ngày 30/09/2018

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;
}

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

BX136 viết 19:43 ngày 30/09/2018

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

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
.
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 chúc bạn học giỏi

Nguyễn Tuấn viết 19:48 ngày 30/09/2018

for (i = 2; i <=sqrt(n); i++)
if ( n % i ==0) return 0;

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

abcxyz viết 19:57 ngày 30/09/2018

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

Bài liên quan
0