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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 14.06.2012, 21:33   #1
coNsept
Форумчанин
 
Аватар для coNsept
 
Регистрация: 14.12.2009
Сообщений: 716
По умолчанию std::vector и его инициализация

Доброго времени суток уважаемые программисты, решил освоить STL библиотеку но возникли маленькие трудности, вообщем покажу на примере

.h
Код:
struct TeleportReqEx
{
 unsigned char MapIndex; unsigned long ZenReq; unsigned short LevelReq; 
 unsigned short GateNumber; unsigned char NotAvailable; unsigned char IsVip;
};
extern TeleportReqEx TeleportReq;

class MoveReqEx : public virtual ToolKitEx, public virtual cChat
{
public:
 MoveReqEx::MoveReqEx();
 MoveReqEx::~MoveReqEx();
 void AttachMoveReq();

private:
 std::vector<TeleportReqEx> Vect;
 bool ReadMoveReq(char *FileName);
 static void LoadMoveReq();

protected:
 void Teleport(LPOBJ lpObj, BYTE bMapIndex);

};
extern MoveReqEx MoveReq;
ReadMoveReq читает данные из файла и на выходе получает примерно следующее:
1 10000 350 50 0 0
12 20000 150 72 0 0
...


.cpp
Код:
bool MoveReqEx::ReadMoveReq(char *FileName)
{
 if ((SMDFile = fopen(FileName, "r")) == NULL)
  return false;

 int Token = 0;
 static unsigned char Index = 0;

 while (true)
 {
  Token = GetToken();
  if (Token == 2) break;
		
  if (Token == 1)
  {
   TeleportReq.MapIndex = (unsigned char)TokenNumber;
   Token = GetToken();
   TeleportReq.ZenReq = (unsigned long)TokenNumber;
   Token = GetToken();
   TeleportReq.LevelReq = (unsigned short)TokenNumber;
   Token = GetToken();
   TeleportReq.GateNumber = (unsigned short)TokenNumber;
   Token = GetToken();
   TeleportReq.NotAvailable = (unsigned char)TokenNumber;
   Token = GetToken();
   TeleportReq.IsVip = (unsigned char)TokenNumber;

   this->Vect.push_back(TeleportReq);
  }
 }

 fclose(SMDFile); return true;
};
Здесь почему-то и встревает проблема, с чтением данных, мол студия показывает что данных в векторе нема, хотя они точно есть ибо если вывести в файл this->Message еще на стадии чтения файла а быть точнее после его прочтения но в том же методе, все данные из вектора читаются гуд.
Код:
void MoveReqEx::Teleport(LPOBJ lpObj, BYTE bMapIndex)
{
  this->Message(lpObj->m_Index, "[%d][%d][%d][%d][%d][%d]",
  this->Vect[bMapIndex].MapIndex, this->Vect[bMapIndex].ZenReq, this->Vect[bMapIndex].LevelReq, 
this->Vect[bMapIndex].GateNumber, this->Vect[bMapIndex].NotAvalaible, this->Vect[bMapIndex].IsVip);
 gObjMoveGate(lpObj->m_Index, 50);
}

Последний раз редактировалось Stilet; 14.06.2012 в 21:50.
coNsept вне форума Ответить с цитированием
Старый 14.06.2012, 22:01   #2
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Нужно больше кода. Нужно видеть, что происходит после вызова ReadMoveReq(char *FileName)
_Bers вне форума Ответить с цитированием
Старый 14.06.2012, 22:52   #3
coNsept
Форумчанин
 
Аватар для coNsept
 
Регистрация: 14.12.2009
Сообщений: 716
По умолчанию

Первым делом идет чтения файла, после того как вектор был заполнен, в определенный момент уже используется метод Teleport, вот в таком порядке.

И даже если допустим сделать так, все равно возникает чтение с ошибкой, не понятно почему вроде все нормально:

Код:
void MoveReqEx::Teleport(LPOBJ lpObj, BYTE bMapIndex)
{
  this->Message(lpObj->m_Index, "[%d][%d][%d][%d][%d][%d]",
  this->Vect[0].MapIndex, this->Vect[0].ZenReq, this->Vect[0].LevelReq, this->Vect[0].GateNumber, this->Vect[0].NotAvalaible, this->Vect[0].IsVip);
}

Последний раз редактировалось coNsept; 14.06.2012 в 23:01.
coNsept вне форума Ответить с цитированием
Старый 14.06.2012, 23:13   #4
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Тут два варианта:
1. Вектор изначально не был заполнен.
Допустим, брейкнулся на строчке: if (Token == 2) break;

2. Вектор заполнился, но к моменту вызова Teleport() уже был прибит (либо прибился объект, его содержащий)

Сказать что-то конкретное нельзя. Так как ты не соизволил показать код.
Не понятно что происходит ни до ReadMoveReq(), ни после.
_Bers вне форума Ответить с цитированием
Старый 15.06.2012, 01:31   #5
coNsept
Форумчанин
 
Аватар для coNsept
 
Регистрация: 14.12.2009
Сообщений: 716
По умолчанию

На Token == 2 не брякается но я сделал сейчас немного подругому, вывел вектор вне класса и сделал его глобальным и теперь все работает нормально но почему не работает тогда когда он в классе, странно как-то...
Я не понял немного с моментом "прибился"

П.с. Код очень большой и поэтому не получается выложить все, поэтому кусочками максимально как-то пытаюсь объяснить.

Последний раз редактировалось coNsept; 15.06.2012 в 01:39.
coNsept вне форума Ответить с цитированием
Старый 15.06.2012, 13:40   #6
Krok27
Форумчанин
 
Аватар для Krok27
 
Регистрация: 08.07.2010
Сообщений: 505
По умолчанию

Попробуй локальный объект:
Код:
TeleportReqEx TeleportReq;
типа:
Код:
bool MoveReqEx::ReadMoveReq(char *FileName)
{
 if ((SMDFile = fopen(FileName, "r")) == NULL)
  return false;

 int Token = 0;
 static unsigned char Index = 0;

 while (true)
 {
  Token = GetToken();
  if (Token == 2) break;
		
  if (Token == 1)
  {
   TeleportReqEx TeleportReq;
   TeleportReq.MapIndex = (unsigned char)TokenNumber;
   Token = GetToken();
   TeleportReq.ZenReq = (unsigned long)TokenNumber;
   Token = GetToken();
   TeleportReq.LevelReq = (unsigned short)TokenNumber;
   Token = GetToken();
   TeleportReq.GateNumber = (unsigned short)TokenNumber;
   Token = GetToken();
   TeleportReq.NotAvailable = (unsigned char)TokenNumber;
   Token = GetToken();
   TeleportReq.IsVip = (unsigned char)TokenNumber;

   this->Vect.push_back(TeleportReq);
  }
 }

 fclose(SMDFile); return true;
};
Знающий не говорит, говорящий не знает (С) Лао Цзы
Krok27 вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вопрос по std::vector Сtrl Общие вопросы C/C++ 8 21.10.2011 02:16
STL: vector, инициализация Сtrl Общие вопросы C/C++ 3 07.05.2011 19:41
E2015 Ambiguity between 'std::log(double)' and 'std::log(long double)' Namolem Помощь студентам 3 02.04.2011 20:22
ошибка: no match for ‘operator<<’ in ‘std::operator<< [with _Traits = std::char_traits<char> Critter Общие вопросы C/C++ 5 08.08.2010 23:38
std::vector ciaonataha Общие вопросы C/C++ 1 10.05.2009 15:50