Author Topic: Compilation Crash or C++ Problem ?  (Read 6838 times)

Offline JackDawson

  • Multiple posting newcomer
  • *
  • Posts: 37
Compilation Crash or C++ Problem ?
« on: December 04, 2011, 10:14:50 pm »
I'm not exactly sure where to post this. I am trying to solve a riddle here.

IT actually compiles the EXE and It does run. The problem is, it crashes inside the C::B IDE if I try to compile AND run it inside the IDE.

So I'm confused if this is a bug or if I am just missing something. Keep in mind, all the libraries are there and obviously running. Because the EXE compiles with no errors. But it still doesn't prevent the program from crashing inside the IDE.

main.cpp file

Code
/* Permission is hereby granted, free of charge, to any person obtaining a copy
 * of this software and associated documentation files (the "Software"), to deal
 * in the Software without restriction, including without limitation the rights
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 * copies of the Software, and to permit persons to whom the Software is
 * furnished to do so, subject to the following conditions:
 *
 * The above notice and this permission notice shall be included in all copies
 * or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
 * SOFTWARE.
 */
/* File for "Textures" lesson of the OpenGL tutorial on
 * www.videotutorialsrock.com
 */



#include <iostream>
#include <stdlib.h>
#include <ios>
#include <assert.h>
#include <fstream>
#ifdef __APPLE__
#include <OpenGL/OpenGL.h>
#include <GLUT/glut.h>
#else
#include <GL/glut.h>
#endif
#include "imageloader.h"

using namespace std;

void handleKeypress(unsigned char key, int x, int y) {
switch (key) {
case 27: //Escape key
exit(0);
}
}

//Makes the image into a texture, and returns the id of the texture
GLuint loadTexture(Image* image) {
GLuint textureId;
glGenTextures(1, &textureId); //Make room for our texture
glBindTexture(GL_TEXTURE_2D, textureId); //Tell OpenGL which texture to edit
//Map the image to the texture
glTexImage2D(GL_TEXTURE_2D,                //Always GL_TEXTURE_2D
0,                            //0 for now
GL_RGB,                       //Format OpenGL uses for image
image->width, image->height,  //Width and height
0,                            //The border of the image
GL_RGB, //GL_RGB, because pixels are stored in RGB format
GL_UNSIGNED_BYTE, //GL_UNSIGNED_BYTE, because pixels are stored
                  //as unsigned numbers
image->pixels);               //The actual pixel data
return textureId; //Returns the id of the texture
}

GLuint _textureId; //The id of the texture

void initRendering() {
glEnable(GL_DEPTH_TEST);
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
glEnable(GL_NORMALIZE);
glEnable(GL_COLOR_MATERIAL);

Image* image = loadBMP("vtr.bmp");
_textureId = loadTexture(image);
delete image;
}

void handleResize(int w, int h) {
glViewport(0, 0, w, h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(45.0, (float)w / (float)h, 1.0, 200.0);
}

void drawScene() {
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();

glTranslatef(0.0f, 1.0f, -6.0f);

GLfloat ambientLight[] = {0.2f, 0.2f, 0.2f, 1.0f};
glLightModelfv(GL_LIGHT_MODEL_AMBIENT, ambientLight);

GLfloat directedLight[] = {0.7f, 0.7f, 0.7f, 1.0f};
GLfloat directedLightPos[] = {-10.0f, 15.0f, 20.0f, 0.0f};
glLightfv(GL_LIGHT0, GL_DIFFUSE, directedLight);
glLightfv(GL_LIGHT0, GL_POSITION, directedLightPos);

glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, _textureId);

//Bottom
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
//glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
//glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glColor3f(1.0f, 0.2f, 0.2f);
glBegin(GL_QUADS);

glNormal3f(0.0, 1.0f, 0.0f);
glTexCoord2f(0.0f, 0.0f);
glVertex3f(-2.5f, -2.5f, 2.5f);
glTexCoord2f(1.0f, 0.0f);
glVertex3f(2.5f, -2.5f, 2.5f);
glTexCoord2f(1.0f, 1.0f);
glVertex3f(2.5f, -2.5f, -2.5f);
glTexCoord2f(0.0f, 1.0f);
glVertex3f(-2.5f, -2.5f, -2.5f);

glEnd();

//Back
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glColor3f(1.0f, 1.0f, 1.0f);
glBegin(GL_TRIANGLES);

glNormal3f(0.0f, 0.0f, 1.0f);
glTexCoord2f(0.0f, 0.0f);
glVertex3f(-2.5f, -2.5f, -2.5f);
glTexCoord2f(5.0f, 5.0f);
glVertex3f(0.0f, 2.5f, -2.5f);
glTexCoord2f(10.0f, 0.0f);
glVertex3f(2.5f, -2.5f, -2.5f);

glEnd();

//Left
glDisable(GL_TEXTURE_2D);
glColor3f(1.0f, 0.7f, 0.3f);
glBegin(GL_QUADS);

glNormal3f(1.0f, 0.0f, 0.0f);
glVertex3f(-2.5f, -2.5f, 2.5f);
glVertex3f(-2.5f, -2.5f, -2.5f);
glVertex3f(-2.5f, 2.5f, -2.5f);
glVertex3f(-2.5f, 2.5f, 2.5f);

glEnd();

glutSwapBuffers();
}

