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

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;
}

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

@TUITK9 Khởi tạo mảng lớn như vậy không được đâu

mang [100000000000000] 

Nó sẽ báo thiếu vùng nhớ ngay.

vậy mang [1 000 000] thôi

Nhưng nhu cầu của bạn ấy là một mảng rất lớn, lớn hơn 1000000

2 Likes

Kích thước của mảng vector tối đa là bao nhiêu vậy mọi người ?

Tuỳ vào bộ nhớ của bạn, tuy nhiên khai báo đến khoảng 2 triệu là compiler báo lỗi/warning rồi.

1 Like

Tùy vào loại dữ liệu mà vector nhận, giới hạn OS + phần cứng… không có giới hạn cố định. Bạn có thể sử dụng std::vector::max_size() để tìm kích thước tối đa của vector.

#include <iostream>
#include <vector>
#include <string>

int main()
{
	std::vector<int> t;
	std::vector<unsigned long long> u;
	std::vector<std::string> v;
	
	std::cout << "std::vector<int> = " << t.max_size() << "\nstd::vector<unsigned long long> = " << u.max_size() << "\nstd::vector<std::string> = " << v.max_size();
}

Kết quả (32-bit):

std::vector<int> = 1073741823
std::vector<unsigned long long> = 536870911
std::vector<std::string> = 178956970

64-bit:

std::vector<int> = 4611686018427387903
std::vector<unsigned long long> = 2305843009213693951
std::vector<std::string> = 576460752303423487
2 Likes

Kích thước tối đa của mảng hai chiều là bao nhiêu vậy mọi người

Như trên thôi. Thớt chơi hẳn 11 chữ số 0 cơ :smiley: chứ stack chỉ 1m slot.

1 Like

mình đoán là thớt đang làm đồ án với số nguyên lớn, trong C++ có thư viện rất hay là bitset, nó là 1 vector các bit, chỉ lưu giá trị 0 hoặc 1. Với số nguyên lớn ta dùng hệ nhị phân để thao tác, có thể viết hàm hoặc phương thức biểu diễn chúng dưới hệ 10 và 16 lưu trong string của C++, mình thấy đây là cách tối ưu thay vì phải cấp phát cái mảng lớn như trên.

Không hiểu ý bạn lắm, mình có nói là với số nguyên lớn thì thao tác nó trên hệ nhị phân, còn nếu muốn hiển thị hệ 10 hay 16 thì viết thêm hàm hay phương thức tùy bạn viết hướng đối tượng hay thủ tục, cấu trúc dữ liệu của mình là bitset. Có gì nhầm lẫn ko???

*whoops* Bitset thì nhiều chữ số lắm :smiley: nên dùng cơ số 2^32 luôn.

1 Like

ủa thớt đang nói về mảng phần tử lớn, cái này để lưu số nguyên lớn mà. Số nguyên lớn sẽ lớn hơn con số 2^32 rất nhiều, nên mình mới đề nghị dùng bitset, nó là 1 vector nhưng các phần tử chỉ có 1 bit, nếu khởi tạo 1 vector 128bit hay 256bit thì con số bạn có thể biễu diễn rất rất lớn 2^128. Thay vì dùng mảng char 1 triệu phần tử chỉ để chứa con số thập phân, điều này không khả thi chứ chưa nói tới vấn đề thuật toán ±*/ các số này trên hệ thập phân.

Cơ số 2^32 tức là mỗi biến unsigned int là một chữ số đấy chứ :slight_smile: 120 slot là biểu diễn được hơn 1000 chữ số thập phân rồi.

theo mình hiểu ý bạn là dùng 1 con số uns int để biễu diễn 1 phần của big int??? Cái này hồi làm đồ án mình có nghĩ tới, tuy nhiên mình thấy nó khá phức tạp nên đã chuyển sang bitset ^^ đơn giản hơn nhiều, và thuật toán tính toán trên hệ2 thì cũng có sẵn hết.

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