Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Чтобы ф-ция принимала данные любых типов


Автор: Гость_DimaS 11.5.2004, 09:05
Чуваки, помогите пожалуйста, мне препод задачу задал
реализовать механизм стека на Си. Я сделал для INT.
Подскажите как сделать, чтобы он принимал и возвращал любые типы данных.
Я пробовал сделать с указателями, но получается что указательта на одну и
ту же переменную и прога хранит фактически одно и тоже зн-е.

Вот прога:

Код
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>

struct Element
{
int Value;
Element *Prev;
};

Element *Current;
int Counter = 0;

void PushStack(int Item)
{
Element *First;
First = new Element;
First->Value = Item;
First->Prev = Current;
Current = First;
  Counter++;
};

int PopStack()
{
if (Counter == 0) return (-1);
int tmp = Current->Value;
Element *Back = Current->Prev;
delete(Current);
Current = Back;
  Counter--;
return (tmp);
};

int main()
{
for (int i=0;  i<26; i++,    printf("%2d ",i), PushStack(i) );
printf("\n");
for (int i=0;  i<26; i++,    printf("%2d ",PopStack()) );
getch();
};

Автор: kruchinin 11.5.2004, 09:23
вместо int Value делаешь
int Length; - длина данных и
void *Data; - сами данные

при создании нового элемента передаешь функции указатель на данные и размер данных.

после чего записываешь в новый элемент размер данных и копируешь(а не присваиваешь адрес одного другому) инфо данных

Автор: bel_nikita 11.5.2004, 10:09
Вот очедерь на STL. Передалать в стек никаких проблемsmile.gif Ведь стек - это очередь.
Код
#include <queue>

typedef unsigned long DWORD;

template <typename T>
class cSTLQueue
{
public:
 void  PutMsg  (T const &Element);     // Put Msg in queue
 bool  ReadMsg (T &Element);           // Get Msg from queue
 DWORD GetQueue() const;               // Get quantity of elements
protected:
 std::queue<T> m_q;
};

template <typename T>
void cSTLQueue<T>::PutMsg(T const &Element){ m_q.push(Element); }

template <typename T>
bool cSTLQueue<T>::ReadMsg(T &Element)
{
 if (!m_q.empty()){  Element=m_q.front(); m_q.pop();  return TRUE;}
 else return FALSE;
}

template <typename T>
DWORD cSTLQueue<T>::GetQueue() const { return m_q.size();  }

Вот тоже самое только на "классике":
Код
const unsigned int CountElements=0x50;

template<typename T>
 class cTPLQueue
 {
 public:
   cTPLQueue        (DWORD uiMaxLen=CountElements);
   ~cTPLQueue       ();
   inline int   AddItem (T const &Item);   // Put Msg in queue
   inline int   ReadItem(T &Item);         // Get Msg from queue
  inline DWORD GetQueue() const;          // Get quantity of elements

 protected:
   DWORD uiNotFull;
   DWORD uiMaxElements, uiSizeElem,uiElements;
   DWORD uiIn, uiOut, uiEndValue;
   void  *pMessageArray;
 };

template<typename T>
 cTPLQueue<T>::cTPLQueue<T>(DWORD uiMaxLen/* =CountElements */)
 {
   uiNotFull=1;
   uiIn = uiOut = 0;
   uiMaxElements=uiMaxLen;
   uiElements=0;
  uiSizeElem=sizeof(T);
   uiEndValue=uiSizeElem*uiMaxElements;
   pMessageArray=malloc(uiEndValue);
   if (!pMessageArray){  cprintf("Not enough memory for TPLQueue!\n");  };
 };

template<typename T>
 cTPLQueue<T>::~cTPLQueue<T>(){  if (pMessageArray) free(pMessageArray); }

template<typename T>
 inline int cTPLQueue<T>::AddItem(T const &Item)
 {
     //Lock();
     if (!uiNotFull)
     {
       //UnLock();
       cprintf("TPLQueue is full!\n");
       return -1;
     };
     memcpy((char*)pMessageArray+uiIn, &Item, uiSizeElem);
     uiIn = (uiIn + uiSizeElem) % uiEndValue;
     uiNotFull=uiOut-uiIn;
   uiElements++;
     //UnLock();
     return 1;
 }

template<typename T>
 inline int cTPLQueue<T>::ReadItem(T &Item)
 {
     //Lock();
     if (!uiNotFull) uiNotFull=1;
     else if (uiIn==uiOut) { UnLock();return -1; }
     memcpy(&Item, (char*)pMessageArray+uiOut, uiSizeElem);
     uiOut = (uiOut+uiSizeElem) % uiEndValue;
   uiElements--;
     //UnLock();
     return 1;
 }

template<typename T>
  inline DWORD cTPLQueue<T>::GetQueue() const{return (uiElements);}

Автор: Спасибо всем огромное 11.5.2004, 19:37
Спасибо всем огромное

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)