int main(int argc, char** argv) {
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
glutInitWindowSize(400, 400);

glutCreateWindow("Textures - videotutorialsrock.com");
initRendering();

glutDisplayFunc(drawScene);
glutKeyboardFunc(handleKeypress);
glutReshapeFunc(handleResize);

glutMainLoop();
return 0;
}



imageuploader.cpp file

Code
/* Permission is hereby granted, free of charge, to any person obtaining a copy
 * of this software and associated documentation files (the "Software"), to deal
 * in the Software without restriction, including without limitation the rights
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 * copies of the Software, and to permit persons to whom the Software is
 * furnished to do so, subject to the following conditions:
 *
 * The above notice and this permission notice shall be included in all copies
 * or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
 * SOFTWARE.
 */
/* File for "Textures" lesson of the OpenGL tutorial on
 * www.videotutorialsrock.com
 */


#include <iostream>
#include <stdlib.h>
#include <ios>
#include <assert.h>
#include <fstream>
#ifdef __APPLE__
#include <OpenGL/OpenGL.h>
#include <GLUT/glut.h>
#else
#include <GL/glut.h>
#endif
#include "imageloader.h"







using namespace std;

Image::Image(char* ps, int w, int h) : pixels(ps), width(w), height(h) {

}

Image::~Image() {
delete[] pixels;
}

namespace {
//Converts a four-character array to an integer, using little-endian form
int toInt(const char* bytes) {
return (int)(((unsigned char)bytes[3] << 24) |
((unsigned char)bytes[2] << 16) |
((unsigned char)bytes[1] << 8) |
(unsigned char)bytes[0]);
}

//Converts a two-character array to a short, using little-endian form
short toShort(const char* bytes) {
return (short)(((unsigned char)bytes[1] << 8) |
  (unsigned char)bytes[0]);
}

//Reads the next four bytes as an integer, using little-endian form
int readInt(ifstream &input) {
char buffer[4];
input.read(buffer, 4);
return toInt(buffer);
}

//Reads the next two bytes as a short, using little-endian form
short readShort(ifstream &input) {
char buffer[2];
input.read(buffer, 2);
return toShort(buffer);
}

//Just like auto_ptr, but for arrays
template<class T>
class auto_array {
private:
T* array;
mutable bool isReleased;
public:
explicit auto_array(T* array_ = NULL) :
array(array_), isReleased(false) {
}

auto_array(const auto_array<T> &aarray) {
array = aarray.array;
isReleased = aarray.isReleased;
aarray.isReleased = true;
}

~auto_array() {
if (!isReleased && array != NULL) {
delete[] array;
}
}

T* get() const {
return array;
}

T &operator*() const {
return *array;
}

void operator=(const auto_array<T> &aarray) {
if (!isReleased && array != NULL) {
delete[] array;
}
array = aarray.array;
isReleased = aarray.isReleased;
aarray.isReleased = true;
}

T* operator->() const {
return array;
}

T* release() {
isReleased = true;
return array;
}

void reset(T* array_ = NULL) {
if (!isReleased && array != NULL) {
delete[] array;
}
array = array_;
}

T* operator+(int i) {
return array + i;
}

T &operator[](int i) {
return array[i];
}
};
}

Image* loadBMP(const char* filename) {
ifstream input;
input.open(filename, ifstream::binary);
assert(!input.fail() || !"Could not find file");
char buffer[2];
input.read(buffer, 2);
assert((buffer[0] == 'B' && buffer[1] == 'M') || !"Not a bitmap file");
input.ignore(8);
int dataOffset = readInt(input);

//Read the header
int headerSize = readInt(input);
int width;
int height;
switch(headerSize) {
case 40:
//V3
width = readInt(input);
height = readInt(input);
input.ignore(2);
assert(readShort(input) == 24 || !"Image is not 24 bits per pixel");
assert(readShort(input) == 0 || !"Image is compressed");
break;
case 12:
//OS/2 V1
width = readShort(input);
height = readShort(input);
input.ignore(2);
assert(readShort(input) == 24 || !"Image is not 24 bits per pixel");
break;
case 64:
//OS/2 V2
assert(!"Can't load OS/2 V2 bitmaps");
break;
case 108:
//Windows V4
assert(!"Can't load Windows V4 bitmaps");
break;
case 124:
//Windows V5
assert(!"Can't load Windows V5 bitmaps");
break;
default:
assert(!"Unknown bitmap format");
}

//Read the data
int bytesPerRow = ((width * 3 + 3) / 4) * 4 - (width * 3 % 4);
int size = bytesPerRow * height;
auto_array<char> pixels(new char[size]);
input.seekg(dataOffset, ios_base::beg);
input.read(pixels.get(), size);

//Get the data into the right format
auto_array<char> pixels2(new char[width * height * 3]);
for(int y = 0; y < height; y++) {
for(int x = 0; x < width; x++) {
for(int c = 0; c < 3; c++) {
pixels2[3 * (width * y + x) + c] =
pixels[bytesPerRow * y + 3 * x + (2 - c)];
}
}
}

input.close();
return new Image(pixels2.release(), width, height);
}



imageuploader.h file

Code
/* Permission is hereby granted, free of charge, to any person obtaining a copy
 * of this software and associated documentation files (the "Software"), to deal
 * in the Software without restriction, including without limitation the rights
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 * copies of the Software, and to permit persons to whom the Software is
 * furnished to do so, subject to the following conditions:
 *
 * The above notice and this permission notice shall be included in all copies
 * or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
 * SOFTWARE.
 */
/* File for "Textures" lesson of the OpenGL tutorial on
 * www.videotutorialsrock.com
 */

#ifndef IMAGE_LOADER_H_INCLUDED
#define IMAGE_LOADER_H_INCLUDED

//Represents an image
class Image {
public:
Image(char* ps, int w, int h);
~Image();

/* An array of the form (R1, G1, B1, R2, G2, B2, ...) indicating the
* color of each pixel in image.  Color components range from 0 to 255.
* The array starts the bottom-left pixel, then moves right to the end
* of the row, then moves up to the next column, and so on.  This is the
* format in which OpenGL likes images.
*/
char* pixels;
int width;
int height;
};

//Reads a bitmap image from file.
Image* loadBMP(const char* filename);

#endif

And I attached the ZIP file to this post that has the BMP file for this project in it. ALSO, you MUST follow my tutorial I made with the freeGlut to use this example. This involves freeGlut ( Free OpenGL Utility Library ). I had to fix this from the "http://www.videotutorialsrock.com" website.  Tutorial 5. His code was needing some altering on my part to get it to work with C::B. His 1st four tutorials work with no problem. But once I get to #5, where you have to bring in a texture, this is where running this inside the IDE causes a crash. The program is fine if I run it through windows like a normal program. But it crashes if I run it inside the IDE.

My freeGlut --> C::B installation tutorial :
http://wiki.codeblocks.org/index.php?title=Using_FreeGlut_with_Code::Blocks

EDIT : Important Note. Make sure you put the BMP into the folder that C::B compiles it to. Either the Debug and / or the Release folder.
EDIT 2 : I am on Windows 7 Ultimate with 64 Bit. Using Latest C::B ( 10.05 at time of writing this ). This error occurs whether I'm in Admin mode or not.

AGAIN, it compiles fine, it even runs great, OUTSIDE the IDE. But if I run it inside the IDE, the tutorial program crashes with a MSVCRT.DLL crash. Keep in mind, that DLL is a Version 7.0.7600.16385 DLL according to right clicking and viewing its info for that file ( Visual C++ File ). The C::B IDE is fine otherwise.

Jack
« Last Edit: December 04, 2011, 10:35:53 pm by JackDawson »

Offline Jenna

  • Administrator
  • Lives here!
  • *****
  • Posts: 7255
Re: Compilation Crash or C++ Problem ?
« Reply #1 on: December 04, 2011, 10:49:08 pm »
Just a guess:
your "Execution working dir" does not point to the output directory, where the executable is build.
In this case your code crashes, because it can not find the image, but does not check whether it could be loaded or not.

Offline JackDawson

  • Multiple posting newcomer
  • *
  • Posts: 37
Re: Compilation Crash or C++ Problem ?
« Reply #2 on: December 04, 2011, 11:24:10 pm »
Just a guess:
your "Execution working dir" does not point to the output directory, where the executable is build.
In this case your code crashes, because it can not find the image, but does not check whether it could be loaded or not.

It does this when your forced to choose a compiler like GNU GCC Compiler ( Although i'm using MingW because MingW never has ever shown up in the drop down list, but the GNU GCC uses the MingW compiler ) which is what I'm doing. It actually Forces you to show where the Debug and Release folders are located.

Is there some other options or folder options I am missing ?
« Last Edit: December 04, 2011, 11:27:18 pm by JackDawson »

Offline Jenna

  • Administrator
  • Lives here!
  • *****
  • Posts: 7255
Re: Compilation Crash or C++ Problem ?
« Reply #3 on: December 05, 2011, 06:25:13 am »
Just a guess:
your "Execution working dir" does not point to the output directory, where the executable is build.
In this case your code crashes, because it can not find the image, but does not check whether it could be loaded or not.

It does this when your forced to choose a compiler like GNU GCC Compiler ( Although i'm using MingW because MingW never has ever shown up in the drop down list, but the GNU GCC uses the MingW compiler ) which is what I'm doing. It actually Forces you to show where the Debug and Release folders are located.

Is there some other options or folder options I am missing ?

MinGW is the windows port of gcc, so there is no different compiler for it.
Check that the  "Execution working dir" in the Projects properties (tab "Build target") points to the same folder where the exe is build, by default this is the projects root-folder (".") !

Offline JackDawson

  • Multiple posting newcomer
  • *
  • Posts: 37
Re: Compilation Crash or C++ Problem ?
« Reply #4 on: December 05, 2011, 06:38:35 am »
Just a guess:
your "Execution working dir" does not point to the output directory, where the executable is build.
In this case your code crashes, because it can not find the image, but does not check whether it could be loaded or not.

It does this when your forced to choose a compiler like GNU GCC Compiler ( Although i'm using MingW because MingW never has ever shown up in the drop down list, but the GNU GCC uses the MingW compiler ) which is what I'm doing. It actually Forces you to show where the Debug and Release folders are located.

Is there some other options or folder options I am missing ?

MinGW is the windows port of gcc, so there is no different compiler for it.
Check that the  "Execution working dir" in the Projects properties (tab "Build target") points to the same folder where the exe is build, by default this is the projects root-folder (".") !

Yes, MinGW is the GCC port, I knew that part. Thank you though.

I am extremely happy you were able to point me in the right direction with this path issue though. What I'm confused about is why didn't it work when I set it up the first time. AND all the new projects setup this way by default and they all execute with no problem. Why did this one fail ?  However now that I think about it, if I ever needed to input a file, those programs failed as well. So I'll try this out and see what it does. This apparently is a paths issue and its not holding the path I set. Thank you for this though. BIG help here.

EDIT : Ok I went back over my other "FAILED" projects and they are working now. So what its doing is using the DEFAULT BIN folder that is in the MinGW subfolder. Well I have all my projects in my documents. So for some reason I never caught on to this fact. But now that I have, everything is working now. Thanks for this.

This thread can now be closed.
« Last Edit: December 05, 2011, 07:23:20 am by JackDawson »