30/09/2018, 16:15

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 .

Nguyễn Minh Dũng viết 18:31 ngày 30/09/2018

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

mà cho em hỏi nếu mình khai báo char a[M] thì M tối đa là bao nhiêu ?

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

Phụ thuộc vào bộ nhớ tại thời điểm đó nó còn dư bao nhiêu em. Câu này phụ thuộc phần cứng + hệ điều hành. Mà anh lại ko nắm 2 cái này nên khó trả lời lắm smiley P/S: Nhưng anh thử google trên mạng với câu hỏi này. Trong điều kiện không quan tâm đến phần cứng. Tức là phần cứng có thể đáp ứng được mọi nhu cầu thì tối đã sẽ tạo được một mảng với kích thước SIZE_MAX bằng với 21024-1 179769313486231590772930519078902473361797697894230657273430081157732675805500963132708477322407536021120113879871…

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

như vậy thì có cách nào để em có thể chuyển từ char So[10000]>>> char So[1000000000000]

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.

Minh Hoàng viết 18:32 ngày 30/09/2018

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)

Nguyễn Minh Dũng viết 18:26 ngày 30/09/2018

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?

Đượ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.

Minh Hoàng viết 18:18 ngày 30/09/2018

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.

Nguyễn Minh Dũng viết 18:24 ngày 30/09/2018

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

Minh Hoàng viết 18:21 ngày 30/09/2018

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ơ

Nguyễn Minh Dũng viết 18:21 ngày 30/09/2018

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?

Minh Hoàng viết 18:24 ngày 30/09/2018

Để 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.

Nguyễn Minh Dũng viết 18:20 ngày 30/09/2018

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?

Minh Hoàng viết 18:27 ngày 30/09/2018

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

Gió viết 18:19 ngày 30/09/2018

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ỏ

Nguyễn Minh Dũng viết 18:19 ngày 30/09/2018

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

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.

Minh Hoàng viết 18:23 ngày 30/09/2018

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 chờ dịp khác vậy

Nguyễn Minh Dũng viết 18:20 ngày 30/09/2018

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?

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

Thai Hoc Nguyen viết 18:25 ngày 30/09/2018

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

Nguyễn Minh Dũng viết 18:22 ngày 30/09/2018

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

Minh Hoàng viết 18:23 ngày 30/09/2018

Sáng nay đi học ra bắt gặp một lão đang code hỏi được một chút 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

Nguyễn Minh Dũng viết 18:31 ngày 30/09/2018

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?

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

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ó)

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

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)

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.

Minh Hoàng viết 18:25 ngày 30/09/2018
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;
}
Nguyễn Thị Thục viết 18:28 ngày 30/09/2018

tăng chi để rồi lỗi ,tai sao ko khởi tạo mang [100000000000000] cho roi

Bài liên quan
0