Cách tăng kích thước của mảng mà không bị lỗi?

Chào mọi người
Hiện tại em có 1 điều đang thắc mắc là mãi chưa tìm thấy câu trả lời
em có struct như sau:

struct Chuoi
{
    char So[10000]
};

Em không tại sao khi em tăng char So[10000] >>> char So[1000000000000] thì nó lại bị báo lỗi và nếu báo lỗi như vậy thì có cách nào để em có thể chuyển từ char So[10000]>>> char So[1000000000000]
Mong mọi người giúp em
Xin chân thành cảm ơn .

1 Like

Câu hỏi của em có thể bị trùng với câu hỏi này. Trong đó @Rok_Hoang đã hỏi

Đây là câu trả lời, em có thể hiểu tương tự cho trường hợp của em

Riêng về câu hỏi:

Em không thể và không nên làm vậy. Không thể vì bộ nhớ không đủ, không nên vì em có cách khác để làm. Đó là em cắt cái mảng của em ra thành mảng nhỏ hơn, rồi nếu dữ liệu quá dài, em ghi bớt xuống file data.

1 Like

mình có thể dùng malloc hay calloc để khởi tạo kích thước lớn hơn được không anh? (xử lí trường hợp của @Thai_Hoc_Nguyen)

Được, nhưng cũng cùng chung số phận thôi. Cấp phát vùng nhớ lớn quá. Bộ nhớ không đủ thì cũng tèo thôi em.

2 Likes

Trong struct mình có thể dùng malloc để khai báo kích thướng cho một mảng được không anh? (tại em thấy nó chuyền cố định cho 1 con trỏ).
p/s: struct của em dùng để lưu trữ số cực lớn.

em nói “trong struct” là sao? Tức là đối với struct ta có thể dùng malloc hay không đấy hả? Được em.

Em viết như thế này

(struct daynhauhoc*)malloc(num_element * sizeof(struct daynhauhoc))

Giống hệt như với kiểu int thôi :smile:

ví dụ em có

struct num
{
   char so[1000];
}

