मैंने एक ऐडडिपार्टमेंट फ़ंक्शन बनाया है जो एक संरचना को तर्क के रूप में लेता है। जब मैं फ़ंक्शन के निचले भाग में "विभाग [काउंटर]। डिपार्टमेंटहेड" को प्रारंभ करने के लिए इनपुट दर्ज करता हूं, तो यह त्रुटि संदेश को ट्रिगर करता है।

मैं तर्क को दूसरे कोड से कॉपी कर रहा हूं जिसे मैंने संरचनाओं के बजाय कक्षाओं का उपयोग करके लिखा था और वह ठीक काम करता है इसलिए मुझे सच में यकीन नहीं है कि यह क्यों काम नहीं कर रहा है। यह सुनिश्चित करने के लिए कि मैं सरणी के आकार से अधिक नहीं जा रहा था, सूचकांक के साथ खिलवाड़ करने की कोशिश की, लेकिन यह समस्या को ठीक नहीं करता है।

#include <iostream>
#include <fstream>
#include <iomanip>
#include <cstring>

using namespace std;

struct Department{
    string departmentName;
    string departmentHead;
    int departmentID;
    double departmentSalary;
};

//...

Department addDepartment(Department dept[3]){
    int repeat=0;
    int counter=0;
    if (counter>2){
        cout<<"The array is full, you can not add any more Departments."<<endl;
    }
    else{
        cout << "Please Enter Department Details:"<<endl;
        cout << "Department ID : ";
        cin >> dept[counter].departmentID;
        for(int x=0; x<3; x++){
            for (int y=x+1; y<3; y++){
                if(dept[x].departmentID==dept[y].departmentID)
                    repeat++;
            }
        }
        if(repeat!=0)
            cout<<"Value must be unique!"<<endl;
        else{
            cout << "Department Name : ";
            cin >> dept[counter].departmentName;
            cout << "Head of Department : ";
            cin >> dept[counter].departmentHead;
            counter++;
        }
    }
}

//...

int main()
{
    Employee emp[5];
    Department dept[3];
    initialID(emp,dept,0);
    initialID(emp,dept,1);
    int response;
    while(response!=6){
        displayMenu();
        cout<< "Please make a selection : \n";
        cin >> response;
        while((response!=1)&&(response!=2)&&(response!=3)&&(response!=4)&&(response!=5)&&(response!=6)){
            cout<< "Please enter a valid choice (1 - 6): ";
            cin >> response;
        }
        if(response==1){
            addDepartment(dept);
        }
        else if(response==2){
            //addEmployee(emp,dept);
        }
        else if(response==3){

        }
        else if(response==4){

        }
        else if(response==5){
            //salaryReport(dept);
        }
    }
        cout << "Thank you, goodbye.";  
}
-1
stack ex 26 जुलाई 2019, 01:12

2 जवाब

सबसे बढ़िया उत्तर

यह क्यों टूटता है। addDepartment फ़ंक्शन वास्तव में कभी भी विभाग नहीं लौटाता है। जब फ़ंक्शन बाहर निकलता है, तो जिस स्थान पर नव निर्मित विभाग वापसी होगी, उसे अप्रारंभीकृत छोड़ दिया जाएगा। यह अपरिभाषित व्यवहार का कारण बनता है। कंपाइलर Department ऑब्जेक्ट को सामान्य रूप से नष्ट करने की कोशिश करता है, लेकिन क्योंकि इसे कभी भी प्रारंभ नहीं किया गया था, free को कचरा कहा जाता है (त्रुटि के कारण)।

हम वास्तविक विभाग को वापस करने वाले addDepartment में एक लाइन जोड़कर इसे ठीक कर सकते हैं:

Department addDepartment(Department dept[3]){
    int repeat=0;
    int counter=0;
    if (counter>2){
        cout<<"The array is full, you can not add any more Departments."<<endl;
    }
    else{
        cout << "Please Enter Department Details:"<<endl;
        cout << "Department ID : ";
        cin >> dept[counter].departmentID;
        for(int x=0; x<3; x++){
            for (int y=x+1; y<3; y++){
                if(dept[x].departmentID==dept[y].departmentID)
                    repeat++;
            }
        }
        if(repeat!=0)
            cout<<"Value must be unique!"<<endl;
        else{
            cout << "Department Name : ";
            cin >> dept[counter].departmentName;
            cout << "Head of Department : ";
            cin >> dept[counter].departmentHead;
            counter++;
        }
    }
    return /* some department */;
}

वैकल्पिक रूप से, आप addDepartment को शून्य बना सकते हैं।

अन्य विचार। कार्यों के लिए कच्चे C सरणियों को पास न करें। यह वह नहीं करता जो आप चाहते हैं।

अगर आप किसी ऐरे की कॉपी पास करना चाहते हैं, तो एक std::array पास करें, जो अपने आप कॉपी हो जाएगा:

Department addDepartment(std::array<Department, 3> dept); 

यदि आप किसी मौजूदा सरणी के तत्वों को एक्सेस करना चाहते हैं, तो एक पॉइंटर पास करें:

Department addDepartment(Department* dept, int count); 
0
J. Antonio Perez 26 जुलाई 2019, 01:35

एक समस्या जो मुझे दिखाई दे रही है वह यह है कि आप main में 3 Department ऑब्जेक्ट्स की एक सरणी बना रहे हैं और यह मानते हुए कि आपके पास initialID में 5 तत्व हैं।

5 Department ऑब्जेक्ट की एक सरणी बनाने के लिए main बदलें।

int main()
{
    Employee emp[5];
    Department dept[5];

    ...
0
R Sahu 26 जुलाई 2019, 01:18