[Link]Học lập trình C trên môi trường linux

Xin chào mọi người!
Đây là website mới lập của mình với mục đích là chia sẽ những kiến thức về lập trình (C/C++ là chủ yếu) và những cuốn sách hay mà mình kiếm được, hiện tại thì có khá ít bài viết.
Và những bạn muốn học C thì có thể vào xem thử có phù hợp với mình không nhé!
Mọi người tham khảo nhé!

3 Likes

Hi Lê Nhật Thanhlenhatthanh20.
Mình thường thấy ngươi ta dùng gcc. Bạn có thể nói rõ hơn dùng make và gcc có gì khác nhau không ?
Cảm ơn.

1 Like

Hi bạn Lười!
Theo những gì mình biết thì gcc là một lệnh dùng để biên dịch C. nó có cú pháp là
“gcc file.c -o output file”
Có thể thêm tùy chọn -Wall để hiển thị các cảnh báo. Còn Makefile là một file nó bao gồm nhiều đoạn script trong đó nó đã bao gồm lệnh biên dịch gcc (Bạn có thể thao khảo bài exercise 2 của mình). Makefile thương được dùng để build một chương trình rất lớn.
Lệnh “make” tương đương với lệnh “gcc file.c -o output file”, nếu Makefile bạn chưa tạo. Còn nếu khi bạn tạo Makefile theo ý của bạn thì bạn có vô số lệnh nó thể làm được (Nó gần như tương đương với alias trong linux)
Bạn xem bài exercise 2 nó có thêm lệnh “make clean” thay cho lệnh “rm” là remove file.
Mình chỉ biết có vậy. :). Mọi người ai có đóng góp hay thấy mình sai gì thì comment bên dưới nhé.

Hi Lê Nhật Thanhlenhatthanh20.
Cam ơn bạn nhiều.

Không có chi :slight_smile:
Chúc bạn học tốt!

anh có thể làm video hướng dẫn chi tiết về cách compiler c++ trên sublime text mà lúc xuất kết quả thì nó ra ở màn hình command không

Hi bạn Le Nhat Phong!
Mình không có thời gian làm clip nên mình chỉ có thể giải thích giúp cho bạn, bạn thông cảm.
Bước 1: Các bạn tạo một file cpp trên sublime text. ví dụ test.cpp
Bước 2: Biên dịch chương trình trên command line. Bạn có thể thực hiện bằng 2 lệnh:
“make test” hoặc “g++ test.c -o test”
Cả 2 lệnh đều tạo ra cho bạn môt file test
Bước 3: Chạy chương trình. Bạn thực hiện lệnh:
“./test”
Như vậy là xong bạn nhé.

Hay quá. Đang định mua cuốn Learn C The Hard Way để học C nhưng không có tiền (sắm tết hết rồi :sweat_smile: )
Hi vọng chủ thớt sẽ cố gắng support series này :smile:

http://devnt.org/bien-dich-code-c-tu-command-line/
http://devnt.org/so-luoc-ve-make/

@lenhatthanh20
Mình có một thắc mắc bạn giải thích giúp được không
Nếu mình có một mảng a chẳng hạn, vậy thì &a == a đúng không. Thắc mắc của mình là nếu a nó đã chứa địa chỉ của mảng vậy nếu mình gán 0 cho phần tử đầu tiên của mảng thì 0 được lưu ở đâu

Nếu các bạn thực sự thích cuốn sách này thì gửi mail cho mình: [email protected]

1 Like

Chào bạn Quốc Khánh Bùi!
Mình không hiểu ý của bạn lắm. Nhưng mình muốn nói thế này!
Toán tử &a chính là địa chỉ của mảng ( hay nói cách khác là địa chỉ của phần tử đầu tiên trong mảng), nghĩa là &a = &a[0] = a.
Nhưng bạn nói “nếu a đã chứa địa chỉ của mảng” là sao, mình không hiểu lắm.
Khi bạn gán 0 cho phần tử đầu tiên thì 0 được lưu ngay tại ô nhớ có địa chỉ &a.

a == &a đúng không?
=> *a == &a

Đi lạc vấn đề với topic thì người ta gọi đó là ‘lạc đề’ hay tiếng anh là ‘off topic’. Bạn đã tạo 1 topic nói về vấn đề này rồi, hãy trả lời ở đó thì đúng hơn, hoặc bạn có thể dùng tính năng ‘Message’ của forum để nhắn tin với những người bạn muốn hỏi.
Câu hỏi của bạn có thể tìm thấy ở Stackoverflow. Mặc dù người ta giải thích khá cặn kẽ nhưng cũng cần phải có thời gian để tiêu hóa. Khi bạn thấy ổn với câu trả lời, bạn có thể quay về topic của bạn và tạo 1 post để trả lời cho câu hỏi của bạn, ít ra những người đi sau sẽ tìm được câu trả lời cho thắc mắc giống bạn. Chúc bạn thành công!

== là bằng giá trị thôi bạn ơi, kiểu của a và &a là khác nhau.

nếu bạn xài C++ có thể chạy thử chương trình sau:

#include <iostream>
#include <typeinfo>

int main()
{
    int a[5];
    std::cout << typeid(a).name() << "\n";
    std::cout << typeid(&a).name() << "\n";
    std::cout << typeid(&a[0]).name() << "\n\n";
    
    std::cout << typeid(*&a).name() << "\n";
    std::cout << typeid(*a).name() << "\n";
}

output là

A5_i
PA5_i
Pi

A5_i
i

nghĩa là a là mảng chứa 5 số nguyên (A = array = mảng, i = int = số nguyên)
&a là con trỏ tới “mảng chứa 5 số nguyên” (P = pointer = con trỏ)
&a[0] là con trỏ tới số nguyên

*&a là mảng chứa 5 số nguyên
*a là số nguyên

nếu bạn so sánh a == &a trong C++ sẽ báo lỗi: error: comparison between distinct pointer types ‘int*’ and ‘int (*)[5]’ lacks a cast [-fpermissive]

ở đây mảng có thể hiểu là con trỏ, &a là con trỏ, &a[0] cũng là con trỏ, và cả 3 đều “trỏ” tới hay chứa giá trị địa chỉ của phần tử đầu tiên của mảng a.

*a là số nguyên, là giá trị của a[0] thì làm sao mà bằng địa chỉ của mảng a tức là &a được?

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