Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.11.12;
Скачать: CL | DM;

Вниз

Си - чего ему не нравится?   Найти похожие ветки 

 
ArtemESC ©   (2006-10-27 02:04) [0]

Модуль для работы со стеком
#include <stdlib.h>

struct sStackItem {
 void *data;
 struct sStackItem *prev;
};

typedef sStackItem *StackItem;

struct sStack {
 unsigned  count;
 StackItem pointer;
};

typedef sStack *Stack;

Stack newstack()
{
return (Stack) malloc(sizeof(sStack));
}

StackItem newstackitem()
{
return (StackItem) malloc(sizeof(sStackItem));
}

void push(Stack S, void *item)
{
if (S == NULL)
  {
   S          = newstack();
   S->pointer = NULL;
   S->count   = 0;
  }
StackItem p = newstackitem();
p->data     = item;
p->prev     = S->pointer;
S->pointer  = p;
S->count++;
}

void *pop(Stack S)
{
if ((S == NULL) || (S->pointer == NULL))
    return NULL;
StackItem p = S->pointer;
S->pointer  = p->prev;
S->count--;
return p->data;
}


Использую (для теста) так:

#include "stacks.c"
#include <stdlib.h>
#include <stdio.h>

int main()
{
extern void *pop(Stack);
Stack S;
int i;
for (i = 1; i <= 10; i++)
{
 int *p;
 p = (int*) malloc(sizeof(int));
 *p = i;
 push(S, p);
}
for (i = 1; i <= 10; i++)
{
 int *p = (int*) pop(S);
 printf("get element %d\n", *p);
 free(p);
}
return 0;
}


 
Суслик ©   (2006-10-27 02:05) [1]


> ArtemESC ©   (27.10.06 02:04)  

старик, вроде не первый день на форуме - так *вопросы* не задают :)


 
wicked ©   (2006-10-27 02:08) [2]

а где ругается то?
а то там много чего "не так", только, может, ты имеешь в виду что то конкретное?...


 
ArtemESC ©   (2006-10-27 02:10) [3]

wicked ©   (27.10.06 02:08) [2]
Да он и не ругаеться вовсе, просто делает не то что надо - или, точнее, вовсе ничего не делает, а должен просто распечатать числа от 10 до 1 из стека...


 
ArtemESC ©   (2006-10-27 02:16) [4]

Одну ошибку нашел, нужно не
 Stack S; , а Stack S = NULL;, но это не помогло...


 
Ketmar ©   (2006-10-27 02:17) [5]

>[3] ArtemESC(c) 27-Oct-2006, 02:10
у меня это не скомпилировалось ни при помощи bcc, ни при помощи lcc. PellesC тоже подавился.


 
ArtemESC ©   (2006-10-27 02:18) [6]

Ketmar ©   (27.10.06 02:17) [5]
Попробуй с помощью bc, у меня скомпилировалось...


 
Ketmar ©   (2006-10-27 02:30) [7]

>[6] ArtemESC(c) 27-Oct-2006, 02:18
>Попробуй с помощью bc, у меня скомпилировалось...
что было в наличии из современных компиляторов -- то и попробовал. все подавились и отрыгнули.


 
Джо ©   (2006-10-27 03:01) [8]

Господи прости, какие извращения...


 
Проходил тут   (2006-10-27 06:58) [9]

Вот вариант (я все водин листинг слил):

#include <stdlib.h>
#include <stdio.h>

struct sStackItem {
void *data;
struct sStackItem *prev;
};

typedef sStackItem *StackItem;

struct sStack {
unsigned  count;
StackItem pointer;
};

typedef sStack *Stack;

Stack newstack()
{
return (Stack) malloc(sizeof(sStack));
}

StackItem newstackitem()
{
return (StackItem) malloc(sizeof(sStackItem));
}

void push(Stack* S, void *item)
{
if ((*S) == NULL)
 {
  (*S)       = newstack();
  (*S)->pointer = NULL;
  (*S)->count   = 0;
 }
StackItem p = newstackitem();
p->data     = item;
p->prev     = (*S)->pointer;
(*S)->pointer  = p;
(*S)->count++;
}

void *pop(Stack S)
{
if ((S == NULL) || (S->pointer == NULL))
   return NULL;
StackItem p = S->pointer;
S->pointer  = p->prev;
S->count--;
return p->data;
}

int main()
{
Stack S = NULL;
int i;
for (i = 1; i <= 10; i++)
{
int *p;
p = (int*) malloc(sizeof(int));
*p = i;
push(&S, p);
}
for (i = 1; i <= 10; i++)
{
int *p = (int*) pop(S);
printf("get element %d\n", *p);
free(p);
}
return 0;
}

Проблема в том, что при выходе из первого цикла ты предполагаешь что в S есть адрес последнего элемента в стеке (Чего на самом деле нет). Хотя ИМХО не самая удачная реализация. Подумай еще.


 
Celades   (2006-10-27 10:24) [10]

void push(Stack S, void *item)
{
if (S == NULL)
 {
  S          = newstack();
  S->pointer = NULL;
  S->count   = 0;
 }
StackItem p = newstackitem();
p->data     = item;
p->prev     = S->pointer;
S->pointer  = p;
S->count++;
}

Вот здесь память выделеенная в "S          = newstack();" теряется навсегда, после выхода из функции. Надо изменять сигнатуру функции: "void push(Stack* S, void *item)"


 
ArtemESC ©   (2006-10-27 17:53) [11]

Джо ©   (27.10.06 03:01) [8]
Господи прости, какие извращения...

В Си? Или в моем коде...

Проходил тут   (27.10.06 06:58) [9]
Celades   (27.10.06 10:24) [10]
Вот здесь память выделеенная в "S          = newstack();" теряется навсегда, после выхода из функции. Надо изменять сигнатуру функции: "void push(Stack* S, void *item)"
Ну точно - спасибо большое - никак не привыкну к си...


 
Celades   (2006-10-27 19:06) [12]


> никак не привыкну к си...

Ну на Delphi тоже самое:)


 
Слоник_   (2006-10-27 19:18) [13]


> Ну на Delphi тоже самое:)

если S - не экземпляр класса...



Страницы: 1 вся ветка

Текущий архив: 2006.11.12;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.07 c
15-1161112759
DillerXX
2006-10-17 23:19
2006.11.12
Аквариум (группа)


15-1161430711
Kostafey
2006-10-21 15:38
2006.11.12
Компиляция Delphi-проектов из командной строки.


2-1161686802
Krants
2006-10-24 14:46
2006.11.12
Вызвать Hint


15-1161736913
PHPDeveloper
2006-10-25 04:41
2006.11.12
mail.ru


4-1151480576
GelVit
2006-06-28 11:42
2006.11.12
Получение хендла от окна пославшего сообщение?