2016-04-27 16 views
2

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; 
} 
+1

Warum verwenden Sie 'malloc()' in einem C++ Programm? – drescherjm

Antwort

2

malloc(h*w) sollte malloc(h*w*sizeof(int)), andere sein Sie reservieren nur für ein Viertel Ihres Bildes genügend Speicher.

Sie scheinen auch das gesamte Bild bei jedem einzelnen Bild zu verlieren, wodurch der verfügbare RAM schnell erschöpft wird. Sie müssen free und delete alles, was Sie malloc bzw. new sind.

Sie möchten wahrscheinlich auch den Speicher, den Sie für Ihr Bild zuweisen, sofort löschen, um Probleme zu vermeiden, bei denen nur einige der Pixel gesetzt sind (der Rest sind zufällige Werte, was wahrscheinlich weniger vorzuziehen ist als beispielsweise volle Transparenz). Sie können dies mit einem memset oder std::fill nach dem malloc tun.

3

Sorry, aber Sie haben viel falsch ... :)

  • Sie verwenden malloc statt new[]
  • Sie nie free oder delete etwas
  • In den meisten Fällen (abgesehen von pixels) Sie müssen sowieso keine Dinge auf dem Haufen erstellen
  • ist diese pixels[x + y] = rgb; offensichtlich falsch: char *w_ = new char; //in case of the file doesn't have a comment myfile >> w_; if (*w_ == '#') .. absolut nicht tun, was Sie denken, dass es tut, oder was Sie wollen, dass es tut.

Es gibt wahrscheinlich mehr. :(