30/09/2018, 17:01

Cách khắc phục lỗi has triggered a breakpoint

Mình cứ nghĩ, lập trình thì chỉ có đúng hoặc sai. Bây giờ mới gặp đúng trong trường hợp này nhưng sai trong trường hợp khác. Quá đau đầu với những lỗi thế này.
Em chạy thuật toán sắp xếp với mảng 5 phần tử thì được, 10 phần tử lúc được lúc không, 100 phần tử thì botay.com. Báo lỗi has triggered a breakpoint. Em không hiểu luôn.
Mọi người kiểm tra đoạn code dùm em. Em không biết đặt hàm delete []mang ở vị trí nào là đúng.

#include <iostream>
#include <time.h>

using namespace std;

void KiemTraTrangThai(int a[], int n);
void DocFile();
void SelectionSort(int a[], int n);
void XuatMang(int a[], int N);
void RandomCreate(char* tenFile, int total);
int* ReadFile(int& SoPhanTu);
void WriteFile(char* tenFile, int n, int t, int a[]);


void main()
{
    RandomCreate("input.txt", 100);
    int n;
    int* a = ReadFile(n);

    while (true)
    {
        // Tao menu chuc nang
        cout <<"
----------------------------------
";
        cout << "1. Doc tap tin va cho biet tinh trang ban dau cua day so
";
        cout << "2. Sap xep day so tang dan bang sap xep chon
";
        cout << "3. Sap xep day so tang dan bang sap vun dong
";
        cout << "4. Sap xep day so tang dan bang sap xep nhanh
";
        cout << "5. Sap xep day so tang dan bang sap xep tron
";
        cout << "6. Sap xep day so tang dan bang sap xep theo co so
";
        cout << "7. Sap xep day so giam dan bang sap xep vun dong
";
        cout << "8. Thoat chuong trinh

";
        cout << "Moi ban chon chuc nang: ";
        int chuc_nang;

        cin >> chuc_nang;

        if (chuc_nang ==2)
        {
            cout << "
Sap xep day so tang dan bang sap xep chon
";
            clock_t t = clock();
            SelectionSort(a, n);
            t = clock() - t;
            t = ((float)t)*1000/CLOCKS_PER_SEC;
            XuatMang(a, n);
            cout << "Thoi gian thuc hien: " << t << endl;
            WriteFile("SelectionSort.txt", n, t, a);
        }


        else
        {

            break;
        }
    }
    system("pause");
    //delete []a;
}

bool KiemTraTang(int a[], int n)
{
    bool kt = false;
    for (int i = 0; i < n-1; i++)
    {
        if (a[i] <= a[i+1])
        {
            kt = true;
        }
        else
        {
            kt = false;
            break;
        }
    }
    return kt;
}
bool KiemTraGiam(int a[], int n)
{
    bool kt = false;
    for (int i = 0; i < n-1; i++)
    {
        if (a[i+1] <= a[i])
        {
            kt = true;
        }
        else
        {
            kt = false;
            break;
        }
    }
    return kt;
}
bool KiemTraBang(int a[], int n)
{
    bool kt = false;
    for (int i = 0; i < n-1; i++)
    {
        if (a[i+1] == a[i])
        {
            kt = true;
        }
        else
        {
            kt = false;
            break;
        }
    }
    return kt;
}
void KiemTraTrangThai(int a[], int n)
{
    cout << "Trang thai hien tai cua day la: ";
    if (KiemTraTang(a, n))
    {
        cout << "Day tang dan" << endl;
    }
    else if (KiemTraGiam(a, n))
    {
        cout << "Day giam dan" << endl;
    }
    else if (KiemTraBang(a, n))
    {
        cout << "Day bang nhau" << endl;
    }
    else
    {
        cout << "Day ngau nhien" << endl;
    }
}

void HoanVi(int a, int b)
{
    int c = a;
    a = b;
    b = c;
}
void Swap(int &a, int &b)
{
    int c = a;
    a = b;
    b = c;
}
void SelectionSort(int a[], int n)
{
    int min;
    for (int i = 0; i < n-1; i++)
    {
        min = i;
        for (int j = i + 1; j < n; j++)
        {
            if (a[j] < a[min])
            {
                min = j;
            }
        }
        if (min != i)
        {
            swap(a[min], a[i]);
        }
    }
}

void XuatMang(int a[], int N)
{
    cout << "Mang hien tai co " << N << " phan tu:" << endl;
    for (int i = 0; i < N; i++)
    {
        cout << a[i] << " ";
    }
    cout << endl;
}

void RandomCreate(char* tenFile, int total)
{
//Mo file de ghi
    FILE* f;// = fopen(tenFile, "wt");
    errno_t err = fopen_s(&f, tenFile, "wt");
    if( err )
        printf_s( "The file input.txt was not opened
" );
    else
    {
        int iSecret;

        /* initialize random seed: */
//srand((unsigned int)time(NULL));
        srand(static_cast<unsigned int>(time(NULL)));

//Ghi du lieu ra file
        fprintf(f, "%d
", total);

        for (int i = 0; i < total; i++)
        {
            iSecret = (rand()%10) + 10 * (rand()%10) + 100 * (rand()%10) + 1000 * (rand()%10) + 10000 * (rand()%10) + 100000 * (rand()%10);
            fprintf(f, "%d ", iSecret);
        }
    }
//Dong file
    fclose(f);
    printf("
Da tao xong file txt voi %d phan tu.", total);

}
int* ReadFile(int& SoPhanTu)
{
    int * a = new int[];
//Mo file de doc
    FILE* f; //= fopen(tenFile, "r+");
    errno_t err = fopen_s(&f, "input.txt", "r+");
    if( err )
        printf_s( "The file input.txt was not opened
" );
    else
    {
        //Doc du lieu tu file
        fscanf_s(f, "%d", &SoPhanTu);
        //printf("%d
", n);

        while (!feof(f)) // Kiem tra da het file hay chua
        {
            for (int i = 0; i < SoPhanTu; i++)
            {
                fscanf_s(f, "%d ", &a[i]);
            }
        }

        //XuatMang(a, n);
    }
//Dong file
    return a;
    fclose(f);
}
void WriteFile(char* tenFile, int n, int t, int a[])
{
//Mo file de ghi
    FILE* f;// = fopen(tenFile, "wt");
    errno_t err = fopen_s(&f, tenFile, "wt");
    if( err )
        printf_s( "The file input.txt was not opened
" );
    else
    {
//Ghi du lieu ra file
        fprintf(f, "%d
", n);
        fprintf(f, "%d
", t);

        for (int i = 0; i < n; i++)
        {
            fprintf(f, "%d ", a[i]);
        }
    }
//Dong file
    fclose(f);
    printf("Da tao xong file
");
}
Ngọc Nhân viết 19:16 ngày 30/09/2018

Bạn kiểm tra cô lập đoạn nào bị lỗi thử chứ quăng cả đống lên đây biết đường nào mà lần. Mình copy nguyên code về chạy thấy ok.
Còn delete thì khi nào không dùng nữa thì gọi ra để hủy vùng nhớ, như ở đây đặt trước system(“pause”) là ổn.

Trương Thái viết 19:05 ngày 30/09/2018

Mục đích: đọc dữ liệu từ 1 file .txt, lưu vào mảng. Sau đó dùng thuật toán selectionsort sắp xếp mảng tăng dần. Xuất ra kết quả mảng đã được sắp xếp.
Mong mọi người test code dùm em. Em làm thử với mảng 5 phần tử chạy bình thường. Nhưng khi tăng lên 100 phần tử bị văng lỗi has triggered a breakpoint.

#include <iostream>
#include <time.h>

using namespace std;

void SelectionSort(int a[], int n);
void XuatMang(int a[], int N);
int* ReadFile(int& SoPhanTu);

void main()
{
	//RandomCreate("input.txt", 100);
	int n;
	int* a = ReadFile(n);

			cout << "\nSap xep day so tang dan bang sap xep chon\n";
			SelectionSort(a, n);
			XuatMang(a, n);

	system("pause");
	delete[] a;
}

void Swap(int &a, int &b)
{
	int c = a;
	a = b;
	b = c;
}
void SelectionSort(int a[], int n)
{
	int min;
	for (int i = 0; i < n-1; i++)
	{
		min = i;
		for (int j = i + 1; j < n; j++)
		{
			if (a[j] < a[min])
			{
				min = j;
			}
		}
		if (min != i)
		{
			swap(a[min], a[i]);
		}
	}
}

void XuatMang(int a[], int N)
{
	cout << "Mang hien tai co " << N << " phan tu:" << endl;
	for (int i = 0; i < N; i++)
	{
		cout << a[i] << " ";
	}
	cout << endl;
}

int* ReadFile(int& SoPhanTu)
 {
 int * a = new int[];
 //Mo file de doc
 FILE* f; //= fopen(tenFile, "r+");
 errno_t err = fopen_s(&f, "input.txt", "r+");
 if( err )
	printf_s( "The file input.txt was not opened\n" );
else
{
	 //Doc du lieu tu file
	 fscanf_s(f, "%d", &SoPhanTu);
	 //printf("%d\n", n);
	 
	 while (!feof(f)) // Kiem tra da het file hay chua
	 {
		 for (int i = 0; i < SoPhanTu; i++)
		 {
			 fscanf_s(f, "%d ", &a[i]);
		 }
	 }

	//XuatMang(a, n);
  }
 //Dong file
 return a;
 fclose(f);
 }

Nội dung file input.txt:

100
27864 396619 57885 588683 678809 102819 664815 184920 678741 928747 639128 929690 539123 333419 725217 198477 266880 372882 191241 333201 13160 580810 464252 297577 710496 520408 390679 748599 229800 822658 730575 205825 150532 304753 838299 870517 692488 763284 673188 30201 413200 137101 438605 841457 744950 111059 681689 193013 615930 235525 236744 962636 91423 261087 677075 148054 118040 347001 93459 837972 466986 445418 518859 579602 63178 21151 255969 353248 191228 52462 119747 837170 125057 834520 435336 995458 786702 920990 24297 275235 577019 797143 123548 195399 524851 316543 771749 538693 385727 775202 608374 554929 60924 227198 131169 990392 947699 571457 200647 427187
Coulson viết 19:03 ngày 30/09/2018

int * a = new int[];

Dòng này nhé. Bác cấp phát mảng mà không xác định là bao nhiêu phần tử nên nó truy xuất vùng nhớ chưa được cấp phát gây ra lỗi.

sửa lại thế này
int * a = NULL;

sau khi scan số phần tử thì mới cấp phát:

...
                //Doc du lieu tu file
		fscanf_s(f, "%d", &SoPhanTu);
		a = new int[SoPhanTu];
...
Gấu Lớn viết 19:11 ngày 30/09/2018

Cho mình hỏi ké với code mình cũng bị lỗi giống bạn, nó báo lỗi dòng free(hs);

#include <stdio.h>
#include <conio.h>
#include <malloc.h>
typedef struct
{
	int id;
	char name[50];
	float p;
}hocsinh;
//Ham nhap du lieu sinh vien
void Nhap(hocsinh *hs, int *n)
{
	int ms = 0;
	int i = 0;
	hocsinh hs_r;
	//hs = (hocsinh*)malloc(sizeof(hocsinh));
	//hs_r = (hocsinh*)malloc(sizeof(hocsinh));
	while (true)
	{
		printf("Nhap vao MSSV. Nhap -1 de ket thuc: ");
		scanf_s("%d", &ms);
		if (ms != -1)
		{
			hs[i].id = ms;
			while (getchar() != '\n' && getchar() != EOF) {} 
			printf("Ho va ten: ");
			gets_s((hs[i].name));
			printf("Diem Trung Binh: ");
			scanf_s("%f", &hs[i].p);
		}
		else break;
		i++;
		realloc(hs, 1 * sizeof(hocsinh));
	}
	*n = i;
}
void Xuat(hocsinh *hs, int n)
{
	printf("                            Thong Tin Sinh Vien                            \n");
	printf("---------------------------------------------------------------------------\n");
	printf("|%5s|%-25s|%7s|\n", "MSSV", "Ho va ten", "Diem Tb");
	printf("---------------------------------------------------------------------------\n");
	for (int i = 0; i < n; i++)
	{
		printf("|%5d|%-25s|%7.2f|\n", hs[i].id, hs[i].name, hs[i].p);
		printf("---------------------------------------------------------------------------\n");
	}
}
int main()
{
	hocsinh *hs;
	int n;
	hs = (hocsinh*)malloc(sizeof(hocsinh));
	Nhap(hs, &n);
	Xuat(hs, n);
	free(hs);
	_getch();
	return 0;
}
Bài liên quan
0