Форум программистов
 
О проблемах, например, с регистрацией пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail, а тут можно восстановить пароль.

Вернуться   Форум программистов > C++ > C++ Builder
Регистрация

Восстановить пароль
Повторная активизация e-mail

Здесь нужно купить рекламу за 20 тыс руб в месяц! ) пишите сюда - alarforum@yandex.ru
Без учёта ботов - 20000 человек в день, 350000 в месяц.

Ответ
 
Опции темы
Старый 19.05.2012, 10:04   #1
D00M
 
Регистрация: 19.05.2012
Сообщений: 5
По умолчанию Сортировка стека через массив

Собственно реализую сортировку стека, но при работе вылетает ошибка

вот собственно код сортировки


Код:
int ElStack=0,error1,z,b;
 int *MasStack=new int[ElStack];
 while (error1!=1)
 {
 z=pop(&s,&error1);
 if(error1!=1)
 {ElStack++;
 MasStack[ElStack-1]=z;
 }

 }
 for (int k = 0; k < ElStack - 1; k++)
 {
 int kmin = k;
 for (int j = k + 1; j < ElStack; j++)
 if (MasStack[j] < MasStack[kmin]) kmin = j;
 int a = MasStack[k];
 MasStack[k] = MasStack[kmin];
 MasStack[kmin] = a;
 }
 for(int i=0; i<ElStack; i++)
 { push(&s,MasStack[i]);
 b=peek(&s,&error);
 Form1->StringGrid1->Cells[1][i]=b;}
При построчной компиляции программа падает на моменте выделенным жирным ширфтом



вот код стека


Код:
#include <alloc.h>
//#include "stack.h"
#define STACK struct stack
STACK {
int info;
STACK *next;
};
extern void push(STACK **s, int item);
extern int pop(STACK **s, int *error);
extern int peek(STACK **s, int *error);

void push (STACK **s, int item)
{
STACK *new_item=(STACK*)malloc(sizeof(STACK));
new_item->info=item;
new_item->next=*s;
*s=new_item;
}
int pop(STACK **s, int *error)
{
/* *error = 0, если операция POP выполнена успешно, иначе= 1 */
STACK *old_item=*s;
int old_info=0;
if (*s)
{
old_info=old_item->info;
*s=old_item->next;
free(old_item);
*error=0;
}
else
*error =1 ;
return (old_info);
}
int peek (STACK **s, int *error)
{
/**error = 0 , если в стеке не меньше 1 элемента,
*error = 1 ,ели в стеке нет элементов
*/
if (*s)
{
*error=0;
return(*s)->info;
}
else
{
*error =1;
return 0;
}

Последний раз редактировалось ACE Valery; 19.05.2012 в 17:44.
D00M вне форума Ответить с цитированием
Старый 19.05.2012, 12:22   #2
ACE Valery
Сама себе режиссер
Старожил
 
Аватар для ACE Valery
 
Регистрация: 27.04.2007
Сообщений: 3,378
По умолчанию

а) во-первых, картинка не открывается
б) во-вторых, чего уж там кусочек кода, давайте весь
в) в-третьих, нужна ошибка, с которой программа падает
Если я вас напрягаю или раздражаю, вы всегда можете забиться в угол и поплакать
ACE Valery вне форума Ответить с цитированием
Старый 19.05.2012, 12:44   #3
D00M
 
Регистрация: 19.05.2012
Сообщений: 5
По умолчанию

Поправил, добавил код стека
D00M вне форума Ответить с цитированием
Старый 19.05.2012, 17:44   #4
ACE Valery
Сама себе режиссер
Старожил
 
Аватар для ACE Valery
 
Регистрация: 27.04.2007
Сообщений: 3,378
По умолчанию

проверять времени нет, но похоже, что вы выходите за границу массива
Если я вас напрягаю или раздражаю, вы всегда можете забиться в угол и поплакать
ACE Valery вне форума Ответить с цитированием
Старый 19.05.2012, 18:16   #5
D00M
 
Регистрация: 19.05.2012
Сообщений: 5
По умолчанию

Не много поработал над кодем... и зашел в тупик... после первой сортировки программа отрабатывает правильно, но если очистить стек и заново записать случайным образом, то при повторной сортировке вылетает ошибка


Код:
int ElStack=0,error1,z,b,i;
int *MasStack=new int[ElStack];
for(int i = 1; i < StringGrid1->ColCount; i++)
    for(int j = 0; j < StringGrid1->RowCount; j++)
    StringGrid1->Cells[i][j] = "";

 while (error1!=1)
      {
       z=pop(&y,&error1);
       if(error1!=1)
       {ElStack++;
        MasStack[ElStack-1]=z;
       }

      }
for (int k = 0; k < ElStack - 1; k++)
{
        int kmin = k;
	        for (int j = k + 1; j < ElStack; j++)
                     if (MasStack[j] < MasStack[kmin]) kmin = j;
	             int a = MasStack[k];
	             MasStack[k] = MasStack[kmin];
                     MasStack[kmin] = a;
}

for(i=0; i<=ElStack-1; i++)
 { push(&y,MasStack[i]);
   b=peek(&y,&error);
  Form1->StringGrid1->Cells[2][i]=b;;
 }




Последний раз редактировалось Stilet; 19.05.2012 в 18:50.
D00M вне форума Ответить с цитированием
Старый 20.05.2012, 19:54   #6
D00M
 
Регистрация: 19.05.2012
Сообщений: 5
По умолчанию

Может ли быть это из за билдера?
D00M вне форума Ответить с цитированием
Старый 22.05.2012, 19:54   #7
D00M
 
Регистрация: 19.05.2012
Сообщений: 5
По умолчанию

Разобрался, дело в том что при объявлении динамического массива компилятор выделяет под него память необходимую для первого определенного количества элементов. Поэтому лучше выделять заведомо больше объема памяти либо не использовать динамический массив, что вернее
код сортировки

Код:
void sort(STACK **s) {
	
	STACK *top = *s;
	while ((*s)->next) {
		STACK *tmp = (*s)->next;
		while (tmp) {
			if (tmp->info < (*s)->info) {
				int temp =(*s)->info;
				(*s)->info = tmp->info;
				tmp->info = temp;
			}
			tmp = tmp->next;
		}
		(*s) = (*s)->next;
	}
	*s = top;
}
D00M вне форума Ответить с цитированием
Ответ

Здесь нужно купить рекламу за 20 тыс руб в месяц! ) пишите сюда - alarforum@yandex.ru
Без учёта ботов - 20000 человек в день, 350000 в месяц.

Опции темы


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
реализация стека через односвязный список snusnu Общие вопросы C/C++ 7 06.04.2014 22:59
Сортировка стека dzega Общие вопросы C/C++ 1 03.01.2011 21:53
паскаль,одномерный массив,сортировка вставка,сортировка убывания,от максимального до конца немозг Помощь студентам 11 06.02.2010 21:57
помогите. массив не взамодействует с функцией. какая-то ошибка стека. koir Паскаль, Turbo Pascal, PascalABC.NET 5 10.06.2008 07:32


Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru
Пеллетный котёл Emtas
котлы EMTAS