Như tiêu đề, VS của mình khi khai báo mảng bắt buộc kích thước của mảng phải là hằng số, còn khi code trên codeblocks thì kích thước của mảng hoàn toàn có thể là biến số hoặc hằng số đều đc.
Visual studio bắt buộc khai báo mảng có kích thước là hằng số?
CodeBlocks sai, VS đúng.
Nhưng trên codeblocks vẫn chạy bình thường mà bạn?
kiểu khai báo mảng với kích thước là biến số chỉ có trong C, ko có trong C++, vì trong C++ đã có std::vector
sửa lại code trên:
#include <vector>
...
//int mang[kichthuoc][kichthuoc];
std::vector<std::vector<int>> mang(kichthuoc, std::vector<int>(kichthuoc));
chạy bình thường ko có nghĩa là code đúng :V
Nhưng nó thực hiện đúng yêu cầu của bài toán đặt ra mà
nhưng nó ko chạy trên VS vậy nó có thực hiện đúng yêu cầu đó ko? :V
code C/C++ giống như cầm súng bắn vậy đó, có chỗ ko ai cấm bạn chỉa súng bắn vô chân bạn. Khi bắn vô chân bạn vẫn bảo ơ súng bắn tốt mà, qua chỗ khác người ta cấm bắn súng vào chân thì lại bảo tại sao :V
Này là sao nhỉ, mình chưa biết đến thư viện vector
nó là mảng có kích thước động của C++ ấy. Trong C++ tuyệt đối ko có vụ khai báo mảng tĩnh mà có kích thước động :V Trong C sở dĩ khai báo như vậy được vì nó là viết tắt của
int* mang = malloc(kichthuoc * ...);
...
free(mang);
trình biên dịch nó tự tạo ra mấy dòng code đó khi bạn viết int mang[kichthuoc];
. Cách khai báo này chỉ có ở trong C, nhiều người code C quen cứ tưởng C++ cũng code được, thật ra là ko được :V
trong C++ ko có vụ này vì nó có class
, ở đây là class vector
thay thế :V
edit: VLA trong C cũng có thể sẽ tạo mảng nằm trên stack luôn chứ ko phải malloc lên heap :V Nó sẽ tạo code phức tạp hơn nữa :V
Không, VLA nằm ngay trên stack, còn malloc là heap.
C++ bỏ là vì nó phức tạp hóa việc suy diễn type.
Oh, cảm ơn bác, để mình tìm hiểu thêm
Linus Torvalds has expressed his displeasure in the past over VLA usage for arrays with predetermined small sizes, with comments like “USING VLA’S IS ACTIVELY STUPID! It generates much more code, and much slower code (and more fragile code), than just using a fixed key size would have done.” [6] With the Linux 4.20 kernel, Linux kernel is effectively VLA-free.[7]
Linus chửi nè, ổng viết C mà cũng ko bao giờ xài VLA (mảng “tĩnh” có kích thước động), hột nhưn Linux cũng ko có VLA:V
Cái này mình cũng gặp hồi còn học đại học, lâu rồi mình không thể nói chính xác, chỉ cần nhớ thế này:
- C và C++ chúng nó như phương ngữ (dialect) của nhau, giống và khác nhau chứ không phải C++ là superset của C, một số ít cú pháp và logic thì cái này có, cái kia ko có và ngược lại;
- Visual Studio Compiler nó cũng như GCC/G++ ở chỗ là nếu bạn để file là *.c thì nó dùng mode ngôn ngữ C, còn nếu bạn để là *.cpp thì chúng nó đều dùng mode ngôn ngữ C++;
- Nhưng 2 compiler này cũng có nhiều điểm khác nhau, cú pháp cũng support có điểm khác nhau, nếu mình nhớ ko nhầm thì bên GCC cho phép khai báo mảng tĩnh nhưng dùng biến tùy ý (nó sẽ cấp phát trên stack), còn VS Compiler thì không.
VLA (Variable Lenght Allocation) là 1 extension của compiler gcc.
Code block dùng compiler gcc nên không báo lỗi.
Còn VS dùng Visual C++ compiler, không hỗ trợ extension kia, nên báo lỗi.
Best pracetice là đừng dùng VLA. Như thế source code sẽ portable hơn.