Was ich tun muss, ist ein Bild mit einer .ptm-Datei anzuzeigen.glutSwapBuffers "Zugriffsverletzung lesen Ort 0x0000000004C0F000"
Also, ich öffne die Datei, lesen Sie die W und H und setzen Sie die RGBA zu jedem Pixel. Aber wenn ich versuche, anzuzeigen, erhalte ich einen Zugriffsverletzungsfehler bei glutSwapBuffers()
.
Hier ist der Code. Es ist irgendwie ein Chaos, weil ich viele verschiedenen Dinge, ich versuche, es zu beheben, aber ich fange an zu glauben, dass jedes Mal, wenn ich ein neues Problem schaffen: D
Image.h
class Image {
public:
Image() {};
Image(int w, int h);
~Image();
void setPixel(int rgb, int x, int y) {
pixels[x + y] = rgb;
}
int setRgb(int r, int g, int b);
int setRgb(int r, int g, int b, int a);
int getPixel(int x, int y) {
return pixels[x + y*width];
}
int * getPixel() { return pixels; }
int getWidth() { return width; }
int getHeight() { return height; }
private:
int *pixels;
int width, height;
};
Image.cpp
#include "Image.h"
#include <stdlib.h>
Image::Image(int w, int h)
{
width = w; height = h;
pixels = (int*)malloc(h*w);
}
Image::~Image()
{
}
int Image::setRgb(int r, int g, int b)
{
int rgb;
rgb = (r << 16) | (g << 8) | b;
return rgb;
}
int Image::setRgb(int r, int g, int b, int a)
{
int rgba;
rgba = (a<< 24) | (r << 16) | (g << 8) | b;
return rgba;
}
source.cpp
#include <GL\freeglut.h>
#include <GL\GL.h>
#include <iostream>
#include <fstream>
#include <string>
#include <Windows.h>
#include "Image.h"
using namespace std;
void display()
{
glClear(GL_COLOR_BUFFER_BIT);
Image *img = new Image(800, 500);
int w, h, max; //width height MaxValue
char *w_ = new char; //in case of the file doesn't have a comment
string fileModel, comment;
ifstream myfile("dba.ptm"); //open the file
if (myfile.is_open())
{
myfile >> fileModel;
if (fileModel == "P7")
{
myfile >> w_;
if (*w_ == '#')
getline(myfile, comment);
else
w = atoi(w_);
myfile >> h;
int a, r, g, b, rgba;
myfile >> max;
for (int i = 0; i < w; i++)
{
for (int k = 0; k < h; k++)
{
myfile >> a;
myfile >> r;
myfile >> g;
myfile >> b;
rgba = img->setRgb(r, g, b, a);
img->setPixel(rgba, i, k);
}
}
}
}
myfile.close();
glDrawPixels(img->getWidth(), img->getHeight(), GL_BGRA_EXT, GL_UNSIGNED_BYTE, img->getPixel());
glutSwapBuffers();
}
void init(void)
{
glClearColor(0.0, 0.0, 0.0, 0.0);
glShadeModel(GL_FLAT);
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(0.0, 800.0, 0.0, 500.0, -1.0, 1.0);
}
int main(int argc, char** argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA);
glutInitWindowSize(800, 500);
glutInitWindowPosition(100, 100);
glutCreateWindow("PTM");
init();
glutDisplayFunc(display);
glutMainLoop();
return 0;
}
Warum verwenden Sie 'malloc()' in einem C++ Programm? – drescherjm