nếu như thế thì em có thể nới rộng mảnh num.so được không?
em đang gặp rắc rối ở chỗ num.so không lưu hết các số được, khai báo theo kiểu char so[1000000] thì sẽ bị lỗi :(( hỏi mấy hôm nay không nghĩ ra được nên hỏi toẹt luôn.
p\s: đang học tới struct cơ

Nếu em khai báo nhiều như vậy thì anh nghĩ kể cả malloc cũng không giúp được em. Cái này chỉ khác nhau ở chỗ cách khai báo thôi. Còn số lượng bytes là như nhau. Hệ điều hành không đồng ý cấp với dung lượng cỡ đó thì cũng chết.

Lý do tại sao em lại muốn khai báo mảng lớn như vậy?

Để lưu số thôi anh ơi, em đang có bài toán yêu cầu tính số fibonaci thứ 10^9. :frowning:

Em không thể tính bằng cấp một cái mảng thật là to được. Cách hiện giờ em đang làm là như thế nào?

hiện giờ em làm theo kiểu khai báo struct như trên. Sau đó thực hiện phép cộng như của học sinh tiểu học (từ phải qua trái).Lưu nó vào 1 chuỗi và lại tiếp tục. (như trong code của em thì khai báo kích thước char a[32000] thì em tính được số fibo thứ 150000 thôi)
Em đang tính không dùng struct nhưng không biết thầy cho không vì đang làm đồ án liên quan đến struct :frowning:

Nếu mà dùng C++, theo mình nên dùng std::vector thay vì dùng char s[32000] sẽ rất lãng phí bộ nhớ khi lưu số có giá trị nhỏ

1 Like

Thay vì lưu vào chuỗi, em lưu vào file đi. File có thể ghi với độ dài lớn hơn nhiều. Sau này đọc lên tính tiếp. Chia để trị.

Hiện giờ anh không có thuật toán nào để giúp em, nhưng nếu về việc xử lý vùng nhớ bị thiếu thì anh nghĩ em dùng file hay hơn. Không thể lưu tất cả trong RAM được.

1 Like

vậy có thể sử dụng cách ghi vào file. Còn cách không dùng struct mà khai báo 3 chuỗi để làm việc cũng được đúng không anh?
tks anh, em sẽ xem thử cách này, còn cách vector thì chưa học đến nên chắc chưa dùng được :smiley: chờ dịp khác vậy

1 Like

Miễn là 3 chuỗi đó không quá dài, hệ điều hành vẫn có thể cấp ram cho nó là được :wink:

1 Like

Thật Sự là em không biết gì về file

Em có thể hỏi @Rok_Hoang để nhờ bạn ấy giúp.

Sáng nay đi học ra bắt gặp một lão đang code hỏi được một chút :smiley: anh Đạt chắc biết về cái này nên hướng dẫn cho em kĩ phần này xíu
ông này chỉ em cách khai báo ngay trong struct và thêm một số operator, em code lại như sau:

struct bigNum
    {
    	int		dau;
    	char           *digit;
    	bigNum()
    	{
    		digit = new char[100000];
    	}
    	void operator	= (const bigNum &x)
    	{
    		delete  [] digit;
    		digit = new char[100000];
    		strcpy(digit,x.digit);
    	}
    	~bigNum()
    	{
    		delete[] digit;
    	}
    };

cho em hỏi cái ~bigNum là thế nào (hình như là destructure) việc giải phóng thực hiện khi nào?
cái operator = dùng để gán nhưng không biết viết vậy đúng chưa nữa? (anh kia chỉ là do nó trỏ về cùng một địa chỉ nên phải định nghĩa lại operator = cho nó)
em thay struct cũ bằng struct này nhưng vẫn không được(nó báo lỗi trên hàm strcat()), có vấn đề gì lưu ý ở đây mà em không biết không? (thao tác của em vẫn chỉ thực hiện trên chuỗi thôi)
:(( toàn kiến thức năm 2 mà thầy cho đồ án ảo quá đi

Là destructure, giải phóng được thự hiện khi object đó ra khỏi scope.

Gán như vậy là đúng rồi.

Em cho anh xem lỗi chứ sao anh biết được.

Tuy nhiên sao em không dùng class mà lại dùng struct? Class và struct trong C++ giống nhau. Chỉ khác ở một điểm là class mặc định mọi thành viên và phương thức của nó là private. Struct thì ngược lại, tất cả là public.

struct bigNum
{
	int		dau;
	char *digit;
	bigNum()
	{
		digit = new char[100000];
	}
	void operator = (const bigNum &x)
	{
		delete  [] digit;
		digit = new char[100000];
		strcpy(digit,x.digit);
	}
	~bigNum()
	{
		delete[] digit;
	}
};

hình như toán tử bằng có vấn đề anh ơi …em viết hàm để tính phép cộng là addBigNum ,em kiểm tra giá trị của biến trong hàm trước khi return là chính xác nhưng không gán được cho biến .Bên dưới là hàm để tính phép cộng.

bigNum	addBigNum(bigNum a,bigNum b)
{
	int x,y;
	long i;
	int memory=0;
	int sum;
	char *tam = new char [100000];
	bigNum c;
	add0(&a,&b);
	c.digit[strlen(a.digit)]=0;

	for (i=strlen(a.digit)-1;i>=0;i--)
	{
		x=a.digit[i]-'0';
		y=b.digit[i]-'0';
		sum=memory+x+y;
		memory=sum/10;
		sum=sum%10;
		c.digit[i]=sum+'0';
	}
if (memory==1)
{
	strcpy(tam,c.digit);
	strcpy(c.digit+1,tam);
	c.digit[0]='1';
}
delete [] tam;
	return c;
}
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?