Visual studio bắt buộc khai báo mảng có kích thước là hằng số?

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.

CodeBlocks sai, VS đúng.

3 Likes

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));
3 Likes

chạy bình thường ko có nghĩa là code đúng :V

3 Likes

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

3 Likes

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

4 Likes

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.

4 Likes

Oh, cảm ơn bác, để mình tìm hiểu thêm :thinking:

1 Like

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

3 Likes

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.
4 Likes

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.

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