2016-04-27 3 views
2

Ce que je dois faire est d'afficher une image en utilisant un fichier .ptm. Donc, j'ouvre le fichier, lis le W et le H et règle le RGBA sur chaque pixel. Mais quand j'essaye d'afficher je reçois une erreur de violation d'accès au glutSwapBuffers().glutSwapBuffers "Emplacement de lecture de violation d'accès 0x0000000004C0F000"

Voici le code. Il est un peu un gâchis parce que j'essaie beaucoup de choses différentes pour le corriger, mais je commence à penser que chaque fois que je crée un nouveau problème: 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

Pourquoi utilisez-vous 'malloc()' dans un programme C++? – drescherjm

Répondre

2

malloc(h*w) devrait être malloc(h*w*sizeof(int)), d'autres Sachez que vous allouez seulement assez de mémoire pour un quart de votre image.

Vous semblez également fuir l'image entière à chaque image, ce qui épuisera rapidement votre RAM disponible. Vous devez free et delete tout ce que vous malloc et new, respectivement.

Vous souhaitez également effacer immédiatement la mémoire que vous allouez à votre image pour éviter les problèmes lorsque seuls certains pixels sont définis (le reste sera des valeurs aléatoires, ce qui est probablement moins préférable que par exemple une transparence complète). Vous pouvez le faire avec un memset ou std::fill après le malloc.

3

Désolé, mais vous avez beaucoup de mal ... :)

  • Vous utilisez malloc au lieu de new[]
  • Vous ne free ou quoi que ce soit delete
  • Dans la plupart des cas (sauf pixels) vous n'avez pas besoin de créer des choses sur le tas de toute façon
  • .. absolument ne pas faire ce que vous pensez qu'il fait, ou ce que vous voulez qu'il fasse.

Il y a probablement plus. :(