Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 2006.11.12;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.48 MB
Время: 0.047 c
2-1161860846
silversmith
2006-10-26 15:07
2006.11.12
Watch показывает неверные значения переменных


2-1161612916
evgenij_
2006-10-23 18:15
2006.11.12
tab.Filter


15-1161706480
Dmytro
2006-10-24 20:14
2006.11.12
Проблема с кодировкой (MSSQL 2005 и PHP5)


2-1161896479
JTAG
2006-10-27 01:01
2006.11.12
Уважаемые коллеги подскажите пожалуйста как создать в квадрате


2-1161773761
kulkse
2006-10-25 14:56
2006.11.12
частная очередь сообщений





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский