【发布时间】:2015-03-28 13:31:52
【问题描述】:
这是动态堆栈,从1到6有一些函数,0退出,当我选择6时,它显示这个错误“分段错误(核心转储) ”,我有 g++ 编译器,我正在其中编译,但是当我使用代码块时它可以工作,任何人都可以帮忙`
#include <stdlib.h>
#include <iostream>
using namespace std;
const int n=100;
struct Stack{
int A[n];
int count;
};
//создание стека
void Creation(Stack *p)
{
p->count=0;
}
//проверка стека на пустоту
int Full(Stack *p)
{
if (p->count==0){
return 1;
}
else if (p->count==n) {
return -1;
}
else {
return 0;
}
}
//добавление элемента
void Add(Stack *p)
{
int value;
cout<<"Введите элемент > "; cin>>value;
p->A[p->count]=value;
p->count++;
}
//удаление элемента
void Delete(Stack *p)
{
p->count--;
}
//вывод верхнего элемента
int Top(Stack *p)
{
return p->A[p->count-1];
}
//размер стека
int Size(Stack *p)
{
return p->count;
}
int show(Stack *p){
int i=0;
while(i!=p->count){
cout<<p->A[i]<<endl;
i++;
}
}
void transposition(Stack *p){
int temp,i = 0;
int a[p->count];
int max,min = p->A[0];
int max_pos,min_pos;
while(i!=p->count){
a[i] = p->A[i];
if(p->A[i] > max){
max = p->A[i];
max_pos = i;
}
i++;
}
int j=0;
while(j!=p->count){
if(p->A[j] < min){
min = p->A[j];
min_pos = j;
}
j++;
}
temp = p->A[max_pos];
p->A[max_pos] = p->A[min_pos];
p->A[min_pos] = temp;
}
//главная функция
int main()
{
setlocale(LC_ALL,"Russian");
Stack s;
Creation(&s);
char number;
do
{ cout<<"1. Добавить элемент"<<endl;
cout<<"2. Удалить элемент"<<endl;
cout<<"3. Вывести верхний элемент"<<endl;
cout<<"4. Узнать размер стека"<<endl;
cout<<"5. Вывесьте все элементе стека"<<endl;
cout<<"6. Перестановка max и min элемента стека"<<endl;
cout<<"0. Выйти"<<endl;
cout<<"Номер команды > "; cin>>number;
switch (number)
{
case '1':
if (Full(&s)==-1){
cout<<endl<<"Стек заполнен\n\n";
}
else{
Add(&s);
cout<<endl<<"Элемент добавлен в стек\n\n";
}
break;
//-----------------------------------------------
case '2':
if (Full(&s)==1) {
cout<<endl<<"Стек пуст\n\n";
}
else{
Delete(&s);
cout<<endl<<"Элемент удален из стека\n\n";
}
break;
//-----------------------------------------------
case '3':
if (Full(&s)==1) {
cout<<endl<<"Стек пуст\n\n";
}
else {
cout<<"\nВерхний элемент: "<<Top(&s)<<"\n\n";
}
break;
//-----------------------------------------------
case '4':
if (Full(&s)==1){
cout<<endl<<"Стек пуст\n\n";
}
else{
cout<<"\nРазмер стека: "<<Size(&s)<<"\n\n";
}
break;
//-----------------------------------------------
case '5':
if (Full(&s)==1){
cout<<endl<<"Стек пуст\n\n";
}
else{
show(&s);
}
break;
//-----------------------------------------------
case '6':
if (Full(&s)==1){
cout<<endl<<"Стек пуст\n\n";
}
else {
transposition(&s);
}
break;
//-----------------------------------------------
case '0': break;
default:
cout<<endl<<"Команда не определена\n\n";
break;
}
} while(number!='0');
system("pause");
}
`
【问题讨论】:
-
为什么在 C++ 中使用对它们进行操作(甚至初始化)的结构和方法而不是对象?这是在重新发明轮子......
-
这可能是因为
transposition中未初始化的数组索引。使用调试器逐步执行该函数,看看哪些设置为合理值,哪些没有设置。 -
警告:GDB:设置控制终端失败:不允许操作
-
这看起来像 C,除了使用
std::cout,如果你想用 C++ 方式使用一个类并删除数组以支持std::vector,<stdlib.h>应该是 @ 987654326@ -
DevC++ 已经过时了,AFAIK。升级你的编译器。
标签: c++ compiler-errors stack runtime-error dev-c++