Khi compile trong codeblock thì bình thường mà compile trong visual studio lại lỗi?

Đề bài là : Hàm void normalize(double *out, int *in, int n) nhận các tham số là:

  • Con trỏ trỏ đến mảng đầu vào in . Mảng đầu vào chứa các số nguyên trong đoạn [0,255] .
  • Con trỏ trỏ đến mảng đầu ra out . Mảng đầu ra là mảng chuẩn hóa của mảng đầu vào, chứa các số thực sau khi chia số nguyên tương ứng của mảng đầu vào cho 255.
  • Số nguyên n là số phần tử của hai mảng.

Nhiệm vụ của hàm void normalize(double *out, int *in, int n) là chuẩn hóa các giá trị trong mảng đầu vào in về khoảng [0,1] và lưu vào mảng đầu ra out .

Hãy viết mã C++ để hoàn thành hàm void normalize(double *out, int *in, int n) thực hiện các yêu cầu trên.
bài code của em là:

#include <iostream>
#include <iomanip>

using namespace std;
void normalize(double* out, int* in, int n) {
	for (int i = 0; i < n; i++) {
		out[i] = 1.0 * in[i] / 255;
	}
	for (int i = 0; i < n; i++) {
		cout << setprecision(3) << fixed << out[i] << " ";
	}
}
	
int main () {
	int n;
	cin >> n;
	int mang[n];
	double mang_chuan[n];
	for (int i = 0; i < n; i++) {
		cin >> mang[i];
	}
	normalize(mang_chuan, mang, n);
	return 0;

}

trong C++ ko khai báo mảng kiểu này được

em xài đỡ int* mang = new int[n];double* mang_chuan = new double[n];. Nhớ cấp phát động phải hủy nó sau khi xài xong. Ở đây ko cần thiết nhưng tạo thói quen sau này tránh bị tràn bộ nhớ: sau khi gọi normalize xong thì gọi delete[] mang;delete[] mang_chuan;

hoặc tốt hơn là include thêm header <vector> rồi khai báo vector<int> mang(n); vector<double> mang_chuan(n);, khi truyền vào normalize dùng &mang[0]&mang_chuan[0]

4 Likes

tại sao mà dùng mảng tĩnh khai báo như trên lại không được ạ ?? @tntxtnt

Nếu n là biến thì không thể gọi nó là “tĩnh” được :smiley: đây là (một kiểu) cấp phát động trên stack.

Hệ thống kiểu của C++ phức tạp hơn C nên VLA sẽ phải gánh thêm mấy cái kiểu oái oăm này.

5 Likes

dạ đã hiểu. em cảm ơn ạ!

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