Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Чтобы ф-ция принимала данные любых типов, Чтобы ф-ция принимала данные любых типов 
:(
    Опции темы
Гость_DimaS
Дата 11.5.2004, 09:05 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Чуваки, помогите пожалуйста, мне препод задачу задал
реализовать механизм стека на Си. Я сделал для 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 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 100
Регистрация: 19.4.2003

Репутация: нет
Всего: нет



вместо int Value делаешь
int Length; - длина данных и
void *Data; - сами данные

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

после чего записываешь в новый элемент размер данных и копируешь(а не присваиваешь адрес одного другому) инфо данных
PM MAIL   Вверх
bel_nikita
Дата 11.5.2004, 10:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Эксперт
Сообщений: 2304
Регистрация: 12.10.2003
Где: Поезд №21/22 ( ст . Прага )

Репутация: 21
Всего: 47



Вот очедерь на 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);}



--------------------
user posted image — регистрация доменов от 150 руб.
PM MAIL WWW ICQ   Вверх
Спасибо всем огромное
Дата 11.5.2004, 19:37 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Спасибо всем огромное
  Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0849 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.