Ошибка сегментации 11 в C ++ на Mac HighSierra - PullRequest
0 голосов
/ 29 мая 2018

Получается ошибка сегментации 11, когда я пытался выполнить ввод данных в моей программе очереди.Я использую компилятор GCC в моем текстовом редакторе Atom.

#include<iostream>
#include<stdlib.h>
#define MAX 5

using namespace std;

struct queue{
    int data[MAX];
    int awal, akhir;
}antrean;

void first(){
    antrean.awal = -1;
    antrean.akhir = -1;
}

bool isfull(){
    if(antrean.akhir == MAX-1){
        return true;
    }else{
        return false;
    }
}

bool isempty(){
    if(antrean.akhir == -1){
        return true;
    }else{
        return false;
    }
}

void tampildata(){
    if(!isempty()){
        for(int i=antrean.awal; i<antrean.akhir; i++){
            cout<<antrean.data[i]<<" | ";
        }
    }

    cout<<endl;
}

void inqueue(){
    int elemen;

    if(isempty()){
        cout<<"input data : ";
        cin>>elemen;
        antrean.data[antrean.akhir] = elemen;
        antrean.akhir++;
        cout<<"data berhasil ditambah"<<endl;
        tampildata();
    }else{
        cout<<"Queue penuh";
    }
}


void dequeue(){
    tampildata();

    if(!isempty()){
        cout<<"mengambil data "<<antrean.data[antrean.awal]<<endl;

        for(int i=antrean.awal; i<antrean.akhir; i++){
            antrean.data[i]=antrean.data[i+1];
        }

        antrean.akhir--;
    }else{
        cout<<"antrean empty";
    }
}

void cari(){
    if(!isempty() == 1){
        int cari;
        bool state = false;
        cout << "Data yang dicari :";
        cin >> cari;

        for(int i = antrean.awal; i<antrean.akhir; i++){
            if (antrean.data[i] == cari) {
                cout << "Data ditemukan pada indeks Ke-:" << antrean.data[i]+1<< endl;
                state = true;
                break;
            }
        }
    } else{
        cout << "Data tidak ditemukan";
    }
}

void totalarray(){
    int temp = 0;

    for(int i=-1; i<antrean.akhir; i++){
        temp = temp+antrean.data[i];
    }

    cout << "Total nilainya :" << temp;
}

int main(){
    int pilihan, elemen;
    first();

    do{
        tampildata();
        cout<<"1. Init"<<endl<<"2. inQueue"<<endl<<"3. deQueue"<<endl<<"4. tampil data"<<endl<<"5. Cari data"<<endl << "6. Total nilai"<<endl<<"7. Rata-rata Array"<<endl;
        cout<<"8. Nilai terbesar"<<endl<<"9. Nilai terkecil"<<endl<<"10. Clear"<<endl<<"11. Keluar";
        cout<<"input pilihan :";
        cin>>pilihan;

        switch(pilihan){
            case 1:
                first();
                break;
            case 2:
                inqueue();
                break;
            case 3:
                dequeue();
                break;
            case 4:
                tampildata();
                break;
            case 5:
                cari();
                break;
            case 6:
                totalarray();
                break;
            case 7:
                exit(0);
        }
    }

    while(pilihan!=7);
        return 0;
}

1 Ответ

0 голосов
/ 29 мая 2018

Ваша проблема в значении вашего счетчика.Вы изначально установите его на -1 (хотя 0 может иметь больше смысла, если в нем 0 элементов?).Затем, когда вы добавляете в свою очередь в первый раз, вы в основном хотите добавить элемент в (-1) место.Это заставляет вас писать за пределами массива, и возникает ошибка сегментации.

antrean.akhir = -1;
...
antrean.data[antrean.akhir] = elemen;

Вы можете просто установить счетчик на 0 и заставить его фактически считать количество элементов в массиве.

Я не изучил остальную часть кода, поэтому не могу сказать, что позже он не даст сбой по какой-то другой причине.

...