Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 25.10.2009, 08:34   #1
Valdemar-boom
Новичок
Джуниор
 
Регистрация: 25.10.2009
Сообщений: 1
По умолчанию Проблема с тестированием стека

Здравствуйте! Ребят, задача такая: реализовать стек на основе массива и ссылочного списка. стек заполнить из файла. В файле сгенерировать 50000 строк, в каждой по одному числу. Сравнить скорость выполнения 10^7 операций с каждым стеком (на основе массива и списка). я совсем не силён в С++, тем не менее выдавил из себя следующее:

StackMass.h:
Код:
#pragma once

#define TElement double
class StackMass
{
private:
	TElement *mass;
	int top;
public:
	StackMass(int N=50000)
	{
		mass=new TElement[N];
		top=-1;
	}
	TElement Pop();
	void Push(TElement value);
	TElement ReadTop();
    int Empty();
	
	~StackMass()
	{
		delete []mass;
	}
};
StackList.h:
Код:
#pragma once
#define TElement double

struct TList
{
	(TElement data;
	TList *next;
};
class StackList
{
public:
	void Push(TElement value);
	TElement Pop();
	TElement Top();
	int Empty();
	StackList();
	~StackList();
private:
	TList *top;
};
StackList::~StackList()
{
	while (top) Pop();
};
Stack.cpp:
Код:
#include "StackMass.h"
#include "StackList.h"
#include <iostream>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>

//На основе массива:
void StackMass::Push(TElement value)
{
	top++;
	mass[top]=value;
}

TElement StackMass::Pop()
{
	return mass[top];
	top--;
}
TElement StackMass::ReadTop()
{
	return mass[top];
}
int StackMass::Empty()
{
	if(top==-1)
		return 1;
	else 
		return 0;
}


//На основе списка:
StackList::StackList()
{top=NULL;
}

void StackList::Push(TElement value)
{TList*tmp=new TList;
tmp->data = value;
tmp->next=top;
top=tmp;
}
TElement StackList::Pop()
{TElement value=top->data; 
TList*tmp;
tmp=top->next;
delete top;
top=tmp;
return value;
}
TElement StackList::Top()
{
	return top->data;
}
int StackList::Empty()
{return top!=NULL;
}
и Main.cpp:
Код:
#include "StackMass.h"
#include "StackList.h"
#include <iostream>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <time.h>

clock_t st, end; 
float TiM, TiS;

template <typename T> void Test (T &obj1)
{
	st=clock();
	for (int i=0; i<10000000; i++)
		obj1.Push(1);

	end=clock();
	TiM=(float)(end-st)/CLOCKS_PER_SEC; 
}

void main ()
{
	StackMass mass(50000);
	mass.Push(60.8);
	//printf ("%5.2f\n", mass.ReadTop());
	//printf ("%d", mass.Empty());
	Test (mass);
	printf ("%5.4f\n", TiM);
	//printf ("%5.2f", mass.pop());
	system ("pause");
}
Вот... компилятор ругается уже на этой стадии написания. Не могу понять в чём дело. дебагинг ну никак не даётся(((.. Ошибки:
1)Error 1 error LNK2005: "public: __thiscall StackList::~StackList(void)" (??1StackList@@QAE@XZ) already defined in stack.obj main.obj
2)Error 2 fatal error LNK1169: one or more multiply defined symbols found C:\Documents and Settings\Admin\Мои документы\Visual Studio 2008\Projects\Task1\Debug\Task1.exe 1

Пожалуйчта, подскажите, что значат эти ошибки в чём я накосячил в коде? И буду признателен, если скажете, как в файл рандомно забить 50000 чисел.

Последний раз редактировалось Valdemar-boom; 25.10.2009 в 08:38.
Valdemar-boom вне форума Ответить с цитированием
Старый 26.10.2009, 14:12   #2
mYziK
Пользователь
 
Регистрация: 18.09.2009
Сообщений: 38
По умолчанию

Цитата:
1)Error 1 error LNK2005: "public: __thiscall StackList::~StackList(void)" (??1StackList@@QAE@XZ) already defined in stack.obj main.obj
Деструктор класса StackList определен дважды. Либо сделай так:
Код:
#pragma once
#define TElement double

struct TList
{
	(TElement data;
	TList *next;
};
class StackList
{
public:
	void Push(TElement value);
	TElement Pop();
	TElement Top();
	int Empty();
	StackList();
	~StackList()
           {
	          while (top) Pop();
           };
private:
	TList *top;
};
Либо перенеси:
Код:
StackList::~StackList()
{
	while (top) Pop();
};
в Stack.cpp
mYziK вне форума Ответить с цитированием
Старый 26.10.2009, 14:21   #3
mYziK
Пользователь
 
Регистрация: 18.09.2009
Сообщений: 38
По умолчанию

Цитата:
И буду признателен, если скажете, как в файл рандомно забить 50000 чисел.
может так?
Код:
FILE *f = fopen("filename.txt","w");

for(int i=0;i<50000;++i)
{
    fprintf(f,"%d ",rand()%1000;
}
fclose(f);
rand()%1000 - случайное число от 0 до 1000 не включая 1000 =)
mYziK вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Переполнение стека NoHeart Общие вопросы Delphi 8 08.11.2009 16:03
Переполнение стека Ake Паскаль, Turbo Pascal, PascalABC.NET 3 30.05.2009 22:39
Реализация Стека MjRed Общие вопросы C/C++ 3 13.05.2009 12:18
Переполнение Стека Викдон Паскаль, Turbo Pascal, PascalABC.NET 0 19.12.2008 19:16
Заполнение стека inkvizitor Общие вопросы Delphi 5 08.10.2007 17:01