IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C++ Discussion :

OpenGL probleme convertir?


Sujet :

C++

  1. #1
    Membre à l'essai
    Femme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Canada

    Informations forums :
    Inscription : Janvier 2011
    Messages : 26
    Points : 21
    Points
    21
    Par défaut OpenGL probleme convertir?
    Bonjour j'ai rencontrer un probleme lors de la lecture de mon livre de programmation et jaimerait me le faire expliquer et corriger s'il vous plait
    l'erreur est que le programme esset de convertir une chose que je ne comprend pas pourquoi il la convertit et pourtant j'ai suivit toutes les instruction du livre.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    #include <iostream>
    #include <fstream>
     
    #include"GL\glut.h"
     
    using namespace std;
     
    void LabyAffichage();
    void LabyRedim();
    void OuvrirNiveau(char* niveau);
    void LibererMemoire();
    void DessinerNiveau();
     
    char** Matrice = NULL;
    int NbColonnes = 10, NbLignes = 8;
     
     
    void main(void)
    {
    	OuvrirNiveau("niveau.txt");
     
     
    	glutInitWindowPosition(10,10);
    	glutInitWindowSize(500,500);
    	glutInitDisplayMode(GLUT_RGBA | GLUT_SINGLE);
    	glutCreateWindow("Labyrinthe");
    	glutDisplayFunc(LabyAffichage);
    	glutReshapeFunc(LabyRedim);
    	glutMainLoop();
     
    }
     
    void LabyAffichage()
    {
    	glClearColor(1.0, 1.0, 1.0, 1.0);
    	glClear(GL_COLOR_BUFFER_BIT);
    	glMatrixMode(GL_MODELVIEW);
     
    	DessinerNiveau();
     
    	glFlush();
    }
     
    void LabyRedim(int x, int y)
    {
    	glViewport(0, 0, x, y);
    	glMatrixMode(GL_PROJECTION);
    	glLoadIdentity();
    	gluOrtho2D(0.0, (double)NbColonnes, (double)NbLignes, 0.0);
    }
     
    void OuvrirNiveau(char* niveau)
    {
    	ifstream fichier;
    	fichier.open(niveau);
     
    	if(!fichier) 
    	{
    		cout<<"Erreur lors de l'ouverture du ficher!" << endl;
    		system("pause");
    		exit(1);
    	}
     
    	fichier>> NbColonnes;
    	fichier>> NbLignes;
     
    	Matrice = new char*[NbColonnes];
    	for(int i=0;i<NbColonnes; i++)
    	{Matrice[i] = new char[NbLignes];}
     
    	for(int i=0; i<NbColonnes; i++)
    		for(int j=0; j<NbLignes; j++)
    			Matrice[i][j] = '0';
     
    	for(int j=0; j<NbLignes; j++)
    		for(int i=0; i<NbLignes; i++)
    			fichier >> Matrice[i][j];
     
    	fichier.close();
    }
     
    void LibererMemoire()
    {
    	if(Matrice !=NULL)
    	{
    		for(int i=0; i<NbColonnes; i++)
    			delete [] Matrice[i];
    		delete [] Matrice;
    	}
    }
     
    void DessinerNiveau()
    {
    	glColor3d(0.5,0.5,0.5);
     
    	glBegin(GL_QUADS);
     
    	for(int i=0; i<NbColonnes; i++)
    		for(int j=0; j<NbLignes; j++)
    			if(Matrice[i][j] == '0')
    			{
    				glVertex2d(i,   j);
    				glVertex2d(i,   j+1);
    				glVertex2d(i+1, j+1);
    				glVertex2d(i+1, j);
    			}
    			glEnd();
    }
    L'erreur est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    1>------ Début de la génération*: Projet*: Labyrinthe, Configuration*: Debug Win32 ------
    1>  Main.cpp
    1>d:\c++\program visual c++\labyrinthe\labyrinthe\main.cpp(28): error C2664: 'glutReshapeFunc'*: impossible de convertir le paramètre 1 de 'void (__cdecl *)(void)' en 'void (__cdecl *)(int,int)'
    1>          Aucune fonction ayant ce nom dans la portée ne correspond au type de la cible
    ========== Génération*: 0 a réussi, 1 a échoué, 0 mis à jour, 0 a été ignoré ==========
    J'utilise le programme Microsoft Visual c++ 2010 express

    Merci d'avance

  2. #2
    Expert éminent sénior

    Avatar de dragonjoker59
    Homme Profil pro
    Software Developer
    Inscrit en
    Juin 2005
    Messages
    2 045
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Software Developer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2005
    Messages : 2 045
    Points : 11 368
    Points
    11 368
    Billets dans le blog
    10
    Par défaut
    En fait 'glutReshapeFunc' te permet d'associer une fonction que tu auras créée à l'évènement de redimensionnement de fenêtre.
    Cette fonction doit avoir une "tête" de fonction de traitement de redimensionnement. Donc là il veut une fonction ne retournant rien ('void') et prenant en paramètres 2 entiers (int, int), hors tu lui donnes une fonction ne retournant rien (jusque là ça va) mais ne prenant aucun paramètre (là ça va plus). Il faut donc que tu modifies ta fonction LabyRedim de façon à ce qu'elle prenne 2 entiers en paramètres (je t'aide : ce sont les nouvelles dimension de la fenêtre, largeur et hauteur).
    Si vous ne trouvez plus rien, cherchez autre chose...

    Vous trouverez ici des tutoriels OpenGL moderne.
    Mon moteur 3D: Castor 3D, presque utilisable (venez participer, il y a de la place)!
    Un projet qui ne sert à rien, mais qu'il est joli (des fois) : ProceduralGenerator (Génération procédurale d'images, et post-processing).

  3. #3
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Salut,
    Tu as oublié d'indiquer les arguments en début de ton fichier lorsque tu déclares la fonction de redimensionnement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    #include <iostream>
    #include <fstream>
     
    #include"GL\glut.h"
     
    using namespace std;
     
    void LabyAffichage();
    void LabyRedim();
    void OuvrirNiveau(char* niveau);
    void LibererMemoire();
    void DessinerNiveau();
    Du coup, lorsque plus bas tu fais appel à glutReshapeFunc, cette fonction ne connait que void LabyRedim(); qui a comme signature void (*)(void). Alors que l'argument attendu est de type void (*)(int,int). Ce qui provoque ton erreur.

    Solution : met en conformité ta déclaration avec la définition que tu souhaites :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    #include <iostream>
    #include <fstream>
     
    #include"GL\glut.h"
     
    using namespace std;
     
    void LabyAffichage();
    void LabyRedim(int,int);
    void OuvrirNiveau(char* niveau);
    void LibererMemoire();
    void DessinerNiveau();

  4. #4
    Membre à l'essai
    Femme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Canada

    Informations forums :
    Inscription : Janvier 2011
    Messages : 26
    Points : 21
    Points
    21
    Par défaut
    J'ai un dernier petit probleme ! tout fonctionne très bien à une exception près! Il ne me renvoit pas exactement ce que je lui demande?? Je lui demande un tableau 10X8 ce quil me fait mais on dirait qu'il ne tien pas en compte la 9e et 10e case a droite il arrete toujours a la 8e et change de ligne ce qui fait que le petit labyrinthe que jesset d'installer de fonctionne pas?

    Mon labyrinthe(dans le ficher niveau.txt):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    10
    8
    1111111101
    1000000101
    1000000101
    1000000101
    1000000101
    1000000101
    1000000101
    1111111101
    Ce qu'il me renvoit est quelque chose comme cela:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    1111111100
    0110000000
    0101100000
    0001011000
    0000010100
    1000000100
    0110000000
    0101100000
    (Les chiffres "0" sont les mur donc gris et les chiffre 1 sont les passages)

    Mon nouveau code est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    #include <iostream>
    #include <fstream>
     
    #include"GL\glut.h"
     
    using namespace std;
     
    void LabyAffichage();
    void LabyRedim(int x,int y);
    void OuvrirNiveau(char* niveau);
    void LibererMemoire();
    void DessinerNiveau();
     
     
    int NbLignes,NbColonnes;
    char** Matrice;
     
     
    int main(void)
    {
        NbColonnes=NbLignes=0;
        NbColonnes = 10;
        NbLignes = 8;
     
    	glutInitWindowPosition(10,10);
    	glutInitWindowSize(500,500);
    	glutInitDisplayMode(GLUT_RGBA | GLUT_SINGLE);
    	glutCreateWindow("Labyrinthe");
    	glutDisplayFunc(LabyAffichage);
    	glutReshapeFunc(LabyRedim);
     
    	OuvrirNiveau("niveau.txt");
     
            glutMainLoop();
     
    }
     
    void LabyAffichage()
    {
    	glClearColor(1.0, 1.0, 1.0, 1.0);
    	glClear(GL_COLOR_BUFFER_BIT);
    	glMatrixMode(GL_MODELVIEW);
     
    	DessinerNiveau();
     
    	glFlush();
    }
     
    void LabyRedim(int x,int y)
    {
    	glViewport(0, 0, x, y);
    	glMatrixMode(GL_PROJECTION);
    	glLoadIdentity();
    	gluOrtho2D(0.0, (double)NbColonnes, (double)NbLignes, 0.0);
    }
     
    void OuvrirNiveau(char* niveau)
    {
    	ifstream fichier;
    	fichier.open(niveau);
     
    	if(fichier==0) 
    	{
    		cout<<"Erreur lors de l'ouverture du ficher!" << endl;
    		system("pause");
    		exit(1);
    	}
     
    	fichier>> NbColonnes;
    	fichier>> NbLignes;	
     
    	Matrice = new char*[NbColonnes];
    	for(int i=0;i<NbColonnes; i++)
    	Matrice[i] = new char[NbLignes];
     
    	for(int i=0; i<NbColonnes; i++)
    		for(int j=0; j<NbLignes; j++)
    			Matrice[i][j] = '0';
     
    	for(int j=0; j<NbLignes; j++)
    		for(int i=0; i<NbLignes; i++)
    			fichier >> Matrice[i][j];
     
    	fichier.close();
    }
     
    void LibererMemoire()
    {
    	if(Matrice !=NULL)
    	{
    		for(int i=0; i<NbColonnes; i++)
    			delete [] Matrice[i];
    		delete [] Matrice;
    	}
    }
     
    void DessinerNiveau()
    {
    	glColor3d(0.5,0.5,0.5);
     
    	glBegin(GL_QUADS);
     
    	for(int i=0; i<NbColonnes; i++)
    		for(int j=0; j<NbLignes; j++)
    			if(Matrice[i][j] == '0')
    			{
    				glVertex2d(i,   j);
    				glVertex2d(i,   j+1);
    				glVertex2d(i+1, j+1);
    				glVertex2d(i+1, j);
    			}
    			glEnd();
    }
    Aucune erreurs de compilation ne ce produit. J'ai esseyer de le résoudre par moi même durant un bon 3 heure de recherche intensive je n'ai pas réussit a trouver le problème. Si vous vouler bien voir le probleme enlever les 2 derniere colonnes des 10 et recréé les 8 colones avec les chiffres restant(simplement en tous les décalants .
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    ligne 1.   11111111   00
    ligne 2.   01100000   00
    ligne 3.   01011000   00
    ligne 4.   00010110   00
    ligne 5.   00000101   00
    ligne 6.   10000001   00
    ligne 7.   01100000   00
    ligne 8.   01011000   00
     
    //regarder le code désormait.
    ligne 1.   1111111101
    ligne 2.   1000000101
    ligne 3.   1000000101
    ligne 4.   1000000101
    ligne 5.   1000000101
    ligne 6.   1000000101
    ligne 7.   1000
    ligne 8.   
    //calculer et vous trouver quil manque 16 lettres et donc les 16 "0" qui sont a
    //droite pas rapport alors que le code est normal
    Somme tout on dirait que les 2 derniers chiffre "00" se sont inventer d'eux meme?

    Merci de votre aide auparavant
    et Merci d'avance pour cette question car je commence le openGL alors mes question peuvent vous sembler assez facile...

  5. #5
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Salut,
    Au premier coup d'oeil, je dirais que le problème vient de là :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    for(int j=0; j<NbLignes; j++)
       for(int i=0; i<NbLignes; i++)
          fichier >> Matrice[i][j];
    Remplacer NbColonnes en NbLignes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    for(int j=0; j<NbColonnes; j++)
       for(int i=0; i<NbLignes; i++)
          fichier >> Matrice[i][j];

    C'est surprenant au début car NbColonnes représente en fait le nombre de ligne de ta matrice et NbLignes celui des colonnes


    Je te conseille vivement de t'intéresser au std::string pour tes chaînes de caractères, au std::vector pour tes tableaux et d'oublier les allocations dynamiques (new/delete).

  6. #6
    Membre à l'essai
    Femme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Canada

    Informations forums :
    Inscription : Janvier 2011
    Messages : 26
    Points : 21
    Points
    21
    Par défaut
    Cela a problablement aider mais le probleme persiste. J,ai esseyer de nouvelle tentative et jai réaliser que si je fait un carré(peu importe sa grandeur) tout est parfait, aucune erreur ne surviens. Par exemple :10X10, 8X8, etc. Mais le probleme apparait seulement lorsque jesset de faire :10X8, 6X4, etc. En vrai quel
    que chose qui ne soit pas un carrée Alors je ne comprend plus très bien car les code ont lair d'être bon? Ce pourrait t'il que ce soit une erreur dans le double pointeur ou quelque chose comme cela? Lors que l'enregistrement des donner?

    Je te conseille vivement de t'intéresser au std::string pour tes chaînes de caractères, au std::vector pour tes tableaux et d'oublier les allocations dynamiques (new/delete).
    Je suis entrain de suivre un tutoriel d'un livre c++ "Le guide complet" alors ce n'est pas moi... J'esset d'apprendre le C++ et le openGL et je suis comment dire TRÈS nouveau dans cette matière...

    Merci davance

  7. #7
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Citation Envoyé par koliter Voir le message
    Cela a problablement aider mais le probleme persiste. J,ai esseyer de nouvelle tentative et jai réaliser que si je fait un carré(peu importe sa grandeur) tout est parfait, aucune erreur ne surviens. Par exemple :10X10, 8X8, etc. Mais le probleme apparait seulement lorsque jesset de faire :10X8, 6X4, etc. En vrai quel
    que chose qui ne soit pas un carrée Alors je ne comprend plus très bien car les code ont lair d'être bon? Ce pourrait t'il que ce soit une erreur dans le double pointeur ou quelque chose comme cela? Lors que l'enregistrement des donner?
    C'est bien ce qu'il me semblait. Il y a une embrouille dans l'utilisation de NbLignes et NbColonnes. Dans une matrice telle que tu l'utilises, les indices sont matrice[IndiceLigne][IndiceColonne]. Donc ton code, devrait ressembler à :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
       fichier>> NbColonnes;
    	fichier>> NbLignes;
     
    	Matrice = new char*[NbLignes];
    	for(int i=0;i<NbLignes; i++)
            Matrice[i] = new char[NbColonnes];
     
    	for(int i=0; i<NbLignes; i++)
    		for(int j=0; j<NbColonnes; j++)
    			Matrice[i][j] = '0';
     
    	for(int i=0; i<NbLignes; i++)
    		for(int j=0; j<NbColonnes; j++)
    			fichier >> Matrice[i][j];
    Citation Envoyé par koliter Voir le message
    Je suis entrain de suivre un tutoriel d'un livre c++ "Le guide complet" alors ce n'est pas moi... J'esset d'apprendre le C++ et le openGL et je suis comment dire TRÈS nouveau dans cette matière...
    Si ton livre prétend t'apprendre le C++ et commence par te faire apprendre les tableaux dynamiques a lieu des std::vector et utilises les char* pour chaine de caractère, alors change le Il n'est probablement pas un bon livre de C++

  8. #8
    Membre à l'essai
    Femme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Canada

    Informations forums :
    Inscription : Janvier 2011
    Messages : 26
    Points : 21
    Points
    21
    Par défaut
    Merci beaucoup

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Qt Opengl] Probleme d'affichage
    Par .:dev:. dans le forum OpenGL
    Réponses: 4
    Dernier message: 28/11/2007, 11h59
  2. Probleme Convertir Case en decode
    Par moulery dans le forum SQL
    Réponses: 4
    Dernier message: 28/02/2007, 16h55
  3. opengl : probleme vecteur local a un objet
    Par lanael dans le forum OpenGL
    Réponses: 3
    Dernier message: 02/01/2007, 18h36
  4. Réponses: 1
    Dernier message: 13/11/2006, 18h37
  5. Réponses: 4
    Dernier message: 31/03/2005, 10h33

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo