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

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

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

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 26.03.2012, 19:31   #1
ichigo9911
Пользователь
 
Регистрация: 16.08.2010
Сообщений: 16
По умолчанию ошибка в использовании vector

Код:
#include "Stack.h"
#include "Stash.h"
#include <stdio.h>
#include <fstream>
#include <iostream>
#include <string>
#include <vector>

using namespace std;

int main()
{

	
	ifstream in("C:\\My Projects\\Ekkel\\StackOfStash\\ipconfig.txt");
	Stack SStack;
	SStack.initialize();
	string line;
	int k=1;
	
	const int bufsize=80;
	const int n=5;// по сколько строк храним в Stash
	Stash* StashP;
	bool b=true;// признак конца файла
	while (1)
	{
		StashP = new Stash;
		StashP -> initialize(sizeof(char) * bufsize);
		
		for (int i=0; i<n; i++)
		{// пишем строки в Stash
			if ( getline(in, line) )
				StashP->add(line.c_str());
			else
			{
				b=false;
				break;
			}
		}
		
		SStack.push(StashP);
		if (b==false)
			break;
	}


	vector<Stash*> StashPv;
	while ( (StashP = (Stash*)SStack.pop()) != 0 )
		StashPv.push_back(StashP);// переписали указатели в вектор

	string* sp;
	for(int i=StashPv.size()-1; i>=0; i--)
	{
		while ( ( sp = static_cast<string*>( StashPv[i]->fetch(i++) ) ) != 0 )
			printf("%s\n", sp);
		i=0;
	}

	StashPv.clear();
	SStack.cleanup();

	while (1);
	return 0;
}
Не могу понять, почему вылезает ошибка
Debug Assertion Failed!

Program: c:\My Projects\Ekkel\StackOfStash.exe
File: c:\program files\microsoft visual studio 10.0\vc\include\vector
Line: 932

Expression: vector subscript out of range

For information on how your programcan cause an assertion failure, see the visual C++ documentation on asserts.

(Press Retry to debug the application)


на строке while ( ( sp = static_cast<string*>( StashPv[i]->fetch(i++) ) ) != 0 )
ichigo9911 вне форума Ответить с цитированием
Старый 26.03.2012, 19:40   #2
pproger
C++ hater
СтарожилДжуниор
 
Аватар для pproger
 
Регистрация: 19.07.2009
Сообщений: 3,333
По умолчанию

Код:
while ( ( sp = static_cast<string*>( StashPv[i]->fetch(i++) ) ) != 0 )
в лучшем случае крутился бы на одном месте. в худшем - будет падать.
пс. код шлак
I invented the term Object-Oriented, and I can tell you I did not have C++ in mind. (c)Alan Kay

My other car is cdr.

Q: Whats the object-oriented way to become wealthy?
A: Inheritance
pproger вне форума Ответить с цитированием
Старый 26.03.2012, 19:45   #3
ichigo9911
Пользователь
 
Регистрация: 16.08.2010
Сообщений: 16
По умолчанию

Цитата:
Сообщение от pproger Посмотреть сообщение
Код:
while ( ( sp = static_cast<string*>( StashPv[i]->fetch(i++) ) ) != 0 )
в лучшем случае крутился бы на одном месте. в худшем - будет падать.
пс. код шлак
а что именно в этой строке не так?
ichigo9911 вне форума Ответить с цитированием
Старый 26.03.2012, 20:21   #4
pproger
C++ hater
СтарожилДжуниор
 
Аватар для pproger
 
Регистрация: 19.07.2009
Сообщений: 3,333
По умолчанию

2ichigo9911
а ты сам подумай, что первым должно выполниться из того, что я выделил.

пс. тебя мама не учила говорить спасибо, если тебе помогли? вчера я тебе ответил - и молчок. хотя бы отписать нужно, правильно или нет, если у кого то еще такой вопрос возникнет. да и старые твои темы посмотрел - везде игноришь людей, которые тебе отвечали
I invented the term Object-Oriented, and I can tell you I did not have C++ in mind. (c)Alan Kay

My other car is cdr.

Q: Whats the object-oriented way to become wealthy?
A: Inheritance
pproger вне форума Ответить с цитированием
Старый 26.03.2012, 21:45   #5
ichigo9911
Пользователь
 
Регистрация: 16.08.2010
Сообщений: 16
По умолчанию

-----------5----------4-------------------1--2-------3-------6
while ( ( sp = static_cast<string*>( StashPv[i]->fetch(i++) ) ) != 0 )

должно выполняться в таком порядке

З.Ы. Признаю, не прав, за ответы большое спасибо)
ichigo9911 вне форума Ответить с цитированием
Старый 26.03.2012, 23:57   #6
pproger
C++ hater
СтарожилДжуниор
 
Аватар для pproger
 
Регистрация: 19.07.2009
Сообщений: 3,333
По умолчанию

Цитата:
должно выполняться в таком порядке
не должно.

ты скажи, в чем задача состоит. код у тебя очень плохой
I invented the term Object-Oriented, and I can tell you I did not have C++ in mind. (c)Alan Kay

My other car is cdr.

Q: Whats the object-oriented way to become wealthy?
A: Inheritance
pproger вне форума Ответить с цитированием
Старый 27.03.2012, 00:39   #7
ichigo9911
Пользователь
 
Регистрация: 16.08.2010
Сообщений: 16
По умолчанию

Каждая структура Stash должна содержать пять строк из входного файла.
Экземпляры Stash нужно создавать оператором new. Нужно загрузить файл в Stack,
затем снова вывести его в исходной форме, извлекая из Stack.

Код:
struct Stash
{
	int size;// размер каждого элемента
	int quantity;// количество элементов
	int next;// следующий пустой элемент
	vector<char> storage;// динамически выделяемый байтовый массив
	void initialize(int size);
	void cleanup();
	int add(const void* element);// вставляет элемент в следующую свободную позицию Stash
	void* fetch(int index); //возвращает адрес элемента с номером index
	int count(); // количество элементов в Stash
	void inflate(int increase); // выделение памяти для Stash
};

struct Stack
{
	struct Link
	{
		void* data;
		Link* next;
		void initialize(void* dat, Link*nxt);
	}*head;
	void initialize();
	void push(void* dat);// добавление эл-в в стек
	void* peek();// возвращает указатель на верхний эл-т стека
	void* pop();// возвращает указатель на верхний эл-т стека и удаляет его
	void cleanup();
};
ichigo9911 вне форума Ответить с цитированием
Старый 27.03.2012, 02:27   #8
pproger
C++ hater
СтарожилДжуниор
 
Аватар для pproger
 
Регистрация: 19.07.2009
Сообщений: 3,333
По умолчанию

2ichigo9911
если следовать твоему описанию
Код:
#include <iostream>
#include <fstream>
#include <stack>

struct Stash {
	std::string m_strings[5];

	size_t getSize() const { return sizeof(m_strings) / sizeof(m_strings[0]); }
};

std::istream &operator>>(std::istream &stream, Stash &stash)
{
	for (size_t i = 0; i < stash.getSize(); i++) {
		std::getline(stream, stash.m_strings[i]);
	}
	return stream;
}

std::ostream &operator<<(std::ostream &stream, const Stash &stash)
{
	for (size_t i = 0; i < stash.getSize(); i++) {
		stream << stash.m_strings[i] << std::endl;
	}
	return stream;
}

void printStack(std::stack<Stash *> &s)
{
	if (!s.size())
		return;

	Stash *t = s.top();
	s.pop();

	printStack(s);

	std::cout << *t << std::endl;
	s.push(t);
}

int main ()
{
	std::fstream f("dde");
	std::stack<Stash *> myStack;

	while (!f.eof()) {
		Stash *s = new Stash;

		if (!(f >> *s)) {
			delete s;
			break;
		}

		myStack.push(s);
	}

	printStack(myStack);
}
память, выделенную для элементов стека не чищу

а, да, файлик для теста брал такой:
Цитата:
this is line number 1
this is line number 2
this is line number 3
this is line number 4
this is line number 5
this is line number 6
this is line number 7
this is line number 8
this is line number 9
this is line number 10
this is line number 11
this is line number 12
this is line number 13
this is line number 14
this is line number 15
т.е в стеке находятся 3 элемента. соответственно, если в файле кол-во строк не кратно 5, то остаток считаем ошибкой ввода
I invented the term Object-Oriented, and I can tell you I did not have C++ in mind. (c)Alan Kay

My other car is cdr.

Q: Whats the object-oriented way to become wealthy?
A: Inheritance

Последний раз редактировалось pproger; 27.03.2012 в 02:31.
pproger вне форума Ответить с цитированием
Старый 28.03.2012, 01:00   #9
ichigo9911
Пользователь
 
Регистрация: 16.08.2010
Сообщений: 16
По умолчанию

Не компилируется) Ошибку пока исправить не могу, потому что про перегрузку операторов еще не знаю) Спасибо, дальше сам что-нибудь придумаю)
ichigo9911 вне форума Ответить с цитированием
Старый 28.03.2012, 01:40   #10
pproger
C++ hater
СтарожилДжуниор
 
Аватар для pproger
 
Регистрация: 19.07.2009
Сообщений: 3,333
По умолчанию

Ну на что ругается? Текст ошибки
I invented the term Object-Oriented, and I can tell you I did not have C++ in mind. (c)Alan Kay

My other car is cdr.

Q: Whats the object-oriented way to become wealthy?
A: Inheritance
pproger вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ошибка в использовании методов класса Jugger Общие вопросы C/C++ 2 26.10.2011 01:29
Ошибка при использовании темплейта optimator Общие вопросы C/C++ 5 06.10.2011 14:44
ошибка в использовании функции Repac123456 Помощь студентам 4 24.02.2011 11:50
Ошибка с классом vector Stepan575 Общие вопросы C/C++ 6 26.11.2010 14:13
Ошибка в использовании сегмента Miller-1981 Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 10 10.06.2009 16:04