코드는 완벽하게 실행되지만 main ()에서 반환 할 때 충돌합니다.

미셸 미나

임의의 사용자를 생성하고이를 처리하여 사소한 비즈니스 차트를 만드는 간단한 코드를 만들었습니다. 코드는 목록 STL과 완벽하게 작동했지만 링크 목록을 직접 구현해야했기 때문에 문제를 발견했습니다.

이 프로그램은 완벽하게 실행됩니다 .. 원하는 출력을 완벽하게 생성하지만 마지막 코드 줄 후에 충돌이 발생하여 문제가 어디인지 알아 내려고했지만 실패했습니다.

내 코드는 다음과 같습니다.

#include "Class.h"
#include <stdlib.h>
class Node
{
    private:
        customer data;
        Node *next;
    public:
        /*Nodes constructors*/
        Node(){next=nullptr;}
        Node(customer X)
        {
            data=X;
            next=nullptr;
        }
        /*Data setters and getters*/
        void set_Data(customer X)
        {data = X;}
        customer get_Data()
        {return data;}
        /*next setters and getters*/
        void set_next(Node * X){next=X;}
        Node* get_next(){return next;}


};

class List
{
    private:
        Node * head;
        Node * tail;
        int counter;
    public:
        /*Constructors*/
        List(){head=nullptr;tail=head;counter=0;}
        /*Checks if the list is empty*/
        bool isEmpty()
        {
            if (head==nullptr)
                return true;
            return false;
        }
        /*front manipulation*/
        void add_Front(customer item)
        {
            if (isEmpty())
            {
                head = new Node(item);
                tail = head;
                counter++;
            }
            else{
            Node * nw= new Node(item);
            nw ->set_next(head);
            head=nw;
            counter++;
            }
        }
        void pop_Front()
        {
            if (isEmpty())
                return;
            if (head==tail)
            {
                delete head;
                delete tail;
                counter--;
                return;
            }
            Node * temphead=head;
            head=head->get_next();
            delete temphead;
            counter--;
        }
        /*End Manipulation*/
        void add_End(customer X)
        {
            if(isEmpty()){
                add_Front(X);
                counter++;}
            else
            {
                Node * temp=new Node(X);
                tail->set_next(temp);
                tail=temp;
                counter++;
            }
        }

        /*freeing the whole list*/
        void Clear()
        {
            while (!isEmpty())
                pop_Front();
        }

        /*Destructor*/
        ~List(){Clear();}

        /*Extras*/
        int get_Size(){return counter;}
        customer get_Front(){return head->get_Data();}
        customer get_End(){return tail->get_Data();}

};

    using namespace std;
bool generate_pie(int slices_number,string slices_names[],int slices_values[],string title);
bool Age_Pie(List Data,int AgeCategory);
int main()
{
    List Data;
    int numberofelements;
    cout<<"How many customers you wanna randomly generate? : ";
    cin >> numberofelements;
    srand(time(NULL));
    for (int i=0; i<numberofelements; i++)
    {
        customer temp;
        temp.random_customer();
        Data.add_Front(temp);

    }
    Age_Pie(Data,1);
    return 0;

}

bool Age_Pie(List Data,int AgeCategory)
{
    int Product_Percentage[6]={0};
    int tempsize= Data.get_Size();
    for (int i =0; i<tempsize; i++)
    {

        customer temp = Data.get_Front();
        Data.pop_Front();
        if (temp.get_age()==AgeCategory)
        {
            switch (temp.get_interrest())
            {
            case 1:Product_Percentage[0]++;break;
            case 2:Product_Percentage[1]++;break;
            case 3:Product_Percentage[2]++;break;
            case 4:Product_Percentage[3]++;break;
            case 5:Product_Percentage[4]++;break;
            }
        }
        else
            Product_Percentage[5]++;
        Data.add_End(temp);
    }

    string Products[]={"Product 1","Product 2","Product 3","Product 4","Product 5","Didn\'t choose"};
    generate_pie(6,Products,Product_Percentage,"The Age Category "+to_string(3)+" Chose these products");


}


bool Product_Pie(List Data, int Chosen_product)
{
    int AgeCategory_Percentage[5]={0};
    int Datasize = Data.get_Size();
    for(double i=0; i<Datasize-1;i++)
    {
        customer dummy = Data.get_Front();
        int temp_interrest = dummy.get_interrest();
        int temp_agecat = dummy.get_age();
        Data.pop_Front();
        if (temp_interrest==Chosen_product)
        {

        switch (temp_agecat){
        case 0:AgeCategory_Percentage[0]++;break;
        case 1:AgeCategory_Percentage[1]++;break;
        case 2:AgeCategory_Percentage[2]++;break;
        case 3:AgeCategory_Percentage[3]++;break;
        }
        }
        else
            AgeCategory_Percentage[4]++;

        Data.add_End(dummy);
    }
    string Ages[]={"18 To 25","26 To 40","41 To 61","Above 60","Not Chosen"};

    generate_pie(5,Ages,AgeCategory_Percentage,"Product #"+to_string(Chosen_product+1)+" Statistics");
    return true;
}


bool generate_pie(int slices_number,string slices_names[],int slices_values[],string title)
{
    /* the function takes the number of pie slices and its names with values
     * and the pie chart title
     * writes an HTML with JS that creates the chart
     * using the googlecharts API*/

    ofstream html;
    html.open ("report.html");
    html << "<html>\n\t<head>\n"
            "\t\t<!--Load the AJAX API-->\n"
            "\t\t<script type=\"text/javascript\" src=\"https://www.gstatic.com/charts/loader.js\"></script>\n"
            "\t\t<script type=\"text/javascript\">\n\n"
            "\t\t// Load the Visualization API and the corechart package.\n"
            "\t\tgoogle.charts.load('current', {'packages':['corechart']});\n\n"
            "\t\t// Set a callback to run when the Google Visualization API is loaded.\n"
            "\t\tgoogle.charts.setOnLoadCallback(drawChart);\n\n"
            "\t\t// Callback that creates and populates a data table,\n"
            "\t\t// instantiates the pie chart, passes in the data and\n"
            "\t\t// draws it.\n\t\tfunction drawChart() {\n\n"
            "\t\t\t// Create the data table.\n"
            "\t\t\tvar data = new google.visualization.DataTable();\n"
            "\t\t\tdata.addColumn('string', 'Category');\n"
            "\t\t\tdata.addColumn('number', 'Percentage');\n"
            "\t\t\tdata.addRows([\n";

            for (int i=0;i<slices_number;i++)
                html << "\t\t\t\t['"<<slices_names[i]<<"', "<<slices_values[i]<<"],\n";

            html <<"\t\t\t]);\n\n"
            "\t\t\t// Set chart options\n"
            "\t\t\tvar options = {'title':'"<<title<<"','width':400,'height':300,is3D: true,};\n\n"
            "\t\t\t        // Instantiate and draw our chart, passing in some options.\n"
            "\t\t\tvar chart = new google.visualization.PieChart(document.getElementById('chart_div'));\n"
            "\t\t\tchart.draw(data, options);\n"
            "\t\t  }\n"
            "\t\t</script>\n"
            "\t</head>\n\n"
            "\t<body>\n"
            "\t\t<!--Div that will hold the pie chart-->\n"
            "\t\t<div id=\"chart_div\"></div>\t\n"
            "</body>\n"
            "</html>";

    return true;
}

이미 작동하고 있으므로 generate_pie 함수를 건너 뛸 수 있습니다. 전체 코드를 게시하는 것이 적절하지 않다고 생각하지만 Stackoverflow를 시작하고 있습니다. 감사.

kfsone

목록에 하나의 요소가있는 경우 pop_Front가 손상됩니다.

    void pop_Front()
    {
        if (isEmpty())
            return;
        if (head==tail)
        {
            delete head;
            delete tail;
            counter--;
            return;
        }
        Node * temphead=head;
        head=head->get_next();
        delete temphead;
        counter--;
    }

같은 주소를 두 번 삭제하려고합니다. 그것이되어야하는 것은 :

    void pop_Front()
    {
        if (isEmpty())
            return;
        if (head==tail)
        {
            delete head;
            head = tail = nullptr;  // optional
            counter--;
            return;
        }
        Node * temphead=head;
        head=head->get_next();
        delete temphead;
        counter--;
    }

깨진 데모 : http://ideone.com/afg7se 작업 데모 : http://ideone.com/mJ489F

--- 편집 : Paul McKenzie의 의견에 따라

Age_Pie(Data,1);

그러면 목록 복사본 이 Pie 함수에 전달되며 기본적으로 동일한 위치를 가리키는 모든 동일한 노드가됩니다. 즉, 임시 사본이 파괴되면 전체 목록이 할당 해제되므로 모든 항목을 여러 번 삭제하게됩니다.

참조 / 포인터로 전달하거나 List 클래스에 대해 복사 생성자 또는 operator =를 구현해야합니다.

--- 편집 2 :

복사 연산자를 포함하도록 라이브 데모를 업데이트했습니다.

    /*copy operator*/
    List& operator=(const List& rhs)
    {
        Clear();
        Node* temp = rhs.head;
        while (temp) {
            add_End(temp->get_Data());
            temp = temp->get_next();
        }
        return *this;
    }

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

스크립트는 수동으로 실행할 때 완벽하게 작동하지만 crontab에서는 뭔가 잘못되었습니다.

분류에서Dev

스크립트는 수동으로 실행할 때 완벽하게 작동하지만 crontab에서는 뭔가 잘못되었습니다.

분류에서Dev

jQuery : .height ()는 .ready ()에서 null을 반환하지만 동일한 코드 콘솔을 실행할 때 작동합니다.

분류에서Dev

MKL 예제 코드는 cmake로 잘 컴파일되지만 실행할 때 충돌합니다.

분류에서Dev

Dataflow는 로컬에서 올바른 유형을 반환하지만 클라우드에서 실행할 때는 반환하지 않습니다.

분류에서Dev

Android Studio : 코드가 완료되었지만 실행하려고 할 때마다 앱이 충돌 함

분류에서Dev

RSelenium은 각 줄을 개별적으로 실행할 때 실행되지만 코드 청크에서 실행할 때는 실행되지 않습니다.

분류에서Dev

이 프록시가 항상 프록시에서 'set'을 던지는 이유가 있습니까? 트랩은 'main'속성에 대해 거짓을 반환했지만 그렇지 않으면 완벽하게 실행됩니까?

분류에서Dev

Foreach over Excel 셀은 실행중인 첫 번째 행만 반환하지만 메서드를 단계별로 실행할 때 제대로 작동합니다.

분류에서Dev

Unity 3D에서 드래그하는 동안 GameObject를 사용할 때 충돌을 감지하는 방법이 BoxCollider 2D와 충돌합니다.

분류에서Dev

Unity 3D에서 드래그하는 동안 GameObject를 사용할 때 충돌을 감지하는 방법이 BoxCollider 2D와 충돌합니다.

분류에서Dev

내 코드는 완벽하게 컴파일되고 실행되지만 실행 중에 읽지 않는 것과 같은 부분이 있습니다.

분류에서Dev

디버그 할 때 코드가 실행되지만 빌드 및 실행을 누르면 충돌이 발생하는 이유는 무엇입니까?

분류에서Dev

내 코드는 완벽하게 작동했지만 이제 템플릿으로 만들려고 할 때 겉보기에 관련없는 오류가 많이 발생합니다. 여기서 무슨 일이 일어나고 있습니까?

분류에서Dev

Android 앱은 Google Play에서 다운로드 할 때 충돌하지만 로컬 개발자에서는 잘 작동합니다. 이유는 무엇입니까?

분류에서Dev

에뮬레이터 앱에서 APK를 빌드 할 때 완벽하게 작동하며 APK가 모바일에서 작동하지 않습니다.

분류에서Dev

Angular 서비스에서 "창이 정의되지 않았지만"코드는 완벽하게 작동합니다.

분류에서Dev

PHP에서 Rscript를 실행할 수 없지만 터미널에서 완벽하게 실행됩니다.

분류에서Dev

빈 iOS 앱을 빌드하고 실행할 때 xcode 5.0.1이 충돌합니다.

분류에서Dev

Chrome 브라우저의 크기를 조정할 때까지 DOM 요소가로드되지 않습니다 (Safari에서 완벽하게 작동).

분류에서Dev

NODE 환경에서 Javascript를 디버깅 할 때 내 코드 만 실행되도록하는 방법은 무엇입니까?

분류에서Dev

linux-service로서의 Bash-script는 실행되지 않지만 터미널에서 실행하면 완벽하게 작동합니다.

분류에서Dev

linux-service로서의 Bash-script는 실행되지 않지만 터미널에서 실행하면 완벽하게 작동합니다.

분류에서Dev

Meteor 쿼리는 서버에서는 완벽하게 실행되지만 클라이언트에서는 실행되지 않습니다.

분류에서Dev

다른 장치에서는 앱이 충돌하지만 내 장치에서는 완벽하게 작동합니다.

분류에서Dev

장치에서 실행할 때 Spritekit 앱이 충돌하고 신속한 3 변환 후 시뮬레이터에서 작동합니다.

분류에서Dev

VBScript는 명령 프롬프트에서 실행할 때 훌륭하게 작동하지만 Inno Setup에서는 실행되지 않습니다.

분류에서Dev

Jenkins PowerShell : Start-Process with Passthru는 Jenkins에서 실행되지만 PowerShell에서는 실행되지 않을 때 다른 프로세스 ID를 반환합니다.

분류에서Dev

API는 모든 레코드를 검색 할 때 개체 배열을 반환하지만 필터링 할 때는 단일 개체 만 반환합니다.

Related 관련 기사

  1. 1

    스크립트는 수동으로 실행할 때 완벽하게 작동하지만 crontab에서는 뭔가 잘못되었습니다.

  2. 2

    스크립트는 수동으로 실행할 때 완벽하게 작동하지만 crontab에서는 뭔가 잘못되었습니다.

  3. 3

    jQuery : .height ()는 .ready ()에서 null을 반환하지만 동일한 코드 콘솔을 실행할 때 작동합니다.

  4. 4

    MKL 예제 코드는 cmake로 잘 컴파일되지만 실행할 때 충돌합니다.

  5. 5

    Dataflow는 로컬에서 올바른 유형을 반환하지만 클라우드에서 실행할 때는 반환하지 않습니다.

  6. 6

    Android Studio : 코드가 완료되었지만 실행하려고 할 때마다 앱이 충돌 함

  7. 7

    RSelenium은 각 줄을 개별적으로 실행할 때 실행되지만 코드 청크에서 실행할 때는 실행되지 않습니다.

  8. 8

    이 프록시가 항상 프록시에서 'set'을 던지는 이유가 있습니까? 트랩은 'main'속성에 대해 거짓을 반환했지만 그렇지 않으면 완벽하게 실행됩니까?

  9. 9

    Foreach over Excel 셀은 실행중인 첫 번째 행만 반환하지만 메서드를 단계별로 실행할 때 제대로 작동합니다.

  10. 10

    Unity 3D에서 드래그하는 동안 GameObject를 사용할 때 충돌을 감지하는 방법이 BoxCollider 2D와 충돌합니다.

  11. 11

    Unity 3D에서 드래그하는 동안 GameObject를 사용할 때 충돌을 감지하는 방법이 BoxCollider 2D와 충돌합니다.

  12. 12

    내 코드는 완벽하게 컴파일되고 실행되지만 실행 중에 읽지 않는 것과 같은 부분이 있습니다.

  13. 13

    디버그 할 때 코드가 실행되지만 빌드 및 실행을 누르면 충돌이 발생하는 이유는 무엇입니까?

  14. 14

    내 코드는 완벽하게 작동했지만 이제 템플릿으로 만들려고 할 때 겉보기에 관련없는 오류가 많이 발생합니다. 여기서 무슨 일이 일어나고 있습니까?

  15. 15

    Android 앱은 Google Play에서 다운로드 할 때 충돌하지만 로컬 개발자에서는 잘 작동합니다. 이유는 무엇입니까?

  16. 16

    에뮬레이터 앱에서 APK를 빌드 할 때 완벽하게 작동하며 APK가 모바일에서 작동하지 않습니다.

  17. 17

    Angular 서비스에서 "창이 정의되지 않았지만"코드는 완벽하게 작동합니다.

  18. 18

    PHP에서 Rscript를 실행할 수 없지만 터미널에서 완벽하게 실행됩니다.

  19. 19

    빈 iOS 앱을 빌드하고 실행할 때 xcode 5.0.1이 충돌합니다.

  20. 20

    Chrome 브라우저의 크기를 조정할 때까지 DOM 요소가로드되지 않습니다 (Safari에서 완벽하게 작동).

  21. 21

    NODE 환경에서 Javascript를 디버깅 할 때 내 코드 만 실행되도록하는 방법은 무엇입니까?

  22. 22

    linux-service로서의 Bash-script는 실행되지 않지만 터미널에서 실행하면 완벽하게 작동합니다.

  23. 23

    linux-service로서의 Bash-script는 실행되지 않지만 터미널에서 실행하면 완벽하게 작동합니다.

  24. 24

    Meteor 쿼리는 서버에서는 완벽하게 실행되지만 클라이언트에서는 실행되지 않습니다.

  25. 25

    다른 장치에서는 앱이 충돌하지만 내 장치에서는 완벽하게 작동합니다.

  26. 26

    장치에서 실행할 때 Spritekit 앱이 충돌하고 신속한 3 변환 후 시뮬레이터에서 작동합니다.

  27. 27

    VBScript는 명령 프롬프트에서 실행할 때 훌륭하게 작동하지만 Inno Setup에서는 실행되지 않습니다.

  28. 28

    Jenkins PowerShell : Start-Process with Passthru는 Jenkins에서 실행되지만 PowerShell에서는 실행되지 않을 때 다른 프로세스 ID를 반환합니다.

  29. 29

    API는 모든 레코드를 검색 할 때 개체 배열을 반환하지만 필터링 할 때는 단일 개체 만 반환합니다.

뜨겁다태그

보관