什么是细分错误。怎么处理

时间:2020-06-02 16:59:41

标签: c++11 object segmentation-fault c++14

问题:

    • 一个学生报名参加了工作坊,并希望参加最多的活动
      没有两个讲习班重叠的讲习班数量。你必须做
      以下:实现结构:
      1. struct Workshop具有以下成员:研讨会的开始时间。讲习班的时间。讲习班的结束时间。
      2. 具有以下成员的
      3. struct Available_Workshops:整数(学生注册的工作坊数量)。安
        具有大小的Workshop数组类型的数组。实现功能:
      4. Available_Workshops *初始化(int start_time [],int duration [],int n)创建一个Available_Workshops对象,然后 使用和参数中的元素初始化其元素 (均为大小)。在和中分别是开始时间和 研讨会的持续时间。该函数必须返回一个指向 一个Available_Workshops对象。
      5. int CalculateMaxWorkshops(Available_Workshops * ptr)返回学生可以参加的最大工作坊数量(不重叠)。
        下一个研讨会要等到上一个研讨会后才能参加
        结束。注意:大小未知的数组()应声明为
        如下:DataType * arrayName = new DataType [n];

    您的初始化函数必须返回一个指向 Available_Workshops对象。您的CalculateMaxWorkshops函数
    必须返回最大数量的非重叠工作坊的学生
    可以参加。
    样本输入

6
1 3 0 5 5 8
1 1 6 2 4 1
样本输出

4

说明第一行表示车间的数量。下一行包含以空格分隔的整数,其中整数 是研讨会的开始时间。下一行包含 以空格分隔的整数,其中整数是车间的 持续时间。学生可以参加工作坊,而无需 重叠,因此CalculateMaxWorkshops返回到main(然后 打印到标准输出)。

我的代码:

#include <iostream>

using namespace std;


class Workshop{
    public:
    int start_time{},duration{},end_time{};};

class Available_Workshops
{
    public:
     int n{};
    struct Workshop*arr=new struct Workshop[n];
    ~Available_Workshops()
    {
        delete [] arr;

    }
    void arr_sort();
    void arr_delete(int i);


};
////////////////////////////////////////////////////////////////////////////////////////////
Available_Workshops * initialize(int start_time[],int duration[],int n)
{
    Available_Workshops * x=new Available_Workshops{};
    x->n=n;
    for(int i=0;i<n;i++)
    {
     x->arr[i].start_time=start_time[i];
     x->arr[i].duration=duration[i];
     x->arr[i].end_time=start_time[i]+duration[i];
    }

    return x;

}
///////////////////////////////////////////////////////////////////////////////////////////
void Available_Workshops:: arr_delete(int i)
{

    n-=1;


    for(int j=i;j<n;j++)
    {
     arr[j]=arr[j+1];
    }


}
///////////////////////////////////////////////////////////////////////////////////////////
void Available_Workshops:: arr_sort()
{
for(int i=0;i<n;i++)
{
    for(int j=i+1;j<n;j++)
    {
        if(arr[i].start_time>arr[j].start_time)
            {
                struct Workshop temp=arr[i];
                arr[i]=arr[j];
                arr[j]=temp;
            }
    }
}


}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
int CalculateMaxWorkshops(Available_Workshops * x)
{
    x->arr_sort();
    for(int i=0;i<x->n-1;i++)
    {
       for(int j=i+1;j<x->n;j++)
       {
           if(x->arr[i].end_time>x->arr[j].start_time)
           {
               if(x->arr[i].duration>=x->arr[j].duration)
                x->arr_delete(i);
               else x->arr_delete(j);
               j--;
           }
       }
    }
    int y=x->n;
    delete x;
   return y;

}

int main(int argc, char *argv[]) {
    int n; // number of workshops
    cin >> n;
    // create arrays of unknown size n
    int* start_time = new int[n];
    int* duration = new int[n];

    for(int i=0; i < n; i++){
        cin >> start_time[i];
    }
    for(int i = 0; i < n; i++){
        cin >> duration[i];
    }

    Available_Workshops * ptr;
    ptr = initialize(start_time,duration, n);

    cout << CalculateMaxWorkshops(ptr) << endl;
    return 0;
}

我的代码未运行。有分割错误。请帮助我找到此错误

1 个答案:

答案 0 :(得分:0)

您可以从类声明中看到错误:

var extent = new ExtentReports();
var htmlreport = new ExtentHtmlReporter(@"D:\Test\Test\Test\Test\Reports\Firsttest.html");
extent.AttachReporter(htmlreport); 

成员class Available_Workshops { public: int n{}; struct Workshop* arr = new struct Workshop[n]; ~Available_Workshops() { delete[] arr; } void arr_sort(); void arr_delete(int i); }; 被显式初始化为0。但是,您的n函数将愉快地将更多元素填充到initialize(零元素的数组)中,并导致各种不确定的行为

您确实非常希望为您的类提供合适的构造函数,而不是尝试内联初始化成员。

arr

尽管与崩溃无关,另一个问题是您的Available_Workshops(int size) : n(size) { arr = new Workshop[n]; } 函数内部。

arr_delete

for (int j = i; j < n; j++) { arr[j] = arr[j + 1]; } 在循环的最后一次迭代时,它将执行j == n-1。存取arr[n-1] = arr[n]是未定义的行为,因为数组中唯一有效的索引来自arr[n]