30/09/2018, 18:54

Giúp mình giải thích lỗi khi chạy file Debug và Release C++

Bài tập của mình là code 1 thuật toán. Sau khi code xong, mình chạy file trong debug thì ra đúng. Còn trong release thì lại lúc đúng lúc sai. Code của mình không hề dùng đến con trỏ hay bộ nhớ gì hết. Đặc biệt cái giá trị sai chỉ là một biến int. Mình không hiểu tại sao lại như vậy. Mình chạy file debug 10 lần thì kết quả vẫn là 3. Nhưng khi chạy release thì lúc thì 3, lúc thì 1 dãy số. Đặc biệt dãy số này giống nhau giữa các lần.

Mình không nghĩ là do thuật toán sai, vì cùng 1 input thì làm sao mà cho ra output lúc này lúc kia. Xin mấy anh có kinh nghiệm giúp mình vấn đề này. Anh @ltd có biết trường hợp này không?

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

Bạn post code thử xem, kể thế này thì hơi khó đoán.

lahata viết 20:59 ngày 30/09/2018

Build code với tùy chọn Release và Debug có nhiều điểm khác nhau nhe bạn.
Có thể là: Các thiết lập lúc build. Như là sự tối ưu (optimization), Debug thường không tối ưu (ví dụ như code size, code speed). Việc tối ưu thường do thằng trình biên dịch (compiler) nó làm (với các tùy chọn mà mình setting: -O0 -Os…). Còn Release sẽ tối ưu code được sinh ra.
Hoặc là các setting khác (làm cho giá trị khởi tạo cho biến không phải bằng 0, các define, macro, biến volatite, biến register hoạt động sai… ) Vì thế việc build release vs debug có sự khác biệt, bạn cần nắm được các cài đặt lúc compile của IDE.

Thêm nữa: Có thể bạn không gặp phải, là các define mặc định. Có thể là -DDEBUG chẳng hạn, làm cho thư viện (hay file mã nguồn nào đó của bạn) chạy ở chế độ DEBUG.

Hoa Hoa viết 20:59 ngày 30/09/2018

Mình code thuật toán tô màu của Lý thuyết đồ thị nên post code lên cũng không khả quan. Mình chỉ bị sai ở cái biến int dùng để đếm số màu thôi. Nhưng có một chỗ mình không hiểu, đó là trong hàm output, mình có để điều kiện để xuất:

 string str = "";
 if (MaxColor == 256)
	str += to_string(-1);
else
{
	str += to_string(MaxColor + 1) + "\n";
	for (int i = 0; i < Color.size(); i++)
		str += to_string(Color[i]) + " ";
	str.erase(str.length() - 1, 1);
}

nếu MaxColor nó là 1 số lớn hơn hoặc bằng 256 thì nó đã xuất ra -1 rồi, đằng này nó chạy vào else thì có nghĩa là giá trị MaxColor nó sẽ đúng và MaxColor < 256. Nhưng không hiểu sao lúc in ra thì nó lại ra một con số rất lớn.@Rock_Hoang

Hoa Hoa viết 21:05 ngày 30/09/2018

Vậy cách khắc phục là sao vậy bạn? Mình không biết mấy cái biên dịch này. Tự nhiên code xong lại chạy sai khi release. Bình thường thì chỉ nộp file debug, nhưng do yêu cầu của bài tập lần này là nộp release.

lahata viết 21:01 ngày 30/09/2018

Cách để đối phó là copy setting của thằng Debug thảy qua Release mà cách này tệ quá.

Như bạn nói ở trên thì phải là

if (MaxColor >= 256){
}
else{
}

không biết có phải không. À biến MaxColor bạn thay đổi nó ở chỗ nào & như thế nào, khởi tạo nó là global, static hay sao vậy bạn??

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

Nhưng không hiểu sao lúc in ra thì nó lại ra một con số rất lớn.

Có lẽ nó truy cập vào vùng nhớ nào đó chưa được khởi tạo.
Để chắc chắn thì fix hết tất cả các lỗi warnings thử xem.
Điều kiện If bạn xét chặt hơn đi, <=

Hoa Hoa viết 20:59 ngày 30/09/2018

Mình dùng class và biến MaxColor là 1 biến của class. Mình nghĩ nếu có đã chạy vào else thì nó không thể là một con số lớn hơn 256 đc. Chả hiểu sao lúc
str += to_string(MaxColor + 1) + "\n";
thì nó lại ra con số to đùng. Mà lúc bị lúc không mới nói.

Hoa Hoa viết 21:03 ngày 30/09/2018

Class của mình:

class GraphTheory
{
	int SoDinh, SoCanh, S, F, MaxColor;
	vector<vector<bool>> AdjacencyMatrix;
	vector<vector<int>> AdjacencyList, ColorBan;
	vector<int> Color;

	void Init_AdjacencyMatrix();
	void Input_1(ifstream&);
	void InitDegreeList(vector<Vertex>&);
public:
	GraphTheory(void);
	~GraphTheory(void);

	void Input(char*, int);
	bool Output(char*);
	void GraphColorByHeuristic();
};
viết 21:05 ngày 30/09/2018

ta nghĩ show tất cả các file lên thì may ra còn tìm ra lỗi được

lúc bị lúc ko tức là chỗ nào biến MaxColor bị thay đổi thì phải coi lại ở những chỗ đó.

Hoa Hoa viết 21:07 ngày 30/09/2018

Vấn đề suy nghĩ ở đây chính là cái giá trị sai là 1 con số rất lơn so với cái
if (MaxColor == 256)
Nghĩa là trong thuật toán chạy MaxColor vẫn đúng, cho đến khi nó vượt qua đc cái else

if (MaxColor >= 256){
}
else{
}

thì nó vẫn đúng, nó chỉ bị sai khi in ra tại dòng này:
str += to_string(MaxColor + 1) + "\n";

viết 21:10 ngày 30/09/2018

vậy có lẽ là chưa khởi tạo MaxColor trong ctor? Nên lúc chạy có khi nó ra giá trị rác. Trong debug thì có lẽ nó luôn được gán giá trị 0, còn release thì do optimize code nên nó sẽ ko gán giá trị sẵn nữa nếu ko được bảo làm như vậy?

bưng tất cả các ctor lên coi

Hoa Hoa viết 21:07 ngày 30/09/2018

Chưa khởi tạo thì nó báo lỗi rồi bạn à! Vì biến MaxColor là một biến đếm. Mình quen dùng class nên những điều này không thể sót,

viết 21:06 ngày 30/09/2018

Có chắc là có gán MaxColor = 0 ở đâu trong code ko? Nếu có thì chắc post đầy đủ code lên mới biết được…

lahata viết 20:54 ngày 30/09/2018

Ok, mình đoán thế, này. Nhỏ hơn 256 chưa có nghĩa là lớn hơn 0. Vì bạn dùng int maxColor là một số có dấu.

Hàm to_string(MaxColor + 1) có thể không làm việc được với số âm.

Bài liên quan
0