In Code::Blocks, somewhere in my code, I declared an ostringstream object.
But that gives me an segmentation error.
Even only declaring it would rise up an error.
Is this a bug in Code::Blocks or is it my fault?
This is a discussion on Is it a bug? Or is it my fault? within the C++ Programming forums, part of the General Programming Boards category; In Code::Blocks, somewhere in my code, I declared an ostringstream object. But that gives me an segmentation error. Even only ...
In Code::Blocks, somewhere in my code, I declared an ostringstream object.
But that gives me an segmentation error.
Even only declaring it would rise up an error.
Is this a bug in Code::Blocks or is it my fault?
You've probably got an bug somewhere else in your code, and it's manifested itself in the instantiation of the ostringstream object.
You're gonna need to post some code to get more specific than that.
This code below, which is a part of the code above, also has a declaration of ostringstream, but doesn't raise up any error.Code:#include "cGameInstance.h" cGameInstance cGameInstance::a_game; cGameInstance::cGameInstance() { Surf_Card = NULL; Surf_Background = NULL; Surf_Blank = NULL; Surf_Border = NULL; StartTime = 0; Board_Cols = 0; Board_Rows = 0; PairsLeft = 0; ClickState = OPEN_CARD1; CardsOpen[OPEN_CARD1] = NULL; CardsOpen[OPEN_CARD2] = NULL; } void cGameInstance::SetMode(std::string& CardSet, int GameMode) { CardSetFile.assign(CardSet); switch(GameMode) { case FOURFOUR : Board_Cols = 4;Board_Rows = 4;break; case FOURFIVE : Board_Cols = 4;Board_Rows = 5;break; case SIXFIVE : Board_Cols = 6;Board_Rows = 5;break; case SIXSIX : Board_Cols = 6;Board_Rows = 6;break; case SIXSEVEN : Board_Cols = 6;Board_Rows = 7;break; case SIXEIGHT : Board_Cols = 6;Board_Rows = 8;break; case SEVENSIX : Board_Cols = 7;Board_Rows = 6;break; case SEVENEIGHT : Board_Cols = 7;Board_Rows = 8;break; case EIGHTSEVEN : Board_Cols = 8;Board_Rows = 7;break; case EIGHTEIGHT : Board_Cols = 8;Board_Rows = 8;break; } } bool cGameInstance::OnInit() { if((Surf_Background = CSurface::OnLoad("gfx/game.jpg")) == NULL) { MessageBox(GetActiveWindow(), IMG_GetError(), "SDL Resource Load Failure", MB_OK | MB_ICONEXCLAMATION); return false; } if((Surf_Border = CSurface::OnLoad("gfx/border.png")) == NULL) { MessageBox(GetActiveWindow(), IMG_GetError(), "SDL Resource Load Failure", MB_OK | MB_ICONEXCLAMATION); return false; } if((Surf_Blank = CSurface::OnLoad("gfx/card.png")) == NULL) { MessageBox(GetActiveWindow(), IMG_GetError(), "SDL Resource Load Failure", MB_OK | MB_ICONEXCLAMATION); return false; } if((Surf_Card = CSurface::OnLoad(CardSetFile.c_str())) == NULL) { MessageBox(GetActiveWindow(), IMG_GetError(), "SDL Resource Load Failure", MB_OK | MB_ICONEXCLAMATION); return false; } GenerateGameCards(); ResetCards(); return true; } void cGameInstance::ResetGame() { CardList.clear(); GenerateGameCards(); ResetCards(); } void cGameInstance::GenerateGameCards() { srand(SDL_GetTicks()); PairsLeft = (Board_Cols * Board_Rows) >> 1; unsigned Cards = Board_Cols * Board_Rows; unsigned *Digits = new unsigned[Cards]; memset(Digits, 0, sizeof(unsigned) * Cards); for(unsigned i = 0;i < PairsLeft;++i) { unsigned Number; unsigned Index; bool done; do { done = true; Number = (rand() % MAX_CARDS) + 1; for(Index = 0;Index < Cards;++Index) { if(Digits[Index] == Number) { done = false; break; } } } while(!done); do Index = rand() % Cards;while(Digits[Index] != 0); Digits[Index] = Number; do Index = rand() % Cards;while(Digits[Index] != 0); Digits[Index] = Number; } for(unsigned i = 0;i < Cards;++i) { cCard newCard(Digits[i] - 1, Surf_Card); CardList.push_back(newCard); } delete [] Digits; unsigned spaceX = (BOARD_WIDTH - (Board_Cols * IMAGE_W)) / (Board_Cols + 1); unsigned spaceY = (BOARD_HEIGHT - (Board_Rows * IMAGE_H)) / (Board_Rows + 1); for(unsigned i = 0;i < Cards;++i) { CardList[i].whereX = ((i % Board_Cols) * IMAGE_W) + (((i % Board_Cols) + 1) * spaceX) + ((SCREEN_WIDTH - BOARD_WIDTH ) / 2); CardList[i].whereY = ((i / Board_Cols) * IMAGE_H) + (((i / Board_Cols) + 1) * spaceY) + ((SCREEN_HEIGHT - BOARD_HEIGHT) / 2); } StartTime = SDL_GetTicks(); } void cGameInstance::OnCleanUp() { CardList.clear(); CardsOpen[OPEN_CARD1] = NULL; CardsOpen[OPEN_CARD2] = NULL; SDL_FreeSurface(Surf_Background); Surf_Background = NULL; SDL_FreeSurface(Surf_Border); Surf_Border = NULL; SDL_FreeSurface(Surf_Blank); Surf_Blank = NULL; SDL_FreeSurface(Surf_Card); Surf_Card = NULL; } void cGameInstance::OnPause() { } void cGameInstance::OnResume() { } void cGameInstance::ResetCards() { for(unsigned i = 0;i < CardList.size();++i) { CardList[i].Closed = !CardList[i].Found; } CardsOpen[OPEN_CARD1] = NULL; CardsOpen[OPEN_CARD2] = NULL; ClickState = OPEN_CARD1; } void cGameInstance::OnEvent(cGameEngine *Memory_Game) { SDL_Event event; if(SDL_WaitEvent(&event)) { switch(event.type) { case SDL_QUIT : Memory_Game -> Quit();break; case SDL_KEYDOWN : { switch(event.key.keysym.sym) { case SDLK_ESCAPE : Memory_Game -> PopState();break; default : break; } } break; case SDL_MOUSEMOTION : { for(unsigned i = 0;i < CardList.size();++i) { CardList[i].OnMouseMove(event.motion.x, event.motion.y); } break; } case SDL_MOUSEBUTTONDOWN : { switch(event.button.button) { case SDL_BUTTON_LEFT : { if(ClickState == RESET_CARD) ResetCards(); else if(ClickState == OPEN_CARD1 || ClickState == OPEN_CARD2) { for(unsigned i = 0;i < CardList.size();++i) { CardsOpen[ClickState] = CardList[i].OnLeftButtonDown(); if(CardsOpen[ClickState] != NULL) { ClickState++; break; } } } break; } default: break; } break; } default : break; } } if(PairsLeft == 0) { std::ostringstream Message; float Time = (SDL_GetTicks() - StartTime) / 1000.0f; Message << "Well Done! Your Time Was " << Time << " seconds.\nDo You Want To Play Again?"; if(MessageBox(GetActiveWindow(), Message.str().c_str(), "Well Done!", MB_YESNO | MB_ICONINFORMATION) == IDYES) ResetGame(); else Memory_Game -> PopState(); } } void cGameInstance::OnLoop() { std::ostringstream WindowCaption; WindowCaption << "MEMORY_GAME - Pairs Left : " << PairsLeft; SDL_WM_SetCaption(WindowCaption.str().c_str(), NULL); if(CardsOpen[OPEN_CARD1] == NULL || CardsOpen[OPEN_CARD2] == NULL) return; if(CardsOpen[OPEN_CARD1] -> Type == CardsOpen[OPEN_CARD2] -> Type) { CardsOpen[OPEN_CARD1] -> Found = CardsOpen[OPEN_CARD2] -> Found = true; CardsOpen[OPEN_CARD1] -> OnHover = CardsOpen[OPEN_CARD2] -> OnHover = false; ResetCards(); PairsLeft--; } } void cGameInstance::OnRender(SDL_Surface *Surf_Display) { if(Surf_Display == NULL || Surf_Background == NULL) return; CSurface::OnDraw(Surf_Display, Surf_Background, 0, 0); for(unsigned i = 0;i < CardList.size();++i) { CardList[i].OnRender(Surf_Display, Surf_Border, Surf_Blank); } } cGameInstance* cGameInstance::Instance() { return &a_game; }
While the declaration of WindowCaption below does raise an error, even if I remove the next two lines.Code:if(PairsLeft == 0) { std::ostringstream Message; float Time = (SDL_GetTicks() - StartTime) / 1000.0f; Message << "Well Done! Your Time Was " << Time << " seconds.\nDo You Want To Play Again?"; if(MessageBox(GetActiveWindow(), Message.str().c_str(), "Well Done!", MB_YESNO | MB_ICONINFORMATION) == IDYES) ResetGame(); else Memory_Game -> PopState(); }
And also, this only happens in Code::Blocks, not in MinGW Developer StudioCode:void cGameInstance::OnLoop() { std::ostringstream WindowCaption; WindowCaption << "MEMORY_GAME - Pairs Left : " << PairsLeft; SDL_WM_SetCaption(WindowCaption.str().c_str(), NULL); if(CardsOpen[OPEN_CARD1] == NULL || CardsOpen[OPEN_CARD2] == NULL) return; if(CardsOpen[OPEN_CARD1] -> Type == CardsOpen[OPEN_CARD2] -> Type) { CardsOpen[OPEN_CARD1] -> Found = CardsOpen[OPEN_CARD2] -> Found = true; CardsOpen[OPEN_CARD1] -> OnHover = CardsOpen[OPEN_CARD2] -> OnHover = false; ResetCards(); PairsLeft--; } }
Last edited by ThLstN; 08-24-2008 at 09:47 AM.