2009-02-26 4 views
1

D'accord. J'ai donc voulu utiliser un fichier écrit en c en C++. J'ai couru le code en c et n'ai absolument aucun problème.Problème concernant OpenGL et le processus de conversion de C en C++

Comme je ne sais pas c, j'ai travaillé avec un logiciel de conversion pendant un certain temps, mais il n'a pas été efficace (devinant le format de codage n'a pas été dans le style dont il avait besoin). J'ai décidé de l'essayer moi-même et il me semblait que tout ce que je devais faire était de changer quelques déclarations de malloc en de nouvelles déclarations et de remplacer gratuitement par delete. J'ai donc lancé le programme et il semble que la plupart des fonctions fonctionnent bien, mais celle-ci me pose problème.

Quand je suis en train de mettre à jour l'affichage d'une nouvelle image (je lis les données d'image TIFF et l'afficher sur l'écran), je rencontre des problèmes dans ces déclarations particulières:

glutReshapeWindow(ImageWidth,ImageLength); 
glClear(GL_COLOR_BUFFER_BIT);//these 
glRasterPos2i(0, 0);//three 
glDrawPixels(ImageWidth, ImageLength, GL_RGB, 
    GL_UNSIGNED_BYTE, ImageData);//statements are the ones giving me the error 

I inclus la première déclaration dans le codeblock pour montrer qu'il ne fait exploser immédiatement aucune sorte d'appel OpenGl.

Je continue à obtenir des erreurs le long des lignes de

Cannot access memory at address 0xfbad248c 
Cannot access memory at address 0xfbad248c 
Cannot access memory at address 0xaabbeeaa 

Je sais que cela pourrait être une sorte de vague, mais ce pourrait être des sources communes de cette erreur? Cela a fonctionné en c, qu'est-ce qui a pu causer cette erreur dans le passage rapide en C++?

Merci et laissez-moi savoir si vous avez besoin de plus d'informations.


D'accord, donc je ne suis pas vraiment en utilisant la bibliothèque standard OpenGL je crois (ce qui est pour une classe et on m'a donné les fichiers de la bibliothèque par un instructeur). J'ai le code

#include <GL/glut.h> 

en tant que #include. Ces bibliothèques sont exactement les mêmes que celles trouvées dans le fichier c car je les ai simplement copiées et collées dans mon projet C++. (J'ai aussi travaillé avec eux de manière limitée dans un autre projet C++). Juste au cas où, j'ai vérifié mon système de fichiers pour les fichiers "OPENGL32.DLL" et "GLU32.DLL" et ne les ai pas trouvés.

Je devrais probablement inclure ces détails supplémentaires:

Une méthode init() est appelée au début du programme avant que la boucle d'entrée réelle est appelée:

void 
init(void) 
{ 
    glClearColor (0.0, 0.0, 0.0, 0.0); 
    glShadeModel(GL_FLAT); 
    makeCheckImage(); 
    glPixelStorei(GL_UNPACK_ALIGNMENT, 1); 
} 

Cette méthode semble fonctionner très bien (un motif en damier simple est créé peu de temps après cet appel de fonction). Je ne suis pas sûr de quel type de fichiers OpenGL ils appartiennent ("OPENGL32.DLL" ou "GLU32.DLL") mais j'espère que cela peut réduire le problème un peu. En ce qui concerne la ligne ImageData, je ne crois pas que l'objet ImageData soit corrompu ou quelque chose du genre, à cause de certaines des raisons dont vous parliez et le fait que le code dans le tout premier bloc de code que j'ai posté (la source d'erreurs) est dans un autre bloc en tant que tel:

if (ImageData == NULL) {/*code*/} 
else{/*this is where the error code is*/} 

Je peux poster des infos sur les makefiles si vous pensez qu'il serait utile (juste ne veulent pas encombrer ce fil avec l'étoffe si elle est ne pas).

Répondre

1

La première déclaration qui ne donne pas une erreur est une commande de Glu32.dll, les autres devraient être des commandes Opengl32.dll. Vérifiez si vous avez correctement lié les bibliothèques et essayez de copier les DLL dans le répertoire du programme.La dernière ligne pourrait aussi être une erreur avec votre ImageData, mais puisque vous avez dit que ça fonctionnait en C et que vous avez seulement remplacé malloc/free par new/delete, il est peu probable que quelque chose ne marche pas, de toute façon vous devriez vérifier ceci, aussi. Une possibilité serait de lire l'ensemble du tableau ImageData sans un appel OpenGL impliqué. En passant, j'espère que ImageLength n'est pas la longueur du fichier image complet, mais la hauteur de l'image.

EDIT: OK, il semble donc être un peu différent. La fonction init que vous avez publiée semble accéder à d'autres fonctions de gl ..., de sorte que vos bibliothèques fonctionnent d'une manière ou d'une autre. En passant, il est intéressant que vous ne puissiez pas trouver les DLL. Ils sont généralement stockés dans le chemin Windows \ System32. "If (ImageData == NULL)" est une première étape, mais vous devriez aussi essayer de lire toutes les entrées ImageWidth * ImageLength à des fins de débogage, peut-être que vous avez alloué le mauvais nombre d'octets.

Une autre raison de l'incident est peut-être que les fichiers d'en-tête que vous utilisez ne sont pas à jour et ne sont pas compatibles avec vos appels ou les DLL.

Si tout ceci ne résout pas votre problème, il serait utile de poster le fichier makefile.

+0

J'ai répondu avec une modification. – Chad

+0

"mauvais nombre d'octets" C'est exactement ça. Assez embarrassant. J'apprécie énormément l'aide; J'aurais couru dans les cercles pour Dieu sait combien de temps à travers les erreurs archivées OpenGL. – Chad

2

Je ne sais pas comment vous êtes expérimenté avec les différences entre C et C++, donc je ne veux pas te fréquenter, mais sa vaut le coup:

Avez-vous utilisé

unsigned char* data = new unsigned char[size]; //correct 
//.... 
delete[] data; 

(allocation de réseau) ou

unsigned char* data new unsigned char(size); //wrong 
//.... 
delete data; 

(allouer un seul charbon ayant une taille de valeur)

pour vos données d'